Hi,
We encounter a problem when we try to execute the command in [1] on a large repository and we have pack.deltacompression = on. This happens on Gerrit 3.4.5. We have the following configuration on the server:
[core]
packedGitOpenFiles = 8192
packedGitLimit = 48g
packedGitWindowSize = 64k
streamFileThreshold = 2048m
deltaBaseCacheLimit = 100m
repositoryCacheExpireAfter = 10min
[pack]
bigFileThreshold = 20m
indexVersion = 2
deltacompression = on
threads = 0
When I set deltacompression to off, we don't have a problem and we are able to clone the single branch of the repository.
The server has 18 CPUs, 197902240 kB Total memory, 976688 kB free memory and 85742796 kB available memory.
I reproduced the behaviour locally and it seems that threads are trying to write in the memory but they fail to find free memory to complete the packedGitLimit , I get the following error which I found also on the server:
[2022-08-10T14:41:22.450Z] [pool-30-thread-1] ERROR org.eclipse.jgit.internal.storage.file.PackDirectory : Exception caught while accessing pack file /home/XXXX/gerrit_testsite_3.4/git/XXXX.git/objects/pack/pack-0eb563704e6b771d5a9136643e1acc677d4495df.pack, the pack file might be corrupt. Caught 1 consecutive errors while trying to read this pack.
java.io.IOException: In-memory buffer limit exceeded
at org.eclipse.jgit.internal.storage.file.Pack.load(Pack.java:874)
at org.eclipse.jgit.internal.storage.file.Pack.get(Pack.java:274)
at org.eclipse.jgit.internal.storage.file.PackDirectory.open(PackDirectory.java:212)
at org.eclipse.jgit.internal.storage.file.ObjectDirectory.openPackedObject(ObjectDirectory.java:390)
at org.eclipse.jgit.internal.storage.file.ObjectDirectory.openPackedFromSelfOrAlternate(ObjectDirectory.java:354)
at org.eclipse.jgit.internal.storage.file.ObjectDirectory.openObjectWithoutRestoring(ObjectDirectory.java:345)
at org.eclipse.jgit.internal.storage.file.ObjectDirectory.openObject(ObjectDirectory.java:330)
at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:132)
at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:212)
at org.eclipse.jgit.internal.storage.pack.PackWriter.buffer(PackWriter.java:1885)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.buffer(DeltaWindow.java:377)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.delta(DeltaWindow.java:264)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.searchInWindow(DeltaWindow.java:188)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.search(DeltaWindow.java:144)
at org.eclipse.jgit.internal.storage.pack.DeltaTask.runWindow(DeltaTask.java:295)
at org.eclipse.jgit.internal.storage.pack.DeltaTask.call(DeltaTask.java:270)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
[2022-08-10T14:43:45.722Z] [HTTP POST /a/XXXXX/git-upload-pack (admin from 192.168.122.1)] ERROR com.google.gerrit.httpd.GitOverHttpServlet.GerritUploadPackErrorHandler : Internal error during upload-pack from Repository[/home/XXXX/gerrit_testsite_3.4/git/XXXX.git] [CONTEXT project="XXXXX" ]
org.eclipse.jgit.errors.MissingObjectException: Missing unknown f4132132c28b9b76224f52569e31a1d495ba38fe
at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:136)
at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:212)
at org.eclipse.jgit.internal.storage.pack.PackWriter.buffer(PackWriter.java:1885)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.buffer(DeltaWindow.java:377)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.delta(DeltaWindow.java:264)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.searchInWindow(DeltaWindow.java:188)
at org.eclipse.jgit.internal.storage.pack.DeltaWindow.search(DeltaWindow.java:144)
at org.eclipse.jgit.internal.storage.pack.DeltaTask.runWindow(DeltaTask.java:295)
at org.eclipse.jgit.internal.storage.pack.DeltaTask.call(DeltaTask.java:270)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
result: clone fails
Also, casually when I run the clone locally I found this gc-alloc warnings:
[305.466s][warning][gc,alloc] pool-30-thread-1: Retried waiting for GCLocker too often allocating 2417775 words.
Is there a way to prevent this error from happening?
[1] git clone --quiet https://<USER>@<GERRIT_URL>/a/<PROJECT> --single-branch --branch master
Thank you
Mark Bekhet