theonedev/onedev · error · ExplicitException
Impossible to provide required number of reviewers (candidat
Error message
Impossible to provide required number of reviewers (candidates: %s, required number of reviewers: %d, pull request: #%d)
What it means
During PR creation, OneDev tries to auto-assign the required number of reviewers from the candidate set. If requiredCount exceeds the number of available reviewers it cannot satisfy the review requirement and throws an ExplicitException naming the candidates, required count, and PR number.
Source
Thrown at server-core/src/main/java/io/onedev/server/service/impl/DefaultPullRequestService.java:983
public int compare(PullRequestReview o1, PullRequestReview o2) {
return o1.getStatusDate().compareTo(o2.getStatusDate());
}
});
for (PullRequestReview review: reviews) {
if (users.contains(review.getUser()) && review.getStatus() == PullRequestReview.Status.EXCLUDED) {
reviewers.add(review.getUser());
review.setStatus(PullRequestReview.Status.PENDING);
if (reviewers.size() == requiredCount)
break;
}
}
}
if (requiredCount > reviewers.size()) {
String errorMessage = String.format("Impossible to provide required number of reviewers "
+ "(candidates: %s, required number of reviewers: %d, pull request: #%d)",
reviewers, requiredCount, request.getNumber());
throw new ExplicitException(errorMessage);
}
}
private Predicate[] getPredicates(Subject subject, Project targetProject, @Nullable Criteria<PullRequest> criteria,
CriteriaQuery<?> query, From<PullRequest, PullRequest> from, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if (targetProject != null) {
predicates.add(builder.equal(from.get(PullRequest.PROP_TARGET_PROJECT), targetProject));
} else if (!SecurityUtils.isAdministrator(subject)) {
Collection<Project> projects = SecurityUtils.getAuthorizedProjects(subject, new ReadCode());
if (!projects.isEmpty()) {
Path<Long> projectIdPath = from.get(PullRequest.PROP_TARGET_PROJECT).get(Project.PROP_ID);
predicates.add(Criteria.forManyValues(builder, projectIdPath,
projects.stream().map(it->it.getId()).collect(Collectors.toSet()),
projectService.getIds()));
} else {
predicates.add(builder.disjunction());
}View on GitHub (pinned to d44925c47c)
Solutions
- Lower the required number of reviewers in the project's pull request review settings to <= number of eligible candidates
- Add more users with appropriate permissions/roles to the project so they qualify as candidates
- Check candidate filters (the PR author is excluded; eligibility rules in the review requirement) and adjust
- Use a group/specification for candidates that actually matches existing project members
Example fix
// before (project config) "requiredReviewers": 3, // only 1 eligible user on project // after "requiredReviewers": 1, // or add more eligible project members
Defensive patterns
Strategy: try-catch
Validate before calling
int eligible = countEligibleReviewers(project, pullRequestAuthor);
int required = reviewRequirement.getRequiredReviewers();
if (required > eligible)
throw new ConfigurationException("Lower required reviewers or add eligible members (have " + eligible + ")"); Try / catch
try {
pullRequestService.open(request);
} catch (ExplicitException e) {
if (e.getMessage().startsWith("Impossible to provide required number of reviewers"))
notifyAdminToFixReviewConfig(e.getMessage());
else throw e;
} Prevention
- Keep required-reviewer count <= number of project members eligible to review
- Remember the PR author is excluded from candidates
- Audit review requirement settings after team changes
When it happens
Trigger: Opening a pull request whose branch protection / review requirement demands N reviewers, but the eligible reviewer candidate list (after project roles, author exclusion, availability filters) contains fewer than N people.
Common situations: Small teams or personal projects where required-reviewers > team size; review job configured with required count 2 but only one eligible user on the project; candidates filtered out because they are the PR author or lack read permission.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- Link spec not found: ${linkName}
- Reviewer not found:
- Pull request submitter cannot be reviewer
- Assignee not found:
- No permission to read code of source project:
AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06).
Data as JSON: /api/errors/6b120cbc9ee3c597.
Report an issue: GitHub.