comparison mercurial/branchmap.py @ 23863:669106fc5bb1

branchcache: make _rbcrevslen handling more safe self._rbcrevslen is used to keep track of the number of good records on disk. It should thus not be updated before the records actually have been written to disk.
author Mads Kiilerich <madski@unity3d.com>
date Wed, 14 Jan 2015 01:15:26 +0100
parents 7aa1405528a3
children 7cc77030c557
comparison
equal deleted inserted replaced
23862:7aa1405528a3 23863:669106fc5bb1
429 return 429 return
430 self._rbcnamescount = len(self._names) 430 self._rbcnamescount = len(self._names)
431 431
432 start = self._rbcrevslen * _rbcrecsize 432 start = self._rbcrevslen * _rbcrecsize
433 if start != len(self._rbcrevs): 433 if start != len(self._rbcrevs):
434 self._rbcrevslen = min(len(repo.changelog), 434 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize)
435 len(self._rbcrevs) // _rbcrecsize)
436 try: 435 try:
437 f = repo.vfs.open(_rbcrevs, 'ab') 436 f = repo.vfs.open(_rbcrevs, 'ab')
438 # The position after open(x, 'a') is implementation defined- 437 # The position after open(x, 'a') is implementation defined-
439 # see issue3543. SEEK_END was added in 2.5 438 # see issue3543. SEEK_END was added in 2.5
440 f.seek(0, 2) #os.SEEK_END 439 f.seek(0, 2) #os.SEEK_END
441 if f.tell() != start: 440 if f.tell() != start:
442 repo.ui.debug("truncating %s to %s\n" % (_rbcrevs, start)) 441 repo.ui.debug("truncating %s to %s\n" % (_rbcrevs, start))
443 f.seek(start) 442 f.seek(start)
444 f.truncate() 443 f.truncate()
445 end = self._rbcrevslen * _rbcrecsize 444 end = revs * _rbcrecsize
446 f.write(self._rbcrevs[start:end]) 445 f.write(self._rbcrevs[start:end])
447 f.close() 446 f.close()
448 except (IOError, OSError, util.Abort), inst: 447 except (IOError, OSError, util.Abort), inst:
449 repo.ui.debug("couldn't write revision branch cache: %s\n" % 448 repo.ui.debug("couldn't write revision branch cache: %s\n" %
450 inst) 449 inst)
451 return 450 return
451 self._rbcrevslen = revs