Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blob.metadata not preserved when uploading new file content #293

Closed
lrowe opened this issue Oct 13, 2020 · 1 comment · Fixed by #298
Closed

Blob.metadata not preserved when uploading new file content #293

lrowe opened this issue Oct 13, 2020 · 1 comment · Fixed by #298
Assignees
Labels
api: storage Issues related to the googleapis/python-storage API. type: question Request for information or clarification. Not an issue.

Comments

@lrowe
Copy link

lrowe commented Oct 13, 2020

blob.metadata is not preserved when uploading new file content on an existing Blob instance with blob.upload_from_string(...) unless you first reset it with blob.metadata = blob.metadata.

I suspect this bug / surprising behaviour is the result of the somewhat awkward mapping of the REST API onto mutable objects. It feels like setting metadata should really be a parameter of the blob upload methods instead of a mutable field on the instance.

Environment details

  • OS type and version:

Both locally on my Mac and within Google Cloud Functions

  • Python version: python --version

Python 3.8.5

  • pip version: pip --version

pip 20.1.1

  • google-cloud-storage version: pip show google-cloud-storage

google-cloud-storage==1.31.2

Steps to reproduce

See code example.

Code example

>>> b = bucket.blob('testme1')
>>> b.metadata = {'test': 'me'}
>>> b.upload_from_string('foo')
>>> b.metadata
{'test': 'me'}
>>> b.upload_from_string('bar')
>>> b.metadata
>>> # Note how b.metadata is not blank

>>> b = bucket.blob('testme2')
>>> b.metadata = {'test': 'me'}
>>> b.upload_from_string('foo')
>>> b.metadata
{'test': 'me'}
>>> b.metadata = b.metadata # <-- workaround
>>> b.upload_from_string('bar')
>>> b.metadata
{'test': 'me'}
>>> # Note how b.metadata is now preserved
@product-auto-label product-auto-label bot added the api: storage Issues related to the googleapis/python-storage API. label Oct 13, 2020
@HemangChothani HemangChothani self-assigned this Oct 14, 2020
@HemangChothani
Copy link
Contributor

@lrowe Yes it's reproducible, thanks for opening the issue.
First time when set blob.metadata = {'test': 'me'} it's there in self._changes when called _get_writable_metadata method and response set into the properties.

for key in self._changes:

But when called method second time with the same blob object metadata is not in self._changes list so it's doesn't include in writable_metadata so in the response metadata is missing and blob.metadata returns None.

@frankyn @tseaver Need a suggestion. If it's necessary to preserve metadata then can we have a static for metadata exist in properties in _get_writable_metadata method.

def _get_writable_metadata(self):

@HemangChothani HemangChothani added the type: question Request for information or clarification. Not an issue. label Oct 14, 2020
gcf-merge-on-green bot pushed a commit that referenced this issue Nov 11, 2020
cojenco pushed a commit to cojenco/python-storage that referenced this issue Oct 13, 2021
cojenco pushed a commit to cojenco/python-storage that referenced this issue Oct 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: storage Issues related to the googleapis/python-storage API. type: question Request for information or clarification. Not an issue.
Projects
None yet
2 participants