void startOperation() {
    if (operationCompleted) {
      // The operation has already completed before start, which means there are some invalid input arguments.
      return;
    }
    Exception exception = null;
    try {
      if (options.isChunkUpload() && options.getMaxUploadSize() > routerConfig.routerMaxPutChunkSizeBytes) {
        exception = new RouterException("Invalid max upload size for chunk upload: " + options.getMaxUploadSize(),
            RouterErrorCode.InvalidPutArgument);
      } else if (isStitchOperation()) {
        processChunksToStitch();
      } else {
        startReadingFromChannel();
      }
    } catch (Exception e) {
      exception = e;
    } finally {
      if (exception != null) {
        setOperationExceptionAndComplete(exception);
        routerCallback.onPollReady();
      }
    }
  }
Either start reading from the channel containing the blob data for normal put requests or assemble the metadata
chunk for stitch requests.
ambry-router/src/main/java/com/github/ambry/router/PutOperation.java