[PATCH 7 of 9] store: replace invocation of "getsize()" by "vfs.stat()"

Adrian Buehlmann adrian at cadifra.com
Mon Oct 8 15:57:24 CDT 2012


On 2012-10-08 19:06, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1349714515 -32400
> # Node ID 6353632376a81896afadcef810da1cf1c3c6d56f
> # Parent  ef7a5af78db825a4e8f00f7f6a65d0b509a3eeb5
> store: replace invocation of "getsize()" by "vfs.stat()"
> 
> This patch replaces invocation of "getsize()", which calls "os.stat()"
> internally, by "vfs.stat()".
> 
> The object referred by "self.rawvfs" is used internally by
> "_fncachevfs" and doesn't encode filename for each file API invocation.
> 
> This patch invokes "os.stat()" via "self.rawvfs" to avoid redundant
> filename encoding: invocation of "os.stat()" via "self.vfs" hides
> filename encoding and encoding result from caller, so it is not
> appropriate, when both encoded and non-encoded filenames should be
> yield.
> 
> Even though changeset b42b0729744d improved stream_out performance by
> "self.pathsep + path", this patch replaces it by
> "os.path.join(self.base, path)" of vfs. So, this may increase cost to
> join path components.
> 
> But this shouldn't have large impact, because:
> 
>   - such cost is much less than cost of "os.stat()" which causes
>     system call invocation
> 
>   - "datafiles()" of store object is invoked only for "hg manifest
>     --all" or "hg verify" which are both heavy functions
> 
> diff -r ef7a5af78db8 -r 6353632376a8 mercurial/store.py
> --- a/mercurial/store.py	Tue Oct 09 01:41:55 2012 +0900
> +++ b/mercurial/store.py	Tue Oct 09 01:41:55 2012 +0900
> @@ -459,6 +459,7 @@
>          self.pathsep = self.path + '/'
>          self.createmode = _calcmode(vfs)
>          vfs.createmode = self.createmode
> +        self.rawvfs = vfs
>          fnc = fncache(vfs)
>          self.fncache = fnc
>          self.vfs = _fncachevfs(vfs, fnc, encode)
> @@ -467,16 +468,14 @@
>      def join(self, f):
>          return self.pathsep + self.encode(f)
>  
> -    def getsize(self, path):
> -        return os.stat(self.pathsep + path).st_size
> -

This backouts d592759aabc7 by Bryan ("store: abstract out how we
retrieve a file's size")

I think he did this for his packrepo extension:
http://markmail.org/message/fip3ca2xre7g3tf2

>      def datafiles(self):
>          rewrite = False
>          existing = []
> +        getstat = self.rawvfs.stat
>          for f in sorted(self.fncache):
>              ef = self.encode(f)
>              try:
> -                yield f, ef, self.getsize(ef)
> +                yield f, ef, getstat(ef).st_size
>                  existing.append(f)
>              except OSError, err:
>                  if err.errno != errno.ENOENT:



More information about the Mercurial-devel mailing list