comparison mercurial/localrepo.py @ 17295:1f08ecc7febb stable

pushkey: splits obsolete marker exchange into multiple keys Obsolete markers are now exchanged in smaller pieces that fit in a http header. This changes is done to avoid 400 bad request error when exchanging obsolete puskey over http. The last key pushed is always hold by the "dump0" key to ensure an easy place to hook for people who need it.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Fri, 27 Jul 2012 18:32:56 +0200
parents d2217df3a7cf
children 6955d69a52a4
comparison
equal deleted inserted replaced
17294:d2217df3a7cf 17295:1f08ecc7febb
1783 # should be seen as public 1783 # should be seen as public
1784 phases.advanceboundary(self, phases.public, subset) 1784 phases.advanceboundary(self, phases.public, subset)
1785 1785
1786 self.ui.debug('fetching remote obsolete markers') 1786 self.ui.debug('fetching remote obsolete markers')
1787 remoteobs = remote.listkeys('obsolete') 1787 remoteobs = remote.listkeys('obsolete')
1788 if 'dump' in remoteobs: 1788 if 'dump0' in remoteobs:
1789 if tr is None: 1789 if tr is None:
1790 tr = self.transaction(trname) 1790 tr = self.transaction(trname)
1791 data = base85.b85decode(remoteobs['dump']) 1791 for key in sorted(remoteobs, reverse=True):
1792 self.obsstore.mergemarkers(tr, data) 1792 if key.startswith('dump'):
1793 data = base85.b85decode(remoteobs[key])
1794 self.obsstore.mergemarkers(tr, data)
1793 if tr is not None: 1795 if tr is not None:
1794 tr.close() 1796 tr.close()
1795 finally: 1797 finally:
1796 if tr is not None: 1798 if tr is not None:
1797 tr.release() 1799 tr.release()
1953 self.ui.warn(_('updating %s to public failed!\n') 1955 self.ui.warn(_('updating %s to public failed!\n')
1954 % newremotehead) 1956 % newremotehead)
1955 self.ui.debug('try to push obsolete markers to remote\n') 1957 self.ui.debug('try to push obsolete markers to remote\n')
1956 if (self.obsstore and 1958 if (self.obsstore and
1957 'obsolete' in remote.listkeys('namespaces')): 1959 'obsolete' in remote.listkeys('namespaces')):
1958 data = self.listkeys('obsolete')['dump'] 1960 rslts = []
1959 r = remote.pushkey('obsolete', 'dump', '', data) 1961 remotedata = self.listkeys('obsolete')
1960 if not r: 1962 for key in sorted(remotedata, reverse=True):
1961 self.ui.warn(_('failed to push obsolete markers!\n')) 1963 # reverse sort to ensure we end with dump0
1964 data = remotedata[key]
1965 rslts.append(remote.pushkey('obsolete', key, '', data))
1966 if [r for r in rslts if not r]:
1967 msg = _('failed to push some obsolete markers!\n')
1968 self.ui.warn(msg)
1962 finally: 1969 finally:
1963 if lock is not None: 1970 if lock is not None:
1964 lock.release() 1971 lock.release()
1965 finally: 1972 finally:
1966 locallock.release() 1973 locallock.release()