comparison mercurial/revlog.py @ 35968:91b3b11565e5

revlog: move index file opening in a method Having file operation centralized into a single spot help to factor common logic out (eg: special flag handling according to the mode). It is also the first step to simplify file handling during batch operation (eg: revlog cloning). However, that part does not seems to be a hotspot yet.
author Boris Feld <boris.feld@octobus.net>
date Mon, 05 Feb 2018 17:22:13 +0100
parents 61326dd7cb8d
children 1f2b8a644dd4
comparison
equal deleted inserted replaced
35967:61326dd7cb8d 35968:91b3b11565e5
619 'of 2') % self._chunkcachesize) 619 'of 2') % self._chunkcachesize)
620 620
621 indexdata = '' 621 indexdata = ''
622 self._initempty = True 622 self._initempty = True
623 try: 623 try:
624 f = self.opener(self.indexfile) 624 f = self._indexfp()
625 if (mmapindexthreshold is not None and 625 if (mmapindexthreshold is not None and
626 self.opener.fstat(f).st_size >= mmapindexthreshold): 626 self.opener.fstat(f).st_size >= mmapindexthreshold):
627 indexdata = util.buffer(util.mmapread(f)) 627 indexdata = util.buffer(util.mmapread(f))
628 else: 628 else:
629 indexdata = f.read() 629 indexdata = f.read()
679 self._decompressors = {} 679 self._decompressors = {}
680 680
681 @util.propertycache 681 @util.propertycache
682 def _compressor(self): 682 def _compressor(self):
683 return util.compengines[self._compengine].revlogcompressor() 683 return util.compengines[self._compengine].revlogcompressor()
684
685 def _indexfp(self, mode='r'):
686 """file object for the revlog's index file"""
687 args = {r'mode': mode}
688 if mode != 'r':
689 args[r'checkambig'] = self._checkambig
690 if mode == 'w':
691 args[r'atomictemp'] = True
692 return self.opener(self.indexfile, **args)
684 693
685 def _datafp(self, mode='r'): 694 def _datafp(self, mode='r'):
686 """file object for the revlog's data file""" 695 """file object for the revlog's data file"""
687 return self.opener(self.datafile, mode=mode) 696 return self.opener(self.datafile, mode=mode)
688 697
1496 """ 1505 """
1497 if df is not None: 1506 if df is not None:
1498 closehandle = False 1507 closehandle = False
1499 else: 1508 else:
1500 if self._inline: 1509 if self._inline:
1501 df = self.opener(self.indexfile) 1510 df = self._indexfp()
1502 else: 1511 else:
1503 df = self._datafp() 1512 df = self._datafp()
1504 closehandle = True 1513 closehandle = True
1505 1514
1506 # Cache data both forward and backward around the requested 1515 # Cache data both forward and backward around the requested
1856 for r in self: 1865 for r in self:
1857 df.write(self._getsegmentforrevs(r, r)[1]) 1866 df.write(self._getsegmentforrevs(r, r)[1])
1858 finally: 1867 finally:
1859 df.close() 1868 df.close()
1860 1869
1861 fp = self.opener(self.indexfile, 'w', atomictemp=True, 1870 fp = self._indexfp('w')
1862 checkambig=self._checkambig)
1863 self.version &= ~FLAG_INLINE_DATA 1871 self.version &= ~FLAG_INLINE_DATA
1864 self._inline = False 1872 self._inline = False
1865 for i in self: 1873 for i in self:
1866 e = self._io.packentry(self.index[i], self.node, self.version, i) 1874 e = self._io.packentry(self.index[i], self.node, self.version, i)
1867 fp.write(e) 1875 fp.write(e)
1926 over wire, or read from an external bundle). 1934 over wire, or read from an external bundle).
1927 """ 1935 """
1928 dfh = None 1936 dfh = None
1929 if not self._inline: 1937 if not self._inline:
1930 dfh = self._datafp("a+") 1938 dfh = self._datafp("a+")
1931 ifh = self.opener(self.indexfile, "a+", checkambig=self._checkambig) 1939 ifh = self._indexfp("a+")
1932 try: 1940 try:
1933 return self._addrevision(node, rawtext, transaction, link, p1, p2, 1941 return self._addrevision(node, rawtext, transaction, link, p1, p2,
1934 flags, cachedelta, ifh, dfh, 1942 flags, cachedelta, ifh, dfh,
1935 deltacomputer=deltacomputer) 1943 deltacomputer=deltacomputer)
1936 finally: 1944 finally:
2155 2163
2156 r = len(self) 2164 r = len(self)
2157 end = 0 2165 end = 0
2158 if r: 2166 if r:
2159 end = self.end(r - 1) 2167 end = self.end(r - 1)
2160 ifh = self.opener(self.indexfile, "a+", checkambig=self._checkambig) 2168 ifh = self._indexfp("a+")
2161 isize = r * self._io.size 2169 isize = r * self._io.size
2162 if self._inline: 2170 if self._inline:
2163 transaction.add(self.indexfile, end + isize, r) 2171 transaction.add(self.indexfile, end + isize, r)
2164 dfh = None 2172 dfh = None
2165 else: 2173 else:
2227 if not dfh and not self._inline: 2235 if not dfh and not self._inline:
2228 # addrevision switched from inline to conventional 2236 # addrevision switched from inline to conventional
2229 # reopen the index 2237 # reopen the index
2230 ifh.close() 2238 ifh.close()
2231 dfh = self._datafp("a+") 2239 dfh = self._datafp("a+")
2232 ifh = self.opener(self.indexfile, "a+", 2240 ifh = self._indexfp("a+")
2233 checkambig=self._checkambig)
2234 finally: 2241 finally:
2235 if dfh: 2242 if dfh:
2236 dfh.close() 2243 dfh.close()
2237 ifh.close() 2244 ifh.close()
2238 2245