X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fnode.py;h=d71d21f7a1d2a988d23ba6c12982364136061894;hb=bf43c83ced9389c8fa9468d7c23f67d35af963da;hp=9188022fa208e7a76041afaf253a187b1b19cd62;hpb=e219e0dbd16174fed127a613fb0a0fb3203609f3;p=nepi.git diff --git a/src/nepi/resources/linux/node.py b/src/nepi/resources/linux/node.py index 9188022f..d71d21f7 100644 --- a/src/nepi/resources/linux/node.py +++ b/src/nepi/resources/linux/node.py @@ -196,8 +196,14 @@ class LinuxNode(ResourceManager): # home directory at Linux host self._home_dir = "" - # lock to avoid concurrency issues on methods used by applications - self._lock = threading.Lock() + # lock to prevent concurrent applications on the same node, + # to execute commands at the same time. There are potential + # concurrency issues when using SSH to a same host from + # multiple threads. There are also possible operational + # issues, e.g. an application querying the existence + # of a file or folder prior to its creation, and another + # application creating the same file or folder in between. + self._node_lock = threading.Lock() def log_message(self, msg): return " guid %d - host %s - %s " % (self.guid, @@ -351,7 +357,7 @@ class LinuxNode(ResourceManager): self.discover() self.provision() except: - self._state = ResourceState.FAILED + self.fail() raise # Node needs to wait until all associated interfaces are @@ -456,7 +462,7 @@ class LinuxNode(ResourceManager): env = env) else: if with_lock: - with self._lock: + with self._node_lock: (out, err), proc = sshfuncs.rexec( command, host = self.get("hostname"), @@ -524,7 +530,7 @@ class LinuxNode(ResourceManager): sudo = sudo, user = user) else: - with self._lock: + with self._node_lock: (out, err), proc = sshfuncs.rspawn( command, pidfile = pidfile, @@ -549,7 +555,7 @@ class LinuxNode(ResourceManager): if self.localhost: pidtuple = execfuncs.lgetpid(os.path.join(home, pidfile)) else: - with self._lock: + with self._node_lock: pidtuple = sshfuncs.rgetpid( os.path.join(home, pidfile), host = self.get("hostname"), @@ -566,7 +572,7 @@ class LinuxNode(ResourceManager): if self.localhost: status = execfuncs.lstatus(pid, ppid) else: - with self._lock: + with self._node_lock: status = sshfuncs.rstatus( pid, ppid, host = self.get("hostname"), @@ -588,7 +594,7 @@ class LinuxNode(ResourceManager): if self.localhost: (out, err), proc = execfuncs.lkill(pid, ppid, sudo) else: - with self._lock: + with self._node_lock: (out, err), proc = sshfuncs.rkill( pid, ppid, host = self.get("hostname"), @@ -608,7 +614,7 @@ class LinuxNode(ResourceManager): recursive = True, strict_host_checking = False) else: - with self._lock: + with self._node_lock: (out, err), proc = sshfuncs.rcopy( src, dst, port = self.get("port"),