From 127dc95c83b570a2b7981b6eeb03ef6d768f4471 Mon Sep 17 00:00:00 2001 From: luxiaoyong <512667678@qq.com> Date: Sun, 26 Nov 2023 11:28:25 +0800 Subject: [PATCH 1/2] Bug fix:WorkTree Function Exception --rcopy --- lib/ClusterShell/Worker/Tree.py | 45 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/lib/ClusterShell/Worker/Tree.py b/lib/ClusterShell/Worker/Tree.py index 55cd0b55..3ba8d7c4 100644 --- a/lib/ClusterShell/Worker/Tree.py +++ b/lib/ClusterShell/Worker/Tree.py @@ -431,30 +431,35 @@ def _on_remote_node_close(self, node, rc, gateway): """remote node closing with return code""" DistantWorker._on_node_close(self, node, rc) self.logger.debug("_on_remote_node_close %s %s via gw %s", node, - self._close_count, gateway) + self._close_count, gateway) + node_arr = [] # finalize rcopy: extract tar data if self.source and self.reverse: for bnode, buf in self._rcopy_bufs.items(): - tarfileobj = self._rcopy_tars[bnode] - if len(buf) > 0: - self.logger.debug("flushing node %s buf %d bytes", bnode, - len(buf)) - tarfileobj.write(buf) - tarfileobj.flush() - tarfileobj.seek(0) - tmptar = tarfile.open(fileobj=tarfileobj) - try: - self.logger.debug("%s extracting %d members in dest %s", - bnode, len(tmptar.getmembers()), - self.dest) - tmptar.extractall(path=self.dest) - except IOError as ex: - self._on_remote_node_msgline(bnode, ex, 'stderr', gateway) - finally: - tmptar.close() - self._rcopy_bufs = {} - self._rcopy_tars = {} + if bnode == node: + node_arr.append(bnode) + tarfileobj = self._rcopy_tars[bnode] + if len(buf) > 0: + self.logger.debug("flushing node %s buf %d bytes", bnode, + len(buf)) + tarfileobj.write(buf) + tarfileobj.flush() + tarfileobj.seek(0) + tmptar = tarfile.open(fileobj=tarfileobj) + try: + self.logger.debug("%s extracting %d members in dest %s", + bnode, len(tmptar.getmembers()), + self.dest) + tmptar.extractall(path=self.dest) + except IOError as ex: + self._on_remote_node_msgline(bnode, ex, 'stderr', gateway) + finally: + tmptar.close() + + for item_node in node_arr: + del self._rcopy_bufs[item_node] + del self._rcopy_tars[item_node] self.gwtargets[str(gateway)].remove(node) self._close_count += 1 From ea64ca6a44efcef0d21538cf6db8c4584ffa7d25 Mon Sep 17 00:00:00 2001 From: Stephane Thiell Date: Sun, 3 Aug 2025 00:16:44 -0700 Subject: [PATCH 2/2] Tree: fix rcopy handling when remote node closes (#545) Fix defect in Tree._on_remote_node_close() for rcopy. Now when a remote node closes, just finish extracting locally without impacting other nodes. Closes #545. --- lib/ClusterShell/Worker/Tree.py | 49 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/ClusterShell/Worker/Tree.py b/lib/ClusterShell/Worker/Tree.py index 3ba8d7c4..bb326418 100644 --- a/lib/ClusterShell/Worker/Tree.py +++ b/lib/ClusterShell/Worker/Tree.py @@ -431,35 +431,32 @@ def _on_remote_node_close(self, node, rc, gateway): """remote node closing with return code""" DistantWorker._on_node_close(self, node, rc) self.logger.debug("_on_remote_node_close %s %s via gw %s", node, - self._close_count, gateway) + self._close_count, gateway) - node_arr = [] # finalize rcopy: extract tar data if self.source and self.reverse: - for bnode, buf in self._rcopy_bufs.items(): - if bnode == node: - node_arr.append(bnode) - tarfileobj = self._rcopy_tars[bnode] - if len(buf) > 0: - self.logger.debug("flushing node %s buf %d bytes", bnode, - len(buf)) - tarfileobj.write(buf) - tarfileobj.flush() - tarfileobj.seek(0) - tmptar = tarfile.open(fileobj=tarfileobj) - try: - self.logger.debug("%s extracting %d members in dest %s", - bnode, len(tmptar.getmembers()), - self.dest) - tmptar.extractall(path=self.dest) - except IOError as ex: - self._on_remote_node_msgline(bnode, ex, 'stderr', gateway) - finally: - tmptar.close() - - for item_node in node_arr: - del self._rcopy_bufs[item_node] - del self._rcopy_tars[item_node] + if node in self._rcopy_bufs: + buf = self._rcopy_bufs[node] + tarfileobj = self._rcopy_tars[node] + if len(buf) > 0: + self.logger.debug("flushing node %s buf %d bytes", node, + len(buf)) + tarfileobj.write(buf) + tarfileobj.flush() + tarfileobj.seek(0) + tmptar = tarfile.open(fileobj=tarfileobj) + try: + self.logger.debug("%s extracting %d members in dest %s", + node, len(tmptar.getmembers()), self.dest) + tmptar.extractall(path=self.dest) + except IOError as ex: + self._on_remote_node_msgline(node, ex, 'stderr', gateway) + finally: + tmptar.close() + del self._rcopy_bufs[node] + del self._rcopy_tars[node] + else: + self.logger.debug("no rcopy buffer received from %s", node) self.gwtargets[str(gateway)].remove(node) self._close_count += 1