S3: Close more filehandles (#5939)

This commit is contained in:
Bert Blommers 2023-02-17 23:02:26 -01:00 committed by GitHub
parent c2afe19ff1
commit 0b1333c66d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 2 deletions

View File

@ -1827,8 +1827,6 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
if bucket.is_versioned:
keys = existing_keys + [new_key]
else:
for key in existing_keys:
key.dispose()
keys = [new_key]
bucket.keys.setlist(key_name, keys)

View File

@ -148,6 +148,12 @@ class _VersionedKeyStore(dict):
elif not isinstance(list_, list):
list_ = [list_]
for existing_version in self.getlist(key, []):
# Dispose of any FakeKeys that we will not keep
# We should only have FakeKeys here - but we're checking hasattr to be sure
if existing_version not in list_ and hasattr(existing_version, "dispose"):
existing_version.dispose()
super().__setitem__(key, list_)
def _iteritems(self):

View File

@ -251,6 +251,17 @@ class TestS3FileHandleClosuresUsingMocks(TestCase):
with mock_s3():
pass
@verify_zero_warnings
def test_delete_object_with_version(self):
with mock_s3():
self.s3.create_bucket(Bucket="foo")
self.s3.put_bucket_versioning(
Bucket="foo",
VersioningConfiguration={"Status": "Enabled", "MFADelete": "Disabled"},
)
version = self.s3.put_object(Bucket="foo", Key="b", Body="s")["VersionId"]
self.s3.delete_object(Bucket="foo", Key="b", VersionId=version)
def test_verify_key_can_be_copied_after_disposing():
# https://github.com/getmoto/moto/issues/5588