[
https://issues.apache.org/jira/browse/JCLOUDS-1646?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17926230#comment-17926230
]
Andrew Gaul commented on JCLOUDS-1646:
--------------------------------------
Sorry, I still don't understand:
{code:java}
@Override
public Blob getBlob(String container, String name, GetOptions options) {
GoogleCloudStorageObject gcsObject =
api.getObjectApi().getObject(container, Strings2.urlEncode(name));
if (gcsObject == null) {
return null;
}
org.jclouds.http.options.GetOptions httpOptions =
blob2ObjectGetOptions.apply(options);
MutableBlobMetadata metadata = objectToBlobMetadata.apply(gcsObject);
Blob blob = new BlobImpl(metadata);
Payload payload = api.getObjectApi().download(container,
Strings2.urlEncode(name), httpOptions).getPayload();
long contentLength = payload.getContentMetadata().getContentLength();
payload.setContentMetadata(metadata.getContentMetadata()); // Doing this
first retains it on setPayload.
blob.setPayload(payload);
// getObject() returns the full object length but download() could be
smaller due to range requests.
payload.getContentMetadata().setContentLength(contentLength);
return blob;
}{code}
If the {{gcsObject}} is null then it should return. Are you suggesting that
there is a race between the calls to {{getObject}} and {{download}} where
another client removes the blob?
I do admit that the code should use {{Long}} instead of {{long}} but I want to
understand if this is a widespread issue or if it only occurs in a very
specific situation.
> GCP BlobStore fails to get blob
> -------------------------------
>
> Key: JCLOUDS-1646
> URL: https://issues.apache.org/jira/browse/JCLOUDS-1646
> Project: jclouds
> Issue Type: Bug
> Components: jclouds-blobstore
> Affects Versions: 2.7.0
> Reporter: Aliaksandr
> Priority: Major
> Labels: google-cloud-storage
>
> *Steps to reproduce*
> * Configure blob store using `google-cloud-storage`
> * Try to get a blob which doesn't exist
> * The error occurred something like below
> {noformat}
> java.lang.NullPointerException: Cannot invoke "java.lang.Long.longValue()"
> because the return value of
> "org.jclouds.io.MutableContentMetadata.getContentLength()" is null
> at
> org.jclouds.googlecloudstorage.blobstore.GoogleCloudStorageBlobStore.getBlob(GoogleCloudStorageBlobStore.java:254)
> at
> org.jclouds.blobstore.internal.BaseBlobStore.getBlob(BaseBlobStore.java:217)
> at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(native)
> at
> jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
> at
> jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:568)
> at
> com.google.inject.internal.DelegatingInvocationHandler.invoke(DelegatingInvocationHandler.java:50)
> at jdk.proxy3.$Proxy129.getBlob(unknown)
> {noformat}
> *Root cause*
> The attribute `Content-Length` might be null in
> `org.jclouds.io.ContentMetadata#getContentLength` but the code does a cast to
> primitive type(see
> `org.jclouds.googlecloudstorage.blobstore.GoogleCloudStorageBlobStore#getBlob`):
> {noformat}
> Payload payload = api.getObjectApi().download(container,
> Strings2.urlEncode(name), httpOptions).getPayload();
> long contentLength = payload.getContentMetadata().getContentLength();
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)