# HG changeset patch # User RhodeCode Admin # Date 2024-06-10 15:01:42 # Node ID e472f015902a466df289637fcbb96198bede55b0 # Parent 47a7e5de42efefb7cf456cc3eb6ebec05f2ae6c8 feat(disk-cache): use fsync to force flush changes on NFS, and use retry mechanism to archive caches... diff --git a/rhodecode/apps/repository/views/repo_files.py b/rhodecode/apps/repository/views/repo_files.py --- a/rhodecode/apps/repository/views/repo_files.py +++ b/rhodecode/apps/repository/views/repo_files.py @@ -459,7 +459,7 @@ class RepoFilesView(RepoAppView): response.location = location return response - reader, metadata = d_cache.fetch(archive_name_key) + reader, metadata = d_cache.fetch(archive_name_key, retry=True, retry_attempts=30) response = Response(app_iter=archive_iterator(reader)) response.content_disposition = f'attachment; filename={response_archive_name}' diff --git a/rhodecode/lib/rc_cache/archive_cache/fanout_cache.py b/rhodecode/lib/rc_cache/archive_cache/fanout_cache.py --- a/rhodecode/lib/rc_cache/archive_cache/fanout_cache.py +++ b/rhodecode/lib/rc_cache/archive_cache/fanout_cache.py @@ -139,6 +139,13 @@ class FileSystemCache: for chunk in iterator: size += len(chunk) writer.write(chunk) + writer.flush() + # Get the file descriptor + fd = writer.fileno() + + # Sync the file descriptor to disk, helps with NFS cases... + os.fsync(fd) + log.debug('written new archive cache under %s', full_path) return size def _get_keyfile(self, key):