Hi Andrew,

I'm running jclouds 2.3.0 these days. Here's the call stack:

java.lang.NullPointerException: Null id
        at 
org.jclouds.blobstore.domain.AutoValue_MultipartUpload.<init>(AutoValue_MultipartUpload.java:32)
 ~[jclouds-blobstore-2.3.0.jar:2.3.0]
        at 
org.jclouds.blobstore.domain.MultipartUpload.create(MultipartUpload.java:35) 
~[jclouds-blobstore-2.3.0.jar:2.3.0]
        at 
org.jclouds.s3.blobstore.S3BlobStore.initiateMultipartUpload(S3BlobStore.java:371)
 ~[s3-2.3.0.jar:2.3.0]
        at 
org.jclouds.blobstore.internal.BaseBlobStore.putMultipartBlob(BaseBlobStore.java:356)
 ~[jclouds-blobstore-2.3.0.jar:2.3.0]
        at 
org.jclouds.blobstore.internal.BaseBlobStore.putMultipartBlob(BaseBlobStore.java:349)
 ~[jclouds-blobstore-2.3.0.jar:2.3.0]
        at org.jclouds.s3.blobstore.S3BlobStore.putBlob(S3BlobStore.java:262) 
~[s3-2.3.0.jar:2.3.0]

My code calls S3BlobStore.putBlob as follows:

                    blobStore.putBlob(cspInfo.getContainer(), blob, 
multipart());

blob is defined as:

                    Blob blob = blobStore.blobBuilder(key)
                            .payload(content)
                            .contentDisposition(key)
                            .contentLength(meta.getContentLength())
                            .contentMD5(HashCode.fromBytes(meta.getChecksum()))
                            .contentType(MediaType.APPLICATION_OCTET_STREAM)
                            .userMetadata(meta.getUserMeta())
                            .build();

When it happens (not very often), the problem seems to be here (in 
S3BlobStore.java):

   @Override
   public MultipartUpload initiateMultipartUpload(String container, 
BlobMetadata blobMetadata, PutOptions overrides) {
      PutObjectOptions options = new PutObjectOptions();
      if (overrides.getBlobAccess() == BlobAccess.PUBLIC_READ) {
         options = options.withAcl(CannedAccessPolicy.PUBLIC_READ);
      }
      String id = sync.initiateMultipartUpload(container, 
blob2ObjectMetadata.apply(blobMetadata), options);
      return MultipartUpload.create(container, blobMetadata.getName(), id, 
blobMetadata, overrides);
   }

In the last two lines 'id' is returned by the S3Client (sync) during the 
initiateMultipartUpload call. But id is occasionally returned as null for some 
reason. To be fair, I've only seen this happen once. I tried to chase it 
further, but (to be completely honest), I do not (nor have I ever been able to) 
figure out how to get past the S3Client barrier in jclouds. That is, I'm not 
very good with guice, so I don't know how to follow the code properly past a 
guice binding interface like S3Client.

Reply via email to