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

  1. Lower the required number of reviewers in the project's pull request review settings to <= number of eligible candidates
  2. Add more users with appropriate permissions/roles to the project so they qualify as candidates
  3. Check candidate filters (the PR author is excluded; eligibility rules in the review requirement) and adjust
  4. 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

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


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/6b120cbc9ee3c597. Report an issue: GitHub.