Esempio n. 1
0
    def handle_stranded_tasks(self, engine):
        """Deal with jobs resident in an engine that died."""
        lost = self.pending[engine]
        for msg_id in lost.keys():
            if msg_id not in self.pending[engine]:
                # prevent double-handling of messages
                continue

            raw_msg = lost[msg_id].raw_msg
            idents,msg = self.session.feed_identities(raw_msg, copy=False)
            parent = self.session.unpack(msg[1].bytes)
            idents = [engine, idents[0]]

            # build fake error reply
            try:
                raise error.EngineError("Engine %r died while running task %r"%(engine, msg_id))
            except:
                content = error.wrap_exception()
            # build fake metadata
            md = dict(
                status=u'error',
                engine=engine.decode('ascii'),
                date=util.utcnow(),
            )
            msg = self.session.msg('apply_reply', content, parent=parent, metadata=md)
            raw_reply = list(map(zmq.Message, self.session.serialize(msg, ident=idents)))
            # and dispatch it
            self.dispatch_result(raw_reply)

        # finally scrub completed/failed lists
        self.completed.pop(engine)
        self.failed.pop(engine)
Esempio n. 2
0
    def handle_stranded_tasks(self, engine):
        """Deal with jobs resident in an engine that died."""
        lost = self.pending[engine]
        for msg_id in list(lost.keys()):
            if msg_id not in lost:
                # prevent double-handling of messages
                continue

            raw_msg = lost[msg_id].raw_msg
            idents, msg = self.session.feed_identities(raw_msg, copy=False)
            parent = self.session.unpack(msg[1].bytes)
            idents = [engine, idents[0]]

            # build fake error reply
            try:
                raise error.EngineError(
                    "Engine %r died while running task %r" % (engine, msg_id))
            except:
                content = error.wrap_exception()
            # build fake metadata
            md = dict(status=u'error',
                      engine=engine.decode('ascii'),
                      date=util.utcnow())
            msg = self.session.msg('apply_reply',
                                   content,
                                   parent=parent,
                                   metadata=md)
            raw_reply = list(
                map(zmq.Message, self.session.serialize(msg, ident=idents)))
            # and dispatch it
            self.dispatch_result(raw_reply)

        # finally scrub completed/failed lists
        self.completed.pop(engine)
        self.failed.pop(engine)
Esempio n. 3
0
 def init_metadata(self, parent):
     """init metadata dict, for execute/apply_reply"""
     return {
         'started': utcnow(),
         'dependencies_met': True,
         'engine': self.ident,
     }
Esempio n. 4
0
 def test_datetime(self):
     """get/set timestamps with datetime objects"""
     msg_id = self.db.get_history()[-1]
     rec = self.db.get_record(msg_id)
     self.assertTrue(isinstance(rec['submitted'], datetime))
     self.db.update_record(msg_id, dict(completed=util.utcnow()))
     rec = self.db.get_record(msg_id)
     self.assertTrue(isinstance(rec['completed'], datetime))
Esempio n. 5
0
 def test_datetime(self):
     """get/set timestamps with datetime objects"""
     msg_id = self.db.get_history()[-1]
     rec = self.db.get_record(msg_id)
     self.assertTrue(isinstance(rec['submitted'], datetime))
     self.db.update_record(msg_id, dict(completed=util.utcnow()))
     rec = self.db.get_record(msg_id)
     self.assertTrue(isinstance(rec['completed'], datetime))
Esempio n. 6
0
 def test_update_record(self):
     now = self._round_to_millisecond(util.utcnow())
     msg_id = self.db.get_history()[-1]
     rec1 = self.db.get_record(msg_id)
     data = {'stdout': 'hello there', 'completed' : now}
     self.db.update_record(msg_id, data)
     rec2 = self.db.get_record(msg_id)
     self.assertEqual(rec2['stdout'], 'hello there')
     self.assertEqual(rec2['completed'], now)
     rec1.update(data)
     self.assertEqual(rec1, rec2)
Esempio n. 7
0
 def init_metadata(self, parent):
     """init metadata dict, for execute/apply_reply"""
     parent_metadata = parent.get('metadata', {})
     return {
         'started': utcnow(),
         'dependencies_met': True,
         'engine': self.ident,
         'is_broadcast': parent_metadata.get('is_broadcast', False),
         'is_coalescing': parent_metadata.get('is_coalescing', False),
         'original_msg_id': parent_metadata.get('original_msg_id', ''),
     }
Esempio n. 8
0
 def test_update_record(self):
     now = self._round_to_millisecond(util.utcnow())
     msg_id = self.db.get_history()[-1]
     rec1 = self.db.get_record(msg_id)
     data = {'stdout': 'hello there', 'completed' : now}
     self.db.update_record(msg_id, data)
     rec2 = self.db.get_record(msg_id)
     self.assertEqual(rec2['stdout'], 'hello there')
     self.assertEqual(rec2['completed'], now)
     rec1.update(data)
     self.assertEqual(rec1, rec2)
Esempio n. 9
0
 def elapsed(self):
     """elapsed time since initial submission"""
     if self.ready():
         return self.wall_time
     
     now = submitted = utcnow()
     for msg_id in self.msg_ids:
         if msg_id in self._client.metadata:
             stamp = self._client.metadata[msg_id]['submitted']
             if stamp and stamp < submitted:
                 submitted = stamp
     return compare_datetimes(now, submitted).total_seconds()
Esempio n. 10
0
    def elapsed(self):
        """elapsed time since initial submission"""
        if self.ready():
            return self.wall_time

        now = submitted = utcnow()
        for msg_id in self.msg_ids:
            if msg_id in self._client.metadata:
                stamp = self._client.metadata[msg_id]['submitted']
                if stamp and stamp < submitted:
                    submitted = stamp
        return compare_datetimes(now, submitted).total_seconds()
Esempio n. 11
0
    def elapsed(self):
        """elapsed time since initial submission"""
        if self.ready():
            return self.wall_time

        now = submitted = utcnow()
        self._parse_metadata_dates()
        for md in self._metadata:
            stamp = md["submitted"]
            if stamp and stamp < submitted:
                submitted = stamp
        return compare_datetimes(now, submitted).total_seconds()