chgserver: truncate base address at "." for hash address

Previously, the hash address is just appending "-$HASH" to base address.
This patch makes it truncate the basename address at "." before appending
"-$HASH".

This makes it possible to spawn new servers in a racy situation and the
client could be sure the server it connects is the new server just spawned.

This is a step towards removing the lock.

One of the functionalities of the lock is to make sure the connect will
connect to a server it just created:

  1. start server --address foo
  2. connect to foo # wish "foo" is the server just started

With this change, the client could do:

  1. start server --address foo.tmp$PID
  2. connect to foo.tmp$PID # is the server just started
     (note: if it is not, it does not affect correctness - linux pid
      namespace is not a concern here)
  3. rename foo.tmp$PID to foo

Another functionality of the lock is to avoid starting multiple servers with
a same confighash in parallel. But that also prevents starting multiple
servers with different confighashes in parallel.
This commit is contained in:
Jun Wu 2016-12-19 22:07:41 +00:00
parent 26dd8d740c
commit 5508cfe721

View File

@ -526,7 +526,12 @@ def _tempaddress(address):
return '%s.%d.tmp' % (address, os.getpid())
def _hashaddress(address, hashstr):
return '%s-%s' % (address, hashstr)
# if the basename of address contains '.', use only the left part. this
# makes it possible for the client to pass 'server.tmp$PID' and follow by
# an atomic rename to avoid locking when spawning new servers.
dirname, basename = os.path.split(address)
basename = basename.split('.', 1)[0]
return '%s-%s' % (os.path.join(dirname, basename), hashstr)
class chgunixservicehandler(object):
"""Set of operations for chg services"""