示例#1
0
    def test_set_attribute_if_missing(self):
        client = self._factory.get_client()

        writing_signaller = Signaller(client, workflow='some_workflow',
                                      instance='123')

        self.assertFalse(writing_signaller.set_attribute_if_missing(
                         Signal.ARCHIVE, Signal.TIMESTAMP_ATTR, 12345))

        writing_signaller.set_action(Signal.ARCHIVE)
        self.assertTrue(writing_signaller.set_attribute_if_missing(
                        Signal.ARCHIVE, Signal.TIMESTAMP_ATTR, 12345))
        self.assertEqual(12345,
                         writing_signaller.get_attribute(
                             Signal.ARCHIVE,
                             Signal.TIMESTAMP_ATTR))

        self.assertFalse(writing_signaller.set_attribute_if_missing(
                         Signal.ARCHIVE, Signal.TIMESTAMP_ATTR, 123456))

        reading_signaller = Signaller(client, workflow='some_workflow',
                                      instance='123')
        self.assertEqual(12345,
                         reading_signaller.get_attribute(
                             Signal.ARCHIVE,
                             Signal.TIMESTAMP_ATTR))
示例#2
0
    def test_set_attribute_if_missing(self):
        client = self._factory.get_client()

        writing_signaller = Signaller(client,
                                      workflow='some_workflow',
                                      instance='123')

        self.assertFalse(
            writing_signaller.set_attribute_if_missing(Signal.ARCHIVE,
                                                       Signal.TIMESTAMP_ATTR,
                                                       12345))

        writing_signaller.set_action(Signal.ARCHIVE)
        self.assertTrue(
            writing_signaller.set_attribute_if_missing(Signal.ARCHIVE,
                                                       Signal.TIMESTAMP_ATTR,
                                                       12345))
        self.assertEqual(
            12345,
            writing_signaller.get_attribute(Signal.ARCHIVE,
                                            Signal.TIMESTAMP_ATTR))

        self.assertFalse(
            writing_signaller.set_attribute_if_missing(Signal.ARCHIVE,
                                                       Signal.TIMESTAMP_ATTR,
                                                       123456))

        reading_signaller = Signaller(client,
                                      workflow='some_workflow',
                                      instance='123')
        self.assertEqual(
            12345,
            reading_signaller.get_attribute(Signal.ARCHIVE,
                                            Signal.TIMESTAMP_ATTR))
示例#3
0
    def _process_signals(self, workflow, instance):
        """Process signals for a given workflow instance.

        Args:
            workflow: The workflow whose signals should be processed.
            instance: The instance whose signals should be processed.
        Returns:
            True if the worker should execute jobs in this instance.  Otherwise
            False.
        """
        signaller = Signaller(self._client, workflow, instance)
        archiver = Archiver(self._client, workflow, instance)
        if signaller.is_action_set(Signal.EXIT):
            return False
        if (signaller.is_action_set(Signal.ARCHIVE)
                and self._is_done(workflow, instance)):
            # TODO(pawel): enable this for all workflows after we gain
            # confidence that the master has enough memory to delay workflow
            # archiving.
            if workflow == 'indexing':
                ARCHIVE_DELAY_SEC = 7 * 24 * 60 * 60  # 7 days
            else:
                ARCHIVE_DELAY_SEC = 12 * 60 * 60  # 12 hours
            expiration_timestamp = int(time.time()) + ARCHIVE_DELAY_SEC
            if signaller.set_attribute_if_missing(Signal.ARCHIVE,
                                                  Signal.TIMESTAMP_ATTR,
                                                  expiration_timestamp):
                self._send_instance_end_email(workflow, instance)
            else:
                expiration_timestamp = signaller.get_attribute(
                    Signal.ARCHIVE, Signal.TIMESTAMP_ATTR)
                archiver.archive_if_expired(expiration_timestamp)
            return False
        if signaller.is_action_set(Signal.ABORT):
            if archiver.archive_if_aborted():
                self._send_instance_end_email(workflow, instance)
            return False
        if signaller.is_action_set(Signal.DRAIN):
            return False
        return True
示例#4
0
    def _process_signals(self, workflow, instance):
        """Process signals for a given workflow instance.

        Args:
            workflow: The workflow whose signals should be processed.
            instance: The instance whose signals should be processed.
        Returns:
            True if the worker should execute jobs in this instance.  Otherwise
            False.
        """
        signaller = Signaller(self._client, workflow, instance)
        archiver = Archiver(self._client, workflow, instance)
        if signaller.is_action_set(Signal.EXIT):
            return False
        if (signaller.is_action_set(Signal.ARCHIVE) and
                self._is_done(workflow, instance)):
            # TODO(pawel): enable this for all workflows after we gain
            # confidence that the master has enough memory to delay workflow
            # archiving.
            if workflow == 'indexing':
                ARCHIVE_DELAY_SEC = 7 * 24 * 60 * 60  # 7 days
            else:
                ARCHIVE_DELAY_SEC = 12 * 60 * 60  # 12 hours
            expiration_timestamp = int(time.time()) + ARCHIVE_DELAY_SEC
            if signaller.set_attribute_if_missing(Signal.ARCHIVE,
                                                  Signal.TIMESTAMP_ATTR,
                                                  expiration_timestamp):
                self._send_instance_end_email(workflow, instance)
            else:
                expiration_timestamp = signaller.get_attribute(
                    Signal.ARCHIVE, Signal.TIMESTAMP_ATTR)
                archiver.archive_if_expired(expiration_timestamp)
            return False
        if signaller.is_action_set(Signal.ABORT):
            if archiver.archive_if_aborted():
                self._send_instance_end_email(workflow, instance)
            return False
        if signaller.is_action_set(Signal.DRAIN):
            return False
        return True