[PATCH 2 of 2] chgserver: invalidate the server if extensions fail to load

Jun Wu quark at fb.com
Mon Mar 14 10:37:08 EDT 2016


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1457756651 0
#      Sat Mar 12 04:24:11 2016 +0000
# Node ID 75c6ef083439443ce74e49b83f1cd083c73cde82
# Parent  936faaa3e25b71c36fa4f5c966f15849a00a9ef7
chgserver: invalidate the server if extensions fail to load

Previously, if extensions fail to load, chg server will just keep working
without those extensions. It will print a warning message but only if a new
server starts.

This patch invalidates the server if any extension failed to load, but still
serve the client (hopefully just) once. It will help chg pass some test cases
of test-bad-extension.t.

diff --git a/hgext/chgserver.py b/hgext/chgserver.py
--- a/hgext/chgserver.py
+++ b/hgext/chgserver.py
@@ -451,7 +451,10 @@
         if newhash.mtimehash != self.hashstate.mtimehash:
             addr = _hashaddress(self.baseaddress, self.hashstate.confighash)
             insts.append('unlink %s' % addr)
-            insts.append('reconnect')
+            # mtimehash is empty if one or more extensions fail to load.
+            # to be compatible with hg, still serve the client this time.
+            if self.hashstate.mtimehash:
+                insts.append('reconnect')
         if newhash.confighash != self.hashstate.confighash:
             addr = _hashaddress(self.baseaddress, newhash.confighash)
             insts.append('redirect %s' % addr)
@@ -630,6 +633,7 @@
 class chgunixservice(commandserver.unixservice):
     def init(self):
         self._inithashstate()
+        self._checkextensions()
         class cls(AutoExitMixIn, SocketServer.ForkingMixIn,
                   SocketServer.UnixStreamServer):
             ui = self.ui
@@ -642,6 +646,15 @@
         self.server.startautoexitthread()
         self._createsymlink()
 
+    def _checkextensions(self):
+        if not self.hashstate:
+            return
+        if extensions.notloaded():
+            # one or more extensions failed to load. mtimehash becomes
+            # meaningless because we do not know the paths of those extensions.
+            # set mtimehash to an illegal hash value to invalidate the server.
+            self.hashstate.mtimehash = ''
+
     def _inithashstate(self):
         self.baseaddress = self.address
         if self.ui.configbool('chgserver', 'skiphash', False):


More information about the Mercurial-devel mailing list