feat: enable metacopy=on to test metadata-only copy-up

Mount OverlayFS with metacopy=on option (kernel 4.2+, supported on ubuntu-22.04).
This prevents full file copy-up when files are opened with O_RDWR but not modified.

Expected behavior:
- ccache opens cache files with write access
- OverlayFS creates metadata-only entry in upper layer
- Full copy-up only happens if data is actually written
- Should dramatically reduce delta sizes from ~324 MB to ~KB

Re-enabled use-deltas for ccache to test this optimization.
Conan remains base-only (hash-based keys mean exact match most of the time).

If successful, deltas should be tiny for cache hit scenarios.
This commit is contained in:
Nicholas Dudfield
2025-10-31 09:36:09 +07:00
parent 28727b3f86
commit 4c546e5d91
2 changed files with 6 additions and 5 deletions

View File

@@ -274,11 +274,12 @@ runs:
exit 0
fi
# Mount OverlayFS
# Mount OverlayFS with metacopy=on to prevent copy-up for files opened-but-not-written
# This dramatically reduces delta sizes when ccache opens files with O_RDWR but doesn't modify content
echo ""
echo "Mounting OverlayFS..."
echo "Mounting OverlayFS with metacopy=on..."
sudo mount -t overlay overlay \
-o lowerdir="${CACHE_WORKSPACE}/base",upperdir="${CACHE_WORKSPACE}/upper",workdir="${CACHE_WORKSPACE}/work" \
-o lowerdir="${CACHE_WORKSPACE}/base",upperdir="${CACHE_WORKSPACE}/upper",workdir="${CACHE_WORKSPACE}/work",metacopy=on \
"${CACHE_WORKSPACE}/merged"
# Verify mount

View File

@@ -76,7 +76,7 @@ runs:
${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }}
${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-
${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-
use-deltas: 'false' # Disabled: OverlayFS file-level deltas incompatible with ccache's byte-level LRU updates
use-deltas: 'true' # Testing: metacopy=on should prevent copy-up for files opened-but-not-written
aws-access-key-id: ${{ inputs.aws-access-key-id }}
aws-secret-access-key: ${{ inputs.aws-secret-access-key }}
@@ -194,6 +194,6 @@ runs:
with:
path: ~/.ccache
key: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ steps.safe-branch.outputs.name }}
use-deltas: 'false' # Disabled: OverlayFS file-level deltas incompatible with ccache's byte-level LRU updates
use-deltas: 'true' # Testing: metacopy=on should prevent copy-up for files opened-but-not-written
aws-access-key-id: ${{ inputs.aws-access-key-id }}
aws-secret-access-key: ${{ inputs.aws-secret-access-key }}