changeset 27558:b5b54825de6b

pull: make a single call to obsstore.add (issue5006) Prior to this, a pull of 90k markers (already known locally!) was making about 2000 calls to obsstore.add, which was repeatedly building a full set of known markers (in addition to other transaction overhead). This quadratic behavior accounted for about 50 seconds of a 70 second no-op pull. After this change, we're down to 20 seconds. While it would seem simplest to just cache the known set for obsstore.add, this would also introduce issues of correct cache invalidation. The extra pointless transaction overhead would also remain.
author Matt Mackall <mpm@selenic.com>
date Fri, 18 Dec 2015 13:53:50 -0600
parents 28b5c4fcf48d
children d13bcc9fd656
files mercurial/exchange.py
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/exchange.py	Sun Dec 27 15:24:48 2015 -0800
+++ b/mercurial/exchange.py	Fri Dec 18 13:53:50 2015 -0600
@@ -1399,10 +1399,14 @@
         remoteobs = pullop.remote.listkeys('obsolete')
         if 'dump0' in remoteobs:
             tr = pullop.gettransaction()
+            markers = []
             for key in sorted(remoteobs, reverse=True):
                 if key.startswith('dump'):
                     data = base85.b85decode(remoteobs[key])
-                    pullop.repo.obsstore.mergemarkers(tr, data)
+                    version, newmarks = obsolete._readmarkers(data)
+                    markers += newmarks
+            if markers:
+                pullop.repo.obsstore.add(tr, markers)
             pullop.repo.invalidatevolatilesets()
     return tr