Example #1
0
    def restore_unacked_once(self, stderr=None):
        """Restore all unacknowledged messages at shutdown/gc collect.

        Note:
            Can only be called once for each instance, subsequent
            calls will be ignored.
        """
        self._on_collect.cancel()
        self._flush()
        stderr = sys.stderr if stderr is None else stderr
        state = self._delivered

        if not self.restore_at_shutdown or not self.channel.do_restore:
            return
        if getattr(state, 'restored', None):
            assert not state
            return
        try:
            if state:
                print(RESTORING_FMT.format(len(self._delivered)),
                      file=stderr)
                unrestored = self.restore_unacked()

                if unrestored:
                    errors, messages = list(zip(*unrestored))
                    print(RESTORE_PANIC_FMT.format(len(errors), errors),
                          file=stderr)
                    emergency_dump_state(messages, stderr=stderr)
        finally:
            state.restored = True
Example #2
0
    def restore_unacked_once(self, stderr=None):
        """Restores all unacknowledged messages at shutdown/gc collect.

        Note:
            Can only be called once for each instance, subsequent
            calls will be ignored.
        """
        self._on_collect.cancel()
        self._flush()
        stderr = sys.stderr if stderr is None else stderr
        state = self._delivered

        if not self.restore_at_shutdown or not self.channel.do_restore:
            return
        if getattr(state, 'restored', None):
            assert not state
            return
        try:
            if state:
                print(RESTORING_FMT.format(len(self._delivered)), file=stderr)
                unrestored = self.restore_unacked()

                if unrestored:
                    errors, messages = list(zip(*unrestored))
                    print(RESTORE_PANIC_FMT.format(len(errors), errors),
                          file=stderr)
                    emergency_dump_state(messages, stderr=stderr)
        finally:
            state.restored = True
Example #3
0
 def test_dump(self, stdouts):
     fh = MyBytesIO()
     stderr = StringIO()
     emergency_dump_state(
         {'foo': 'bar'}, open_file=lambda n, m: fh, stderr=stderr)
     assert pickle.loads(fh.getvalue()) == {'foo': 'bar'}
     assert stderr.getvalue()
     assert not stdouts.stdout.getvalue()
Example #4
0
 def test_dump(self, stdouts):
     fh = MyBytesIO()
     stderr = StringIO()
     emergency_dump_state(
         {'foo': 'bar'}, open_file=lambda n, m: fh, stderr=stderr)
     assert pickle.loads(fh.getvalue()) == {'foo': 'bar'}
     assert stderr.getvalue()
     assert not stdouts.stdout.getvalue()
Example #5
0
    def test_dump(self, stdout, stderr):
        fh = MyBytesIO()

        emergency_dump_state(
            {'foo': 'bar'}, open_file=lambda n, m: fh)
        self.assertDictEqual(
            pickle.loads(fh.getvalue()), {'foo': 'bar'})
        self.assertTrue(stderr.getvalue())
        self.assertFalse(stdout.getvalue())
Example #6
0
    def test_dump_second_strategy(self, stdout, stderr):
        fh = MyStringIO()

        def raise_something(*args, **kwargs):
            raise KeyError('foo')

        emergency_dump_state(
            {'foo': 'bar'},
            open_file=lambda n, m: fh, dump=raise_something
        )
        self.assertIn('foo', fh.getvalue())
        self.assertIn('bar', fh.getvalue())
        self.assertTrue(stderr.getvalue())
        self.assertFalse(stdout.getvalue())
Example #7
0
    def test_dump_second_strategy(self, stdouts):
        fh = MyStringIO()
        stderr = StringIO()

        def raise_something(*args, **kwargs):
            raise KeyError('foo')

        emergency_dump_state(
            {'foo': 'bar'},
            open_file=lambda n, m: fh,
            dump=raise_something,
            stderr=stderr,
        )
        assert 'foo' in fh.getvalue()
        assert 'bar' in fh.getvalue()
        assert stderr.getvalue()
        assert not stdouts.stdout.getvalue()
Example #8
0
    def test_dump_second_strategy(self, stdouts):
        fh = MyStringIO()
        stderr = StringIO()

        def raise_something(*args, **kwargs):
            raise KeyError('foo')

        emergency_dump_state(
            {'foo': 'bar'},
            open_file=lambda n, m: fh,
            dump=raise_something,
            stderr=stderr,
        )
        assert 'foo' in fh.getvalue()
        assert 'bar' in fh.getvalue()
        assert stderr.getvalue()
        assert not stdouts.stdout.getvalue()