private void handlePutManagerClosed(BlobProperties blobProperties, boolean stitchOperation,
      FutureResult<String> futureResult, Callback<String> callback) {
    RouterException routerException =
        new RouterException("Cannot accept operation because Router is closed", RouterErrorCode.RouterClosed);
    routerMetrics.operationDequeuingRate.mark();
    routerMetrics.onPutBlobError(routerException, blobProperties.isEncrypted(), stitchOperation);
    nonBlockingRouter.completeOperation(futureResult, callback, null, routerException);
    // Close so that any existing operations are also disposed off.
    nonBlockingRouter.close();
  }
To be called if a put/stitch call is made while {@link PutManager} is closed. It will complete the operation
with an exception and close the router.
@param blobProperties the {@link BlobProperties} for the put call.
@param stitchOperation {@code true} if this is a stitch operation.
@param futureResult A future to be completed by this method
@param callback The {@link Callback} which will be invoked by this method.
ambry-router/src/main/java/com/github/ambry/router/OperationController.java