From 6b91b748540a9aaf20440d7c986e4f233027b9ae Mon Sep 17 00:00:00 2001 From: Junaid Ahamed Date: Sun, 1 Nov 2026 10:14:19 +0530 Subject: [PATCH 1/2] Propagate local storage upload errors when locking is disabled Apache-ai: Code and regression tests prepared with OpenAI Codex. --- libcloud/storage/drivers/local.py | 2 +- libcloud/test/storage/test_local.py | 31 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/libcloud/storage/drivers/local.py b/libcloud/storage/drivers/local.py index f47d7c0649..b2f533e42e 100644 --- a/libcloud/storage/drivers/local.py +++ b/libcloud/storage/drivers/local.py @@ -59,7 +59,7 @@ def __enter__(self): return True def __exit__(self, type, value, traceback): - return value + return False class LockLocalStorage: diff --git a/libcloud/test/storage/test_local.py b/libcloud/test/storage/test_local.py index 7d7f271405..81ff58a2f3 100644 --- a/libcloud/test/storage/test_local.py +++ b/libcloud/test/storage/test_local.py @@ -237,6 +237,37 @@ def test_objects_success(self): container.delete() self.remove_tmp_file(tmppath) + def test_upload_object_via_stream_without_locking_propagates_error(self): + driver = LocalStorageDriver(self.key, ex_use_locking=False) + container = driver.create_container("failed-stream") + error = OSError("source stream failed") + + def failing_stream(): + yield b"partial data" + raise error + + with self.assertRaises(OSError) as raised: + driver.upload_object_via_stream(failing_stream(), container, "object") + + self.assertIs(raised.exception, error) + + def test_upload_object_without_locking_propagates_copy_error(self): + driver = LocalStorageDriver(self.key, ex_use_locking=False) + container = driver.create_container("failed-copy") + driver.upload_object_via_stream(iter([b"original"]), container, "object") + missing_source = os.path.join(self.key, "missing-source") + + with self.assertRaises(FileNotFoundError): + driver.upload_object(missing_source, container, "object") + + def test_upload_object_via_stream_without_locking_success(self): + driver = LocalStorageDriver(self.key, ex_use_locking=False) + container = driver.create_container("successful-stream") + obj = driver.upload_object_via_stream(iter([b"first", b"second"]), container, "object") + + self.assertEqual(obj.size, 11) + self.assertEqual(b"".join(driver.download_object_as_stream(obj)), b"firstsecond") + def test_get_container_doesnt_exist(self): try: self.driver.get_container(container_name="container1") From e6fb1c88f1942abb626346356600c07e8b3937ab Mon Sep 17 00:00:00 2001 From: Junaid Ahamed Date: Thu, 5 Nov 2026 19:35:37 +0530 Subject: [PATCH 2/2] Trigger fresh PR workflow runs