protected void handleInternal()

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));
    }