[ 
https://issues.apache.org/jira/browse/LIBCLOUD-988?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vojta Bartos updated LIBCLOUD-988:
----------------------------------
    Description: 
Hi there,

I have started using Azure Blob Storate provider and found it it just doesn't 
work for files larger then 4MB, which is actually blob and chunk size limit in 
code.

I have done some digging/debugging in the code base and found out that 
uploading files in chunks is not used at all. It was actually added correctly 
with first version for Azure Blob Provided in 0.12.* version, but during some 
kind of refactoring it has been removed and for example `_upload_in_chunks` 
method is not used at all. Practically in method `_upload_object` check if file 
size is bigger then blob/chunk size but actually chunk upload is not happening.

Try following code to see it's not working 
{code:java}
import urllib
from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

print "start data downloaded"

file_path = "data.csv"
urllib.urlretrieve("https://data.seattle.gov/api/views/mags-97de/rows.csv?accessType=DOWNLOAD";,
 "data.csv")

print "data downloaded"

key = "<KEY>"
secret = "<SECRET>"
bucket_name = "<BUCKET_NAME>"
kls = get_driver(Provider.AZURE_BLOBS)
provider = kls(key=key, secret=secret)


print "start pushing data to azure"
container = provider.get_container(bucket_name)
provider.upload_object(
file_path,
container=provider.get_container(bucket_name),
object_name=file_path,
)
print "stop pushing data to azure"{code}
Just downloading some random CSV file (24MB in this case) and trying to upload 
it. I have found some workaround how to be able to send one chunk/blob, but 
Azure have restrictions max 100MB per chunk/blob, so in the end i am not able 
to push files larger then 100MB.

The example code fail with following exception
{code:java}
Traceback (most recent call last): File "python", line 24, in <module> 
LibcloudError: <LibcloudError in 
<libcloud.storage.drivers.azure_blobs.AzureBlobsStorageDriver object at 
0x7fbf61fbbdd0> 'Unexpected status code, status_code=403'>{code}
But if you print out output of the HTTP response it's saying following 
(sensitive informations truncated)
{code:java}
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of 
Authorization header is formed correctly including the 
signature.\nRequestId:<truncated>\nTime:2018-03-16T13:03:44.0282425Z</Message>
<AuthenticationErrorDetail>The MAC signature found in the HTTP request 
\'<truncated>\' is not the same as any computed signature. Server used 
following string to sign: 
\'PUT\n\n\n\n\ntext/csv\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:Fri, 
16 Mar 2018 13:03:51 
GMT\nx-ms-version:2012-02-12\n<truncated>\'.</AuthenticationErrorDetail>
</Error>{code}
Let me know if i am doing anything wrong or if you need provide more 
informations ;)

Thanks,

Vojta

  was:
Hi there,

I have started using Azure Blob Storate provider and found it it just doesn't 
work for files larger then 4MB, which is actually blob and chunk size limit in 
code.

I have done some digging/debugging in the code base and found out that 
uploading files in chunks is not used at all. It was actually added correctly 
with first version for Azure Blob Provided in 0.12.* version, but during some 
kind of refactoring it has been removed and for example `_upload_in_chunks` 
method is not used at all. Practically in method `_upload_object` check if file 
size is bigger then blob/chunk size but actually chunk upload is not happening.

Try following code to see it's not working 
{code:java}
import urllib
from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

print("start data downloaded")

file_path = "data.csv"
urllib.urlretrieve("https://data.seattle.gov/api/views/mags-97de/rows.csv?accessType=DOWNLOAD";,
 "data.csv")

print("data downloaded")

key = "<KEY>"
secret = "<SECRET>"
bucket_name = "<BUCKET_NAME>"
kls = get_driver(Provider.AZURE_BLOBS)
provider = kls(key=key, secret=secret)


print("start pushing data to azure")
container = provider.get_container(bucket_name)
provider.upload_object(
file_path,
container=provider.get_container(bucket_name),
object_name=file_path,
)
print("stop pushing data to azure"){code}
Just downloading some random CSV file (24MB in this case) and trying to upload 
it. I have found some workaround how to be able to send one chunk/blob, but 
Azure have restrictions max 100MB per chunk/blob, so in the end i am not able 
to push files larger then 100MB.

The example code fail with following exception
{code:java}
Traceback (most recent call last): File "python", line 24, in <module> 
LibcloudError: <LibcloudError in 
<libcloud.storage.drivers.azure_blobs.AzureBlobsStorageDriver object at 
0x7fbf61fbbdd0> 'Unexpected status code, status_code=403'>{code}
But if you print out output of the HTTP response it's saying following 
(sensitive informations truncated)
{code:java}
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of 
Authorization header is formed correctly including the 
signature.\nRequestId:<truncated>\nTime:2018-03-16T13:03:44.0282425Z</Message>
<AuthenticationErrorDetail>The MAC signature found in the HTTP request 
\'<truncated>\' is not the same as any computed signature. Server used 
following string to sign: 
\'PUT\n\n\n\n\ntext/csv\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:Fri, 
16 Mar 2018 13:03:51 
GMT\nx-ms-version:2012-02-12\n<truncated>\'.</AuthenticationErrorDetail>
</Error>{code}
Let me know if i am doing anything wrong or if you need provide more 
informations ;)

Thanks,

Vojta


> Not able to upload object larger then 4MB (Blob/chunk size)
> -----------------------------------------------------------
>
>                 Key: LIBCLOUD-988
>                 URL: https://issues.apache.org/jira/browse/LIBCLOUD-988
>             Project: Libcloud
>          Issue Type: Bug
>          Components: Storage
>         Environment: tried in following
>  * docker python:2.7
>  * repl.it 2.7.0
>            Reporter: Vojta Bartos
>            Priority: Major
>
> Hi there,
> I have started using Azure Blob Storate provider and found it it just doesn't 
> work for files larger then 4MB, which is actually blob and chunk size limit 
> in code.
> I have done some digging/debugging in the code base and found out that 
> uploading files in chunks is not used at all. It was actually added correctly 
> with first version for Azure Blob Provided in 0.12.* version, but during some 
> kind of refactoring it has been removed and for example `_upload_in_chunks` 
> method is not used at all. Practically in method `_upload_object` check if 
> file size is bigger then blob/chunk size but actually chunk upload is not 
> happening.
> Try following code to see it's not working 
> {code:java}
> import urllib
> from libcloud.storage.types import Provider
> from libcloud.storage.providers import get_driver
> print "start data downloaded"
> file_path = "data.csv"
> urllib.urlretrieve("https://data.seattle.gov/api/views/mags-97de/rows.csv?accessType=DOWNLOAD";,
>  "data.csv")
> print "data downloaded"
> key = "<KEY>"
> secret = "<SECRET>"
> bucket_name = "<BUCKET_NAME>"
> kls = get_driver(Provider.AZURE_BLOBS)
> provider = kls(key=key, secret=secret)
> print "start pushing data to azure"
> container = provider.get_container(bucket_name)
> provider.upload_object(
> file_path,
> container=provider.get_container(bucket_name),
> object_name=file_path,
> )
> print "stop pushing data to azure"{code}
> Just downloading some random CSV file (24MB in this case) and trying to 
> upload it. I have found some workaround how to be able to send one 
> chunk/blob, but Azure have restrictions max 100MB per chunk/blob, so in the 
> end i am not able to push files larger then 100MB.
> The example code fail with following exception
> {code:java}
> Traceback (most recent call last): File "python", line 24, in <module> 
> LibcloudError: <LibcloudError in 
> <libcloud.storage.drivers.azure_blobs.AzureBlobsStorageDriver object at 
> 0x7fbf61fbbdd0> 'Unexpected status code, status_code=403'>{code}
> But if you print out output of the HTTP response it's saying following 
> (sensitive informations truncated)
> {code:java}
> <?xml version="1.0" encoding="UTF-8"?>
> <Error>
> <Code>AuthenticationFailed</Code>
> <Message>Server failed to authenticate the request. Make sure the value of 
> Authorization header is formed correctly including the 
> signature.\nRequestId:<truncated>\nTime:2018-03-16T13:03:44.0282425Z</Message>
> <AuthenticationErrorDetail>The MAC signature found in the HTTP request 
> \'<truncated>\' is not the same as any computed signature. Server used 
> following string to sign: 
> \'PUT\n\n\n\n\ntext/csv\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:Fri, 
> 16 Mar 2018 13:03:51 
> GMT\nx-ms-version:2012-02-12\n<truncated>\'.</AuthenticationErrorDetail>
> </Error>{code}
> Let me know if i am doing anything wrong or if you need provide more 
> informations ;)
> Thanks,
> Vojta



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to