changeset 2075:343aeefb553b

Make the appendfile class inline-data index friendly The appendfile class needs a few changes to make it work with interleaved index files. It needs to support the tell() method, opening in a+ mode, and it needs to delay the checkinlinesize call until after the append file is written. Given that open(file, "a+") doesn't always seek to the end of the file, this adds seek operations to appendfile that understand whence args
author mason@suse.com
date Tue, 04 Apr 2006 16:38:43 -0400
parents 01ee43dda681
children d007df6daf8e
files mercurial/appendfile.py mercurial/localrepo.py mercurial/revlog.py
diffstat 3 files changed, 35 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/appendfile.py	Tue Apr 04 16:38:43 2006 -0400
+++ b/mercurial/appendfile.py	Tue Apr 04 16:38:43 2006 -0400
@@ -42,9 +42,19 @@
         # seek and read can be fast.
         self.fpsize = os.fstat(fp.fileno()).st_size
 
-    def seek(self, offset):
+    def end(self):
+        self.tmpfp.flush() # make sure the stat is correct
+        return self.fpsize + os.fstat(self.tmpfp.fileno()).st_size
+
+    def seek(self, offset, whence=0):
         '''virtual file offset spans real file and temp file.'''
-        self.offset = offset
+        if whence == 0:
+            self.offset = offset
+        elif whence == 1:
+            self.offset += offset
+        elif whence == 2:
+            self.offset = self.end() + offset
+
         if self.offset < self.fpsize:
             self.realfp.seek(self.offset)
         else:
@@ -103,8 +113,16 @@
         self.fp = fp
         self.offset = 0
 
-    def seek(self, offset):
-        self.offset = offset
+    def tell(self):
+        return self.offset
+
+    def seek(self, offset, whence=0):
+        if whence == 0:
+            self.offset = offset
+        elif whence == 1:
+            self.offset += offset
+        elif whence == 2:
+            self.offset = self.fp.end() + offset
 
     def read(self, count=-1):
         try:
@@ -143,7 +161,7 @@
         '''open file.  return same cached appendfile object for every
         later call.'''
 
-        assert mode in 'ra'
+        assert mode in 'ra+'
         fp = self.fps.get(name)
         if fp is None:
             fp = appendfile(self.realopener(name, 'a+'))
@@ -165,8 +183,12 @@
     def __init__(self, opener):
         appendopener.__init__(self, opener)
         changelog.changelog.__init__(self, self)
+    def checkinlinesize(self, fp, tr):
+        return
 
 class appendmanifest(manifest.manifest, appendopener):
     def __init__(self, opener):
         appendopener.__init__(self, opener)
         manifest.manifest.__init__(self, self)
+    def checkinlinesize(self, fp, tr):
+        return
--- a/mercurial/localrepo.py	Tue Apr 04 16:38:43 2006 -0400
+++ b/mercurial/localrepo.py	Tue Apr 04 16:38:43 2006 -0400
@@ -168,6 +168,7 @@
             try:
                 return self.changelog.lookup(key)
             except:
+                raise
                 raise repo.RepoError(_("unknown revision '%s'") % key)
 
     def dev(self):
@@ -1456,6 +1457,8 @@
         # make changelog and manifest see real files again
         self.changelog = changelog.changelog(self.opener)
         self.manifest = manifest.manifest(self.opener)
+        self.changelog.checkinlinesize(tr)
+        self.changelog.checkinlinesize(tr)
 
         newheads = len(self.changelog.heads())
         heads = ""
--- a/mercurial/revlog.py	Tue Apr 04 16:38:43 2006 -0400
+++ b/mercurial/revlog.py	Tue Apr 04 16:38:43 2006 -0400
@@ -675,9 +675,11 @@
         self.cache = (node, rev, text)
         return text
 
-    def checkinlinesize(self, fp, tr):
+    def checkinlinesize(self, tr, fp=None):
         if not self.inlinedata():
             return
+        if not fp:
+            fp = self.opener(self.indexfile, 'r')
         size = fp.tell()
         if size < 131072:
             return
@@ -786,7 +788,7 @@
         if self.inlinedata():
             f.write(data[0])
             f.write(data[1])
-            self.checkinlinesize(f, transaction)
+            self.checkinlinesize(transaction, f)
 
         self.cache = (node, n, text)
         return node
@@ -966,7 +968,7 @@
                 if self.inlinedata():
                     ifh.write(struct.pack(self.indexformat, *e))
                     ifh.write(cdelta)
-                    self.checkinlinesize(ifh, transaction)
+                    self.checkinlinesize(transaction, ifh)
                     if not self.inlinedata():
                         dfh = self.opener(self.datafile, "a")
                         ifh = self.opener(self.indexfile, "a")