Skip to content

Commit ea64ca6

Browse files
committed
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.
1 parent 127dc95 commit ea64ca6

File tree

1 file changed

+23
-26
lines changed

1 file changed

+23
-26
lines changed

lib/ClusterShell/Worker/Tree.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -431,35 +431,32 @@ def _on_remote_node_close(self, node, rc, gateway):
431431
"""remote node closing with return code"""
432432
DistantWorker._on_node_close(self, node, rc)
433433
self.logger.debug("_on_remote_node_close %s %s via gw %s", node,
434-
self._close_count, gateway)
434+
self._close_count, gateway)
435435

436-
node_arr = []
437436
# finalize rcopy: extract tar data
438437
if self.source and self.reverse:
439-
for bnode, buf in self._rcopy_bufs.items():
440-
if bnode == node:
441-
node_arr.append(bnode)
442-
tarfileobj = self._rcopy_tars[bnode]
443-
if len(buf) > 0:
444-
self.logger.debug("flushing node %s buf %d bytes", bnode,
445-
len(buf))
446-
tarfileobj.write(buf)
447-
tarfileobj.flush()
448-
tarfileobj.seek(0)
449-
tmptar = tarfile.open(fileobj=tarfileobj)
450-
try:
451-
self.logger.debug("%s extracting %d members in dest %s",
452-
bnode, len(tmptar.getmembers()),
453-
self.dest)
454-
tmptar.extractall(path=self.dest)
455-
except IOError as ex:
456-
self._on_remote_node_msgline(bnode, ex, 'stderr', gateway)
457-
finally:
458-
tmptar.close()
459-
460-
for item_node in node_arr:
461-
del self._rcopy_bufs[item_node]
462-
del self._rcopy_tars[item_node]
438+
if node in self._rcopy_bufs:
439+
buf = self._rcopy_bufs[node]
440+
tarfileobj = self._rcopy_tars[node]
441+
if len(buf) > 0:
442+
self.logger.debug("flushing node %s buf %d bytes", node,
443+
len(buf))
444+
tarfileobj.write(buf)
445+
tarfileobj.flush()
446+
tarfileobj.seek(0)
447+
tmptar = tarfile.open(fileobj=tarfileobj)
448+
try:
449+
self.logger.debug("%s extracting %d members in dest %s",
450+
node, len(tmptar.getmembers()), self.dest)
451+
tmptar.extractall(path=self.dest)
452+
except IOError as ex:
453+
self._on_remote_node_msgline(node, ex, 'stderr', gateway)
454+
finally:
455+
tmptar.close()
456+
del self._rcopy_bufs[node]
457+
del self._rcopy_tars[node]
458+
else:
459+
self.logger.debug("no rcopy buffer received from %s", node)
463460

464461
self.gwtargets[str(gateway)].remove(node)
465462
self._close_count += 1

0 commit comments

Comments
 (0)