def Lock(self, sender, lock_name): if lock_name not in self.locks: return "lock %s does not exist" % lock_name, None logger.debug("%s wants the lock", sender, extra={"mode": "server"}) client_id = self._get_id() self.locks[lock_name].acquire() self.owners[lock_name] = client_id logger.debug("%s has the lock w/ id %s", sender, client_id, extra={"mode": "server"}) return OK, client_id
def CreateLock(self, sender, lock_name): logger.debug("creating lock %s", lock_name, extra={"mode": "server"}) # Create is idempotent, so don't error if lock_name in self.locks: return OK, None self.locks[lock_name] = threading.Lock() self.owners[lock_name] = None return OK, None
def Release(self, sender, lock_name, client_id): if lock_name not in self.locks: return "lock %s does not exist" % lock_name, None if client_id != self.owners[lock_name]: return "you do not own lock %s" % lock_name, None self.owners[lock_name] = None self.locks[lock_name].release() logger.debug("%s has released lock" % sender, extra={"mode": "server"}) return OK, None
def _caller(**kwargs): logger.debug("[Server %s][Method %s][Args %s]", self.addr, attr, kwargs, extra={"mode":"client"}) msg = RpcMessage(method=attr, **kwargs) return self._call(self.addr, msg)