in encryption/src/main/java/org/apache/solr/encryption/EncryptionRequestHandler.java [162:237]
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
long startTimeMs = System.currentTimeMillis();
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;
}
boolean success = false;
String encryptionState = STATE_PENDING;
try {
SegmentInfos segmentInfos = readLatestCommit(req.getCore());
if (segmentInfos.size() == 0) {
commitEmptyIndexForEncryption(keyId, segmentInfos, req);
encryptionState = 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);
if (encryptionComplete) {
commitEncryptionComplete(keyId, segmentInfos, req);
}
} else {
encryptionComplete = true;
}
}
if (encryptionComplete) {
encryptionState = 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);
encryptionState = STATE_PENDING;
success = true;
} else {
log.debug("core busy encrypting for keyId={} different than requested keyId={}", pendingKeyId.keyId, keyId);
encryptionState = STATE_BUSY;
}
return;
}
pendingEncryptions.put(req.getCore().getName(), new PendingKeyId(keyId));
}
try {
commitEncryptionStart(keyId, segmentInfos, req);
encryptAsync(req, startTimeMs);
success = true;
} finally {
if (!success) {
synchronized (pendingEncryptionLock) {
pendingEncryptions.remove(req.getCore().getName());
}
}
}
} finally {
if (success) {
rsp.add(STATUS, STATUS_SUCCESS);
} else {
rsp.add(STATUS, STATUS_FAILURE);
}
log.debug("responding encryption state={} success={} for keyId={}", encryptionState, success, keyId);
rsp.add(ENCRYPTION_STATE, encryptionState);
}
}