private String resolveReservedMetadataId() {
      if (!routerConfig.routerReservedMetadataEnabled || isSimpleBlob || isMetadataChunk()) {
        return null;
      }
      // S3 doesn't use reserved metadata chunk.
      // 1. For multipart upload, S3 doesn't use signed url. And for the data chunk, we don't reserve metadata chunk.
      //    Customer may upload part by part for days.
      // 2. For regular update, it's not chunked upload. It's uploaded with single PutObject.
      //    Don't reserve metadata chunk either. We manage the S3 life cycle right away.
      // 3. For multipart Complete request, it uses stitch command. Avoid the metadata chunk exceptions.
      if (RestUtils.isS3Request(restRequest)) {
        return null;
      }
      return metadataPutChunk.reservedMetadataChunkId.getID();
    }
Resolve the reserved metadata id to be used for data chunks.
For simple blobs or metadata chunks this will be {@code null}. For the data chunks of composite blobs, the reserved
metadata id of the metadata chunk will be used.
@return the blob id to use as the reserved metadata id. Can be {@code null}.
ambry-router/src/main/java/com/github/ambry/router/PutOperation.java