merge with stable
authorMartin von Zweigbergk <martinvonz@google.com>
Fri, 13 Dec 2019 09:43:43 -0800
changeset 43873 5606e1cb4685
parent 43872 aac921f54554 (current diff)
parent 43462 612b4b63fb22 (diff)
child 43874 bc7d8f45c3b6
merge with stable
hgext/remotefilelog/__init__.py
hgext/remotefilelog/repack.py
mercurial/utils/procutil.py
mercurial/utils/resourceutil.py
--- a/hgext/remotefilelog/__init__.py	Mon Dec 09 22:24:58 2019 -0800
+++ b/hgext/remotefilelog/__init__.py	Fri Dec 13 09:43:43 2019 -0800
@@ -229,7 +229,7 @@
 configitem(b'packs', b'maxpacksize', default=0)
 configitem(b'packs', b'maxchainlen', default=1000)
 
-configitem(b'devel', b'remotefilelog.ensurestart', default=False)
+configitem(b'devel', b'remotefilelog.bg-wait', default=False)
 
 #  default TTL limit is 30 days
 _defaultlimit = 60 * 60 * 24 * 30
@@ -1080,26 +1080,19 @@
         prefetchrevset = ui.config(b'remotefilelog', b'pullprefetch')
         bgrepack = repo.ui.configbool(b'remotefilelog', b'backgroundrepack')
         bgprefetch = repo.ui.configbool(b'remotefilelog', b'backgroundprefetch')
-        ensurestart = repo.ui.configbool(b'devel', b'remotefilelog.ensurestart')
 
         if prefetchrevset:
             ui.status(_(b"prefetching file contents\n"))
             revs = scmutil.revrange(repo, [prefetchrevset])
             base = repo[b'.'].rev()
             if bgprefetch:
-                repo.backgroundprefetch(
-                    prefetchrevset, repack=bgrepack, ensurestart=ensurestart
-                )
+                repo.backgroundprefetch(prefetchrevset, repack=bgrepack)
             else:
                 repo.prefetch(revs, base=base)
                 if bgrepack:
-                    repackmod.backgroundrepack(
-                        repo, incremental=True, ensurestart=ensurestart
-                    )
+                    repackmod.backgroundrepack(repo, incremental=True)
         elif bgrepack:
-            repackmod.backgroundrepack(
-                repo, incremental=True, ensurestart=ensurestart
-            )
+            repackmod.backgroundrepack(repo, incremental=True)
 
     return result
 
@@ -1250,13 +1243,9 @@
     revs = scmutil.revrange(repo, opts.get(b'rev'))
     repo.prefetch(revs, opts.get(b'base'), pats, opts)
 
-    ensurestart = repo.ui.configbool(b'devel', b'remotefilelog.ensurestart')
-
     # Run repack in background
     if opts.get(b'repack'):
-        repackmod.backgroundrepack(
-            repo, incremental=True, ensurestart=ensurestart
-        )
+        repackmod.backgroundrepack(repo, incremental=True)
 
 
 @command(
@@ -1276,12 +1265,10 @@
 )
 def repack_(ui, repo, *pats, **opts):
     if opts.get('background'):
-        ensurestart = repo.ui.configbool(b'devel', b'remotefilelog.ensurestart')
         repackmod.backgroundrepack(
             repo,
             incremental=opts.get('incremental'),
             packsonly=opts.get('packsonly', False),
-            ensurestart=ensurestart,
         )
         return
 
--- a/hgext/remotefilelog/repack.py	Mon Dec 09 22:24:58 2019 -0800
+++ b/hgext/remotefilelog/repack.py	Fri Dec 13 09:43:43 2019 -0800
@@ -36,9 +36,7 @@
     pass
 
 
-def backgroundrepack(
-    repo, incremental=True, packsonly=False, ensurestart=False
-):
+def backgroundrepack(repo, incremental=True, packsonly=False):
     cmd = [procutil.hgexecutable(), b'-R', repo.origroot, b'repack']
     msg = _(b"(running background repack)\n")
     if incremental:
@@ -48,7 +46,11 @@
         cmd.append(b'--packsonly')
     repo.ui.warn(msg)
     # We know this command will find a binary, so don't block on it starting.
-    procutil.runbgcommand(cmd, encoding.environ, ensurestart=ensurestart)
+    kwargs = {}
+    if repo.ui.configbool(b'devel', b'remotefilelog.bg-wait'):
+        kwargs['record_wait'] = repo.ui.atexit
+
+    procutil.runbgcommand(cmd, encoding.environ, ensurestart=False, **kwargs)
 
 
 def fullrepack(repo, options=None):
--- a/hgext/remotefilelog/shallowrepo.py	Mon Dec 09 22:24:58 2019 -0800
+++ b/hgext/remotefilelog/shallowrepo.py	Fri Dec 13 09:43:43 2019 -0800
@@ -215,13 +215,7 @@
             )
 
         def backgroundprefetch(
-            self,
-            revs,
-            base=None,
-            repack=False,
-            pats=None,
-            opts=None,
-            ensurestart=False,
+            self, revs, base=None, repack=False, pats=None, opts=None
         ):
             """Runs prefetch in background with optional repack
             """
@@ -232,8 +226,12 @@
                 cmd += [b'-r', revs]
             # We know this command will find a binary, so don't block
             # on it starting.
+            kwargs = {}
+            if repo.ui.configbool(b'devel', b'remotefilelog.bg-wait'):
+                kwargs['record_wait'] = repo.ui.atexit
+
             procutil.runbgcommand(
-                cmd, encoding.environ, ensurestart=ensurestart
+                cmd, encoding.environ, ensurestart=False, **kwargs
             )
 
         def prefetch(self, revs, base=None, pats=None, opts=None):
--- a/mercurial/utils/procutil.py	Mon Dec 09 22:24:58 2019 -0800
+++ b/mercurial/utils/procutil.py	Fri Dec 13 09:43:43 2019 -0800
@@ -540,12 +540,18 @@
     )
 
     def runbgcommand(
-        script, env, shell=False, stdout=None, stderr=None, ensurestart=True
+        script,
+        env,
+        shell=False,
+        stdout=None,
+        stderr=None,
+        ensurestart=True,
+        record_wait=None,
     ):
         '''Spawn a command without waiting for it to finish.'''
         # we can't use close_fds *and* redirect stdin. I'm not sure that we
         # need to because the detached process has no console connection.
-        subprocess.Popen(
+        p = subprocess.Popen(
             tonativestr(script),
             shell=shell,
             env=tonativeenv(env),
@@ -554,46 +560,64 @@
             stdout=stdout,
             stderr=stderr,
         )
+        if record_wait is not None:
+            record_wait(p.wait)
 
 
 else:
 
     def runbgcommand(
-        cmd, env, shell=False, stdout=None, stderr=None, ensurestart=True
+        cmd,
+        env,
+        shell=False,
+        stdout=None,
+        stderr=None,
+        ensurestart=True,
+        record_wait=None,
     ):
-        '''Spawn a command without waiting for it to finish.'''
+        '''Spawn a command without waiting for it to finish.
+
+
+        When `record_wait` is not None, the spawned process will not be fully
+        detached and the `record_wait` argument will be called with a the
+        `Subprocess.wait` function for the spawned process.  This is mostly
+        useful for developers that need to make sure the spawned process
+        finished before a certain point. (eg: writing test)'''
         # double-fork to completely detach from the parent process
         # based on http://code.activestate.com/recipes/278731
-        pid = os.fork()
-        if pid:
-            if not ensurestart:
+        if record_wait is None:
+            pid = os.fork()
+            if pid:
+                if not ensurestart:
+                    return
+                # Parent process
+                (_pid, status) = os.waitpid(pid, 0)
+                if os.WIFEXITED(status):
+                    returncode = os.WEXITSTATUS(status)
+                else:
+                    returncode = -(os.WTERMSIG(status))
+                if returncode != 0:
+                    # The child process's return code is 0 on success, an errno
+                    # value on failure, or 255 if we don't have a valid errno
+                    # value.
+                    #
+                    # (It would be slightly nicer to return the full exception info
+                    # over a pipe as the subprocess module does.  For now it
+                    # doesn't seem worth adding that complexity here, though.)
+                    if returncode == 255:
+                        returncode = errno.EINVAL
+                    raise OSError(
+                        returncode,
+                        b'error running %r: %s'
+                        % (cmd, os.strerror(returncode)),
+                    )
                 return
-            # Parent process
-            (_pid, status) = os.waitpid(pid, 0)
-            if os.WIFEXITED(status):
-                returncode = os.WEXITSTATUS(status)
-            else:
-                returncode = -(os.WTERMSIG(status))
-            if returncode != 0:
-                # The child process's return code is 0 on success, an errno
-                # value on failure, or 255 if we don't have a valid errno
-                # value.
-                #
-                # (It would be slightly nicer to return the full exception info
-                # over a pipe as the subprocess module does.  For now it
-                # doesn't seem worth adding that complexity here, though.)
-                if returncode == 255:
-                    returncode = errno.EINVAL
-                raise OSError(
-                    returncode,
-                    b'error running %r: %s' % (cmd, os.strerror(returncode)),
-                )
-            return
 
         returncode = 255
         try:
-            # Start a new session
-            os.setsid()
+            if record_wait is None:
+                # Start a new session
+                os.setsid()
 
             stdin = open(os.devnull, b'r')
             if stdout is None:
@@ -603,7 +627,7 @@
 
             # connect stdin to devnull to make sure the subprocess can't
             # muck up that stream for mercurial.
-            subprocess.Popen(
+            p = subprocess.Popen(
                 cmd,
                 shell=shell,
                 env=env,
@@ -612,6 +636,8 @@
                 stdout=stdout,
                 stderr=stderr,
             )
+            if record_wait is not None:
+                record_wait(p.wait)
             returncode = 0
         except EnvironmentError as ex:
             returncode = ex.errno & 0xFF
@@ -624,4 +650,5 @@
         finally:
             # mission accomplished, this child needs to exit and not
             # continue the hg process here.
-            os._exit(returncode)
+            if record_wait is None:
+                os._exit(returncode)
--- a/tests/test-remotefilelog-bgprefetch.t	Mon Dec 09 22:24:58 2019 -0800
+++ b/tests/test-remotefilelog-bgprefetch.t	Fri Dec 13 09:43:43 2019 -0800
@@ -1,11 +1,9 @@
 #require no-windows
 
   $ . "$TESTDIR/remotefilelog-library.sh"
-# devel.remotefilelog.ensurestart: reduce race condition with
-# waiton{repack/prefetch}
   $ cat >> $HGRCPATH <<EOF
   > [devel]
-  > remotefilelog.ensurestart=True
+  > remotefilelog.bg-wait=True
   > EOF
 
   $ hg init master
@@ -78,8 +76,6 @@
   new changesets 6b4b6f66ef8c
   (run 'hg update' to get a working copy)
   prefetching file contents
-  $ sleep 0.5
-  $ hg debugwaitonprefetch >/dev/null 2>%1
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/11/f6ad8ec52a2984abaafd7c3b516503785c2072/ef95c5376f34698742fe34f315fd82136f8f68c0
   $TESTTMP/hgcache/master/95/cb0bfd2977c761298d9624e4b4d4c72a39974a/076f5e2225b3ff0400b98c92aa6cdf403ee24cca
@@ -107,11 +103,6 @@
   new changesets 6b4b6f66ef8c
   (run 'hg update' to get a working copy)
   prefetching file contents
-  $ sleep 0.5
-  $ hg debugwaitonprefetch >/dev/null 2>%1
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 0.5
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/6e8633deba6e544e5f8edbd7b996d6e31a2c42ae.histidx
   $TESTTMP/hgcache/master/packs/6e8633deba6e544e5f8edbd7b996d6e31a2c42ae.histpack
@@ -143,11 +134,6 @@
   $ hg up -r 0
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   * files fetched over * fetches - (* misses, 0.00% hit ratio) over *s (glob)
-  $ sleep 1
-  $ hg debugwaitonprefetch >/dev/null 2>%1
-  $ sleep 1
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 1
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histidx
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histpack
@@ -195,11 +181,6 @@
   $ hg commit -qAm b
   * files fetched over 1 fetches - (* misses, 0.00% hit ratio) over *s (glob)
   $ hg bookmark temporary
-  $ sleep 1
-  $ hg debugwaitonprefetch >/dev/null 2>%1
-  $ sleep 1
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 1
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histidx
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histpack
@@ -237,19 +218,14 @@
 # background prefetch with repack on rebase when wcprevset configured
 
   $ hg up -r 2
-  3 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
   (leaving bookmark temporary)
   $ clearcache
   $ find $CACHEDIR -type f | sort
   $ hg rebase -s temporary -d foo
-  rebasing 3:58147a5b5242 "b" (temporary tip)
-  saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/58147a5b5242-c3678817-rebase.hg
+  rebasing 3:d9cf06e3b5b6 "b" (temporary tip)
+  saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/d9cf06e3b5b6-e5c3dc63-rebase.hg
   3 files fetched over 1 fetches - (3 misses, 0.00% hit ratio) over *s (glob)
-  $ sleep 1
-  $ hg debugwaitonprefetch >/dev/null 2>%1
-  $ sleep 1
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 1
 
 # Ensure that file 'y' was prefetched - it was not part of the rebase operation and therefore
 # could only be downloaded by the background prefetch
@@ -281,7 +257,7 @@
 # Check that foregound prefetch with no arguments blocks until background prefetches finish
 
   $ hg up -r 3
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ clearcache
   $ hg prefetch --repack
   waiting for lock on prefetching in $TESTTMP/shallow held by process * on host * (glob) (?)
@@ -289,10 +265,6 @@
   (running background incremental repack)
   * files fetched over 1 fetches - (* misses, 0.00% hit ratio) over *s (glob) (?)
 
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 0.5
-
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histidx
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histpack
@@ -333,9 +305,6 @@
   got lock after * seconds (glob) (?)
   (running background incremental repack)
   * files fetched over 1 fetches - (* misses, 0.00% hit ratio) over *s (glob) (?)
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
-  $ sleep 0.5
 
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/8f1443d44e57fec96f72fb2412e01d2818767ef2.histidx
--- a/tests/test-remotefilelog-gcrepack.t	Mon Dec 09 22:24:58 2019 -0800
+++ b/tests/test-remotefilelog-gcrepack.t	Fri Dec 13 09:43:43 2019 -0800
@@ -40,8 +40,6 @@
   $ hg prefetch
   2 files fetched over 1 fetches - (2 misses, 0.00% hit ratio) over *s (glob)
   $ hg repack
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
 
   $ find $CACHEDIR | sort | egrep ".datapack|.histpack"
   $TESTTMP/hgcache/master/packs/7bcd2d90b99395ca43172a0dd24e18860b2902f9.histpack
@@ -73,8 +71,6 @@
   > EOF
 
   $ hg repack
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
 
   $ find $CACHEDIR | sort | egrep ".datapack|.histpack"
   $TESTTMP/hgcache/master/packs/7bcd2d90b99395ca43172a0dd24e18860b2902f9.histpack
@@ -101,8 +97,6 @@
   $ hg prefetch
   2 files fetched over 1 fetches - (2 misses, 0.00% hit ratio) over *s (glob)
   $ hg repack
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
 
   $ find $CACHEDIR | sort | egrep ".datapack|.histpack"
   $TESTTMP/hgcache/master/packs/7bcd2d90b99395ca43172a0dd24e18860b2902f9.histpack
@@ -135,8 +129,6 @@
   > EOF
 
   $ hg repack
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>%1
 
   $ find $CACHEDIR | sort | egrep ".datapack|.histpack"
   $TESTTMP/hgcache/master/packs/7bcd2d90b99395ca43172a0dd24e18860b2902f9.histpack
--- a/tests/test-remotefilelog-repack-fast.t	Mon Dec 09 22:24:58 2019 -0800
+++ b/tests/test-remotefilelog-repack-fast.t	Fri Dec 13 09:43:43 2019 -0800
@@ -1,13 +1,12 @@
 #require no-windows
 
   $ . "$TESTDIR/remotefilelog-library.sh"
-# devel.remotefilelog.ensurestart: reduce race condition with
-# waiton{repack/prefetch}
+
   $ cat >> $HGRCPATH <<EOF
   > [remotefilelog]
   > fastdatapack=True
   > [devel]
-  > remotefilelog.ensurestart=True
+  > remotefilelog.bg-wait=True
   > EOF
 
   $ hg init master
@@ -142,8 +141,6 @@
 
   $ hg repack --background
   (running background repack)
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>&1
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/39443fa1064182e93d968b5cba292eb5283260d0.dataidx
   $TESTTMP/hgcache/master/packs/39443fa1064182e93d968b5cba292eb5283260d0.datapack
@@ -342,8 +339,6 @@
   searching for changes
   no changes found
   (running background incremental repack)
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>&1
   $ ls_l $TESTTMP/hgcache/master/packs/ | grep datapack
   -r--r--r--     303 156a6c1c83aeb69422d7936e0a46ba9bc06a71c0.datapack
   $ ls_l $TESTTMP/hgcache/master/packs/ | grep histpack
--- a/tests/test-remotefilelog-repack.t	Mon Dec 09 22:24:58 2019 -0800
+++ b/tests/test-remotefilelog-repack.t	Fri Dec 13 09:43:43 2019 -0800
@@ -1,11 +1,9 @@
 #require no-windows
 
   $ . "$TESTDIR/remotefilelog-library.sh"
-# devel.remotefilelog.ensurestart: reduce race condition with
-# waiton{repack/prefetch}
   $ cat >> $HGRCPATH <<EOF
   > [devel]
-  > remotefilelog.ensurestart=True
+  > remotefilelog.bg-wait=True
   > EOF
 
   $ hg init master
@@ -152,8 +150,6 @@
 
   $ hg repack --background
   (running background repack)
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>&1
   $ find $CACHEDIR -type f | sort
   $TESTTMP/hgcache/master/packs/39443fa1064182e93d968b5cba292eb5283260d0.dataidx
   $TESTTMP/hgcache/master/packs/39443fa1064182e93d968b5cba292eb5283260d0.datapack
@@ -371,8 +367,6 @@
   searching for changes
   no changes found
   (running background incremental repack)
-  $ sleep 0.5
-  $ hg debugwaitonrepack >/dev/null 2>&1
   $ ls_l $TESTTMP/hgcache/master/packs/ | grep datapack
   -r--r--r--     303 156a6c1c83aeb69422d7936e0a46ba9bc06a71c0.datapack
   $ ls_l $TESTTMP/hgcache/master/packs/ | grep histpack