def ev_timer(self, timer): """perform gateway traffic grooming""" if not self.worker: return logger = self.logger # check for grooming opportunities for stdout/stderr for msg_elem, nodes in self.worker.iter_errors(): logger.debug("iter(stderr): %s: %d bytes", nodes, len(msg_elem.message())) self.gwchan.send( StdErrMessage(nodes, msg_elem.message(), self.srcwkr)) for msg_elem, nodes in self.worker.iter_buffers(): logger.debug("iter(stdout): %s: %d bytes", nodes, len(msg_elem.message())) self.gwchan.send( StdOutMessage(nodes, msg_elem.message(), self.srcwkr)) # empty internal MsgTree buffers self.worker.flush_buffers() self.worker.flush_errors() # specifically manage retcodes to periodically return latest # retcodes to parent node, instead of doing it at ev_hup (no msg # aggregation) or at ev_close (no parent node live updates) for rc, nodes in self.retcodes.items(): self.logger.debug("iter(rc): %s: rc=%d", nodes, rc) self.gwchan.send(RetcodeMessage(nodes, rc, self.srcwkr)) self.retcodes.clear()
def ev_hup(self, worker, node, rc): """Received end of command from one node""" if self.timer is None: self.gwchan.send(RetcodeMessage(node, rc, self.srcwkr)) else: # retcode grooming if rc in self.retcodes: self.retcodes[rc].add(node) else: self.retcodes[rc] = NodeSet(node)
def ev_hup(self, worker): """Received end of command from one node""" if self.timer is None: self.gwchan.send( RetcodeMessage(worker.current_node, worker.current_rc, self.srcwkr)) else: # retcode grooming if worker.current_rc in self.retcodes: self.retcodes[worker.current_rc].add(worker.current_node) else: self.retcodes[worker.current_rc] = NodeSet(worker.current_node)