in encryption/src/main/java/org/apache/solr/encryption/EncryptionRequestHandler.java [260:345]
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
long startTimeNs = getTimeSource().getTimeNs();
String keyId = req.getParams().get(PARAM_KEY_ID);
if (keyId == null || keyId.isEmpty()) {
rsp.add(STATUS, STATUS_FAILURE);
throw new IOException("Parameter " + PARAM_KEY_ID + " must be present and not empty."
+ " Use [" + PARAM_KEY_ID + "=\"" + NO_KEY_ID + "\"] for explicit decryption.");
} else if (keyId.equals(NO_KEY_ID)) {
keyId = null;
}
// Check the defined DirectoryFactory instance.
EncryptionDirectoryFactory.getFactory(req.getCore());
if (req.getParams().getBool(DISTRIB, false)) {
distributeRequest(req, rsp, keyId, startTimeNs);
return;
}
log.debug("Encrypt request for keyId={}", keyId);
boolean success = false;
State state = State.PENDING;
try {
SegmentInfos segmentInfos = readLatestCommit(req.getCore());
if (segmentInfos.size() == 0) {
commitEmptyIndexForEncryption(keyId, segmentInfos, req, rsp);
state = State.COMPLETE;
success = true;
return;
}
boolean encryptionComplete = false;
if (isCommitActiveKeyId(keyId, segmentInfos)) {
log.debug("Provided keyId={} is the current active key id", keyId);
if (Boolean.parseBoolean(segmentInfos.getUserData().get(COMMIT_ENCRYPTION_PENDING))) {
encryptionComplete = areAllSegmentsEncryptedWithKeyId(keyId, req.getCore(), segmentInfos)
&& areAllLogsEncryptedWithKeyId(keyId, req.getCore(), segmentInfos);
if (encryptionComplete) {
commitEncryptionComplete(keyId, segmentInfos, req);
}
} else {
encryptionComplete = true;
}
}
if (encryptionComplete) {
state = State.COMPLETE;
success = true;
return;
}
synchronized (pendingEncryptionLock) {
PendingKeyId pendingKeyId = pendingEncryptions.get(req.getCore().getName());
if (pendingKeyId != null) {
if (Objects.equals(pendingKeyId.keyId, keyId)) {
log.debug("Ongoing encryption for keyId={}", keyId);
success = true;
} else {
log.debug("Core busy encrypting for keyId={} different than requested keyId={}",
pendingKeyId.keyId, keyId);
state = State.BUSY;
}
return;
}
pendingEncryptions.put(req.getCore().getName(), new PendingKeyId(keyId));
}
try {
commitEncryptionStart(keyId, segmentInfos, req, rsp);
encryptAsync(req);
success = true;
} finally {
if (!success) {
synchronized (pendingEncryptionLock) {
pendingEncryptions.remove(req.getCore().getName());
}
}
}
} finally {
String statusValue = success ? STATUS_SUCCESS : STATUS_FAILURE;
rsp.add(STATUS, statusValue);
rsp.addToLog(STATUS, statusValue);
rsp.add(ENCRYPTION_STATE, state.value);
rsp.addToLog(ENCRYPTION_STATE, state.value);
log.info("Responding encryption state={} success={} for keyId={} timeMs={}",
state.value, success, keyId, toMs(elapsedTimeNs(startTimeNs)));
}
}