From 079d9256eec3c776125179acfcde9ff6f3ca0143 Mon Sep 17 00:00:00 2001 From: Kevin Puetz Date: Wed, 11 Jan 2023 19:15:27 -0600 Subject: [PATCH] Fix test_size_on_disk_accurate for large st_blksize, fixes #7250 python's io.BufferedWriter sizes its buffer based on st_blksize. If the write fits in this buffer, then it's possible the data from idx.write() has not been flushed through to ,the underlying filesystem, and getsize(fileno()) sees a too-short (or even empty) file. Also, getsize is only documented as accepting path-like objects; passing a fileno seems to work only because the implementation blindly forwards everything through to os.stat without checking. Passing unopened_tempfile avoids all three problems - on windows, it doesn't rely on re-opening NamedTemporaryFile (the issue which led to cc0ad321dc32b78ce2f2f625ae91040fddf3fd8c) - we're following the documented API of getsize(path-like) - the file is closed (thus flushed) inside idx.write, before getsize() --- src/borg/testsuite/hashindex.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/borg/testsuite/hashindex.py b/src/borg/testsuite/hashindex.py index d5b6149ce..ce285bcd3 100644 --- a/src/borg/testsuite/hashindex.py +++ b/src/borg/testsuite/hashindex.py @@ -258,9 +258,9 @@ class HashIndexSizeTestCase(BaseTestCase): idx = ChunkIndex() for i in range(1234): idx[H(i)] = i, i**2 - with tempfile.NamedTemporaryFile() as file: - idx.write(file) - size = os.path.getsize(file.fileno()) + with unopened_tempfile() as filepath: + idx.write(filepath) + size = os.path.getsize(filepath) assert idx.size() == size