Skip to content

Commit 83685ee

Browse files
nathanchrsveluca93
authored andcommitted
Increase file cache chunk size from 16 KB to 1 MB
To improve performance when connecting to worker instances over high latency network
1 parent 2b159d5 commit 83685ee

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

cms/db/filecacher.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,7 @@ class FileCacher:
478478
"""
479479

480480
# This value is very arbitrary, and in this case we want it to be a
481-
# one-size-fits-all, since we use it for many conversions. It has
482-
# been chosen arbitrarily based on performance tests on my machine.
481+
# one-size-fits-all, since we use it for many conversions.
483482
# A few consideration on the value it could assume follow:
484483
# - The page size of large objects is LOBLKSIZE, which is BLCKSZ/4
485484
# (BLCKSZ is the block size of the PostgreSQL database, which is
@@ -489,7 +488,8 @@ class FileCacher:
489488
# - The `io' module defines a DEFAULT_BUFFER_SIZE constant, whose
490489
# value is 8192.
491490
# CHUNK_SIZE should be a multiple of these values.
492-
CHUNK_SIZE = 16 * 1024 # 16 KiB
491+
# Note that a too-small value can cause issues on high-latency networks.
492+
CHUNK_SIZE = 1024 * 1024 # 1 MiB
493493
backend: FileCacherBackend
494494

495495
def __init__(self, service: "Service | None" = None, path: str | None = None, null: bool = False):

cmstestsuite/unit_tests/server/file_middleware_test.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,20 @@
2626
from werkzeug.wrappers import Response
2727
from werkzeug.wsgi import responder
2828

29-
from cms.db.filecacher import TombstoneError
29+
from cms.db.filecacher import FileCacher, TombstoneError
3030
from cms.server.file_middleware import FileServerMiddleware
3131
from cmscommon.digest import bytes_digest
3232

3333

34+
# Choose a size that is larger than FileCacher.CHUNK_SIZE.
35+
TESTFILE_LEN = FileCacher.CHUNK_SIZE + 128
36+
37+
3438
class TestFileByDigestMiddleware(unittest.TestCase):
3539

3640
def setUp(self):
37-
# Choose a size that is larger than FileCacher.CHUNK_SIZE.
3841
self.content = \
39-
bytes(random.getrandbits(8) for _ in range(17 * 1024))
42+
bytes(random.getrandbits(8) for _ in range(TESTFILE_LEN))
4043
self.digest = bytes_digest(self.content)
4144

4245
self.filename = "foobar.pdf"
@@ -51,7 +54,7 @@ def setUp(self):
5154
self.provide_filename = True
5255

5356
self.wsgi_app = \
54-
FileServerMiddleware(self.file_cacher,self.wrapped_wsgi_app)
57+
FileServerMiddleware(self.file_cacher, self.wrapped_wsgi_app)
5558
self.environ_builder = EnvironBuilder("/some/url")
5659
self.client = Client(self.wsgi_app, Response)
5760

@@ -141,7 +144,7 @@ def test_range_request(self):
141144
self.assertEqual(response.content_range.units, "bytes")
142145
self.assertEqual(response.content_range.start, 256)
143146
self.assertEqual(response.content_range.stop, 768)
144-
self.assertEqual(response.content_range.length, 17 * 1024)
147+
self.assertEqual(response.content_range.length, TESTFILE_LEN)
145148
self.assertEqual(response.get_data(), self.content[256:768])
146149

147150
def test_range_request_end_overflows(self):
@@ -151,12 +154,13 @@ def test_range_request_end_overflows(self):
151154
self.assertEqual(response.content_range.units, "bytes")
152155
self.assertEqual(response.content_range.start, 256)
153156
self.assertEqual(response.content_range.stop, 2048)
154-
self.assertEqual(response.content_range.length, 17 * 1024)
157+
self.assertEqual(response.content_range.length, TESTFILE_LEN)
155158
self.assertEqual(response.get_data(), self.content[256:2048])
156159

157160
def test_range_request_start_overflows(self):
158161
# Test a range that starts after the end of the file.
159-
response = self.request(headers=[("Range", f"bytes={len(self.content) + 1}-")])
162+
response = self.request(
163+
headers=[("Range", f"bytes={len(self.content) + 1}-")])
160164
self.assertEqual(response.status_code, 416)
161165

162166

0 commit comments

Comments
 (0)