71 if revlog.nodemap_file is None: |
71 if revlog.nodemap_file is None: |
72 return # we do not use persistent_nodemap on this revlog |
72 return # we do not use persistent_nodemap on this revlog |
73 callback_id = b"revlog-persistent-nodemap-%s" % revlog.nodemap_file |
73 callback_id = b"revlog-persistent-nodemap-%s" % revlog.nodemap_file |
74 if tr.hasfinalize(callback_id): |
74 if tr.hasfinalize(callback_id): |
75 return # no need to register again |
75 return # no need to register again |
76 tr.addfinalize( |
76 tr.addfinalize(callback_id, lambda tr: _persist_nodemap(tr, revlog)) |
77 callback_id, lambda tr: _persist_nodemap(tr.addpostclose, revlog) |
77 |
78 ) |
78 |
|
79 class _NoTransaction(object): |
|
80 """transaction like object to update the nodemap outside a transaction |
|
81 """ |
|
82 |
|
83 def __init__(self): |
|
84 self._postclose = {} |
|
85 |
|
86 def addpostclose(self, callback_id, callback_func): |
|
87 self._postclose[callback_id] = callback_func |
79 |
88 |
80 |
89 |
81 def update_persistent_nodemap(revlog): |
90 def update_persistent_nodemap(revlog): |
82 """update the persistent nodemap right now |
91 """update the persistent nodemap right now |
83 |
92 |
84 To be used for updating the nodemap on disk outside of a normal transaction |
93 To be used for updating the nodemap on disk outside of a normal transaction |
85 setup (eg, `debugupdatecache`). |
94 setup (eg, `debugupdatecache`). |
86 """ |
95 """ |
87 cleanups = [] |
96 notr = _NoTransaction() |
88 _persist_nodemap((lambda x, y: cleanups.append(y)), revlog) |
97 _persist_nodemap(notr, revlog) |
89 for c in cleanups: |
98 for k in sorted(notr._postclose): |
90 c(None) |
99 notr._postclose[k](None) |
91 |
100 |
92 |
101 |
93 def _persist_nodemap(cleaner, revlog): |
102 def _persist_nodemap(tr, revlog): |
94 """Write nodemap data on disk for a given revlog |
103 """Write nodemap data on disk for a given revlog |
95 """ |
104 """ |
96 if getattr(revlog, 'filteredrevs', ()): |
105 if getattr(revlog, 'filteredrevs', ()): |
97 raise error.ProgrammingError( |
106 raise error.ProgrammingError( |
98 "cannot persist nodemap of a filtered changelog" |
107 "cannot persist nodemap of a filtered changelog" |
175 def cleanup(tr): |
184 def cleanup(tr): |
176 for oldfile in olds: |
185 for oldfile in olds: |
177 realvfs.tryunlink(oldfile) |
186 realvfs.tryunlink(oldfile) |
178 |
187 |
179 callback_id = b"revlog-cleanup-nodemap-%s" % revlog.nodemap_file |
188 callback_id = b"revlog-cleanup-nodemap-%s" % revlog.nodemap_file |
180 cleaner(callback_id, cleanup) |
189 tr.addpostclose(callback_id, cleanup) |
181 |
190 |
182 |
191 |
183 ### Nodemap docket file |
192 ### Nodemap docket file |
184 # |
193 # |
185 # The nodemap data are stored on disk using 2 files: |
194 # The nodemap data are stored on disk using 2 files: |