Mercurial > hg-stable
changeset 17125:95d785ccb4e5
obsolete: append new markers to obsstore file instead of rewriting everything
This is the second step toward incremental writing of marker inside a
transaction. The obsstore file is now handled append only.
Header writing have been extracted from _writemarkers.
Because the _writemarkers method have been dropped, the push code
directly reuse the serialised content of local repo `listkeys`. This
is not very pretty, but this part of the protocol still need major
improvement anyway.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Wed, 04 Jul 2012 02:02:48 +0200 |
parents | f1b7683f3f95 |
children | 8fa8717b47b6 |
files | mercurial/localrepo.py mercurial/obsolete.py |
diffstat | 2 files changed, 22 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/localrepo.py Wed Jul 04 02:00:36 2012 +0200 +++ b/mercurial/localrepo.py Wed Jul 04 02:02:48 2012 +0200 @@ -1808,9 +1808,8 @@ self.ui.warn(_('updating %s to public failed!\n') % newremotehead) if 'obsolete' in self.listkeys('namespaces') and self.obsstore: - data = self.obsstore._writemarkers() - r = remote.pushkey('obsolete', 'dump', '', - base85.b85encode(data)) + data = self.listkeys('obsolete')['dump'] + r = remote.pushkey('obsolete', 'dump', '', data) if not r: self.ui.warn(_('failed to push obsolete markers!\n')) finally:
--- a/mercurial/obsolete.py Wed Jul 04 02:00:36 2012 +0200 +++ b/mercurial/obsolete.py Wed Jul 04 02:02:48 2012 +0200 @@ -209,12 +209,14 @@ """Write all markers on disk After this operation, "new" markers are considered "known".""" + # XXX: transaction logic should be used if self._new: - # XXX: transaction logic should be used here. But for - # now rewriting the whole file is good enough. - f = self.sopener('obsstore', 'wb', atomictemp=True) + f = self.sopener('obsstore', 'ab') try: - self._writemarkers(f) + if f.tell() == 0: + # plain new obsstore + f.write(_pack('>B', _fmversion)) + _writemarkers(f.write, self._new) f.close() self._new[:] = [] except: # re-raises @@ -228,32 +230,25 @@ for suc in sucs: self.successors.setdefault(suc, set()).add(marker) - def _writemarkers(self, stream=None): - # Kept separate from flushmarkers(), it will be reused for - # markers exchange. - if stream is None: - final = [] - w = final.append - else: - w = stream.write - w(_pack('>B', _fmversion)) - for marker in self._all: - pre, sucs, flags, metadata = marker - nbsuc = len(sucs) - format = _fmfixed + (_fmnode * nbsuc) - data = [nbsuc, len(metadata), flags, pre] - data.extend(sucs) - w(_pack(format, *data)) - w(metadata) - if stream is None: - return ''.join(final) +def _writemarkers(write, markers): + # Kept separate from flushmarkers(), it will be reused for + # markers exchange. + for marker in markers: + pre, sucs, flags, metadata = marker + nbsuc = len(sucs) + format = _fmfixed + (_fmnode * nbsuc) + data = [nbsuc, len(metadata), flags, pre] + data.extend(sucs) + write(_pack(format, *data)) + write(metadata) def listmarkers(repo): """List markers over pushkey""" if not repo.obsstore: return {} - data = repo.obsstore._writemarkers() - return {'dump': base85.b85encode(data)} + data = [_pack('>B', _fmversion)] + _writemarkers(data.append, repo.obsstore) + return {'dump': base85.b85encode(''.join(data))} def pushmarker(repo, key, old, new): """Push markers over pushkey"""