in bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListUnderReplicatedLedgerService.java [65:148]
public HttpServiceResponse handle(HttpServiceRequest request) throws Exception {
HttpServiceResponse response = new HttpServiceResponse();
// parameter as this: ?missingreplica=<bookie_address>&excludingmissingreplica=<bookid_address>
Map<String, String> params = request.getParams();
if (HttpServer.Method.GET == request.getMethod()) {
final String includingBookieId;
final String excludingBookieId;
boolean printMissingReplica = false;
if (params != null && params.containsKey("missingreplica")) {
includingBookieId = params.get("missingreplica");
} else {
includingBookieId = null;
}
if (params != null && params.containsKey("excludingmissingreplica")) {
excludingBookieId = params.get("excludingmissingreplica");
} else {
excludingBookieId = null;
}
if (params != null && params.containsKey("printmissingreplica")) {
printMissingReplica = true;
}
Predicate<List<String>> predicate = null;
if (!StringUtils.isBlank(includingBookieId) && !StringUtils.isBlank(excludingBookieId)) {
predicate = replicasList -> (replicasList.contains(includingBookieId)
&& !replicasList.contains(excludingBookieId));
} else if (!StringUtils.isBlank(includingBookieId)) {
predicate = replicasList -> replicasList.contains(includingBookieId);
} else if (!StringUtils.isBlank(excludingBookieId)) {
predicate = replicasList -> !replicasList.contains(excludingBookieId);
}
try {
boolean hasURLedgers = false;
List<Long> outputLedgers = null;
Map<Long, List<String>> outputLedgersWithMissingReplica = null;
LedgerUnderreplicationManager underreplicationManager =
ledgerManagerFactory.newLedgerUnderreplicationManager();
Iterator<UnderreplicatedLedger> iter = underreplicationManager.listLedgersToRereplicate(predicate);
hasURLedgers = iter.hasNext();
if (hasURLedgers) {
if (printMissingReplica) {
outputLedgersWithMissingReplica = new LinkedHashMap<Long, List<String>>();
} else {
outputLedgers = Lists.newArrayList();
}
}
while (iter.hasNext()) {
if (printMissingReplica) {
UnderreplicatedLedger underreplicatedLedger = iter.next();
outputLedgersWithMissingReplica.put(underreplicatedLedger.getLedgerId(),
underreplicatedLedger.getReplicaList());
} else {
outputLedgers.add(iter.next().getLedgerId());
}
}
if (!hasURLedgers) {
response.setCode(HttpServer.StatusCode.NOT_FOUND);
response.setBody("No under replicated ledgers found");
return response;
} else {
response.setCode(HttpServer.StatusCode.OK);
String jsonResponse = JsonUtil
.toJson(printMissingReplica ? outputLedgersWithMissingReplica : outputLedgers);
if (LOG.isDebugEnabled()) {
LOG.debug("output body: " + jsonResponse);
}
response.setBody(jsonResponse);
return response;
}
} catch (Exception e) {
LOG.error("Exception occurred while listing under replicated ledgers", e);
response.setCode(HttpServer.StatusCode.NOT_FOUND);
response.setBody("Exception when get." + e.getMessage());
return response;
}
} else {
response.setCode(HttpServer.StatusCode.NOT_FOUND);
response.setBody("Not found method. Should be GET method");
return response;
}
}