]> source.dussan.org Git - jgit.git/commit
ReceivePack: clear advertised .haves if application changes refs 18/104618/2
authorShawn Pearce <spearce@spearce.org>
Thu, 7 Sep 2017 02:09:42 +0000 (19:09 -0700)
committerShawn Pearce <spearce@spearce.org>
Thu, 7 Sep 2017 09:39:47 +0000 (05:39 -0400)
commite68a9b3ed8dbed4708f90d97ab2747c97aa0e123
treef3a33314030513275ad0edadd953b9e497680e45
parentd0d15c38485011d32db2be1acf440110d20d6a1f
ReceivePack: clear advertised .haves if application changes refs

An application can choose to invoke setAdvertisedRefs multiple times,
for example several AdvertiseRefsHook installed in a chain. Each of
these invocations populates the advertisedHaves collection with the
unique set of ObjectIds.

This can lead to a server over-advertising with ".have" lines if the
first hook pushes in a lot of references, and the second hook filters
this to a subset.  ReceivePack will advertise the unique objects from
the first hook using ".have" lines, which may lead to a huge
advertisement sent to the client.

This can also contribute to a very slow connectivity check after the
pack is parsed as ReceivePack calls markUninteresting on every commit
in advertisedHaves.  This may require expanding a lot of subtrees to
mark all trees as uninteresting as well.  On a very big repository
this can lead to a many-second stall.

Clear the advertisedHaves collection any time the refs are updated.
Add a test to verify the correct set of objects was sent.

Change-Id: I97f6998d0597251444a2e846a3ea1f461bae96f9
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ReceivePackAdvertiseRefsHookTest.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java