in server/src/main/java/org/apache/cassandra/sidecar/handlers/restore/CreateRestoreSliceHandler.java [85:138]
protected void handleInternal(RoutingContext context,
HttpServerRequest httpRequest,
@NotNull String host,
SocketAddress remoteAddress,
CreateSliceRequestPayload request)
{
InstanceMetadata instance = metadataFetcher.instance(host);
RoutingContextUtils
.getAsFuture(context, SC_RESTORE_JOB)
.map(restoreJob -> {
// the job is either aborted or succeeded
if (restoreJob.status.isFinal())
{
logger.debug("The job has completed already. job={}", restoreJob);
// prevent creating slice, since the job is already in the final state
String errMsg = "Job is already in final state: " + restoreJob.status;
throw wrapHttpException(HttpResponseStatus.CONFLICT, errMsg);
}
return restoreJob;
})
.compose(restoreJob -> RoutingContextUtils.getAsFuture(context, SC_QUALIFIED_TABLE_NAME).map(tableName -> {
RestoreSlice slice = RestoreSlice
.builder()
.jobId(restoreJob.jobId)
.qualifiedTableName(tableName)
.createSliceRequestPayload(request)
.build();
return new RestoreSliceAndJob(slice, restoreJob);
}))
.compose(sliceAndJob -> {
// Send response back if all are good, and
// it should catch whatever exception and handle at onFailure
RestoreSlice slice = sliceAndJob.restoreSlice;
RestoreJob job = sliceAndJob.restoreJob;
if (job.isManagedBySidecar())
{
createSliceForSidecarManagedJob(context, slice);
}
else
{
createOrPollRangeForSparkManagedJob(context, instance, job, slice);
}
return Future.succeededFuture();
})
.onSuccess(nothing -> { // verify that the response should be ended if no error is thrown from prior steps
if (!context.response().ended())
{
logger.warn("The response should have been ended on the absence of error, but not.");
context.fail(HttpResponseStatus.INTERNAL_SERVER_ERROR.code());
}
})
.onFailure(cause -> processFailure(cause, context, host, remoteAddress, request));
}