Exemple #1
0
    def setUp(self):
        self.mock_handler_inst = mock.Mock()
        self.mock_runner_factory = mock.Mock(
            side_effect=Exception('this should never be called'))
        self.mock_handler_class = mock.Mock(
            return_value=self.mock_handler_inst)
        self.lock = threading.RLock()

        @contextmanager
        def lock():
            with self.lock:
                yield

        self.after_request_callback_calls = 0

        def after_request_callback():
            self.after_request_callback_calls += 1

        with mock.patch.object(PailgunServer, 'server_bind'), \
             mock.patch.object(PailgunServer, 'server_activate'):
            self.server = PailgunServer(
                server_address=('0.0.0.0', 0),
                runner_factory=self.mock_runner_factory,
                handler_class=self.mock_handler_class,
                lifecycle_lock=lock,
                request_complete_callback=after_request_callback)
    def setUp(self):
        self.mock_handler_inst = unittest.mock.Mock()
        # Add a fake environment for this to not timeout.
        self.fake_environment = {"PANTSD_REQUEST_TIMEOUT_LIMIT": "-1"}
        self.mock_handler_inst.parsed_request.return_value = (None, None, [], self.fake_environment)

        self.mock_runner_factory = unittest.mock.Mock(
            side_effect=Exception("this should never be called")
        )
        self.mock_handler_class = unittest.mock.Mock(return_value=self.mock_handler_inst)
        self.lock = threading.RLock()

        @contextmanager
        def lock():
            with self.lock:
                yield

        self.after_request_callback_calls = 0

        def after_request_callback():
            self.after_request_callback_calls += 1

        with unittest.mock.patch.object(PailgunServer, "server_bind"), unittest.mock.patch.object(
            PailgunServer, "server_activate"
        ):
            self.server = PailgunServer(
                server_address=("0.0.0.0", 0),
                runner_factory=self.mock_runner_factory,
                handler_class=self.mock_handler_class,
                lifecycle_lock=lock,
                request_complete_callback=after_request_callback,
            )
Exemple #3
0
    def _setup_pailgun(self):
        """Sets up a PailgunServer instance."""

        # Constructs and returns a runnable PantsRunner.
        def runner_factory(sock, arguments, environment):
            exiter = self._exiter_class(sock)
            build_graph = None

            self._logger.debug('execution commandline: %s', arguments)
            if self._scheduler_service:
                # N.B. This parses sys.argv by way of OptionsInitializer/OptionsBootstrapper prior to
                # the main pants run to derive spec_roots for caching in the underlying scheduler.
                spec_roots = self._parse_commandline_to_spec_roots(
                    args=arguments)
                self._logger.debug('parsed spec_roots: %s', spec_roots)
                try:
                    self._logger.debug('requesting BuildGraph from %s',
                                       self._scheduler_service)
                    # N.B. This call is made in the pre-fork daemon context for reach and reuse of the
                    # resident scheduler for BuildGraph construction.
                    build_graph = self._scheduler_service.get_build_graph(
                        spec_roots)
                except Exception:
                    self._logger.warning(
                        'encountered exception during SchedulerService.get_build_graph():\n%s',
                        traceback.format_exc())
            return self._runner_class(sock, exiter, arguments, environment,
                                      build_graph)

        return PailgunServer(self._bind_addr, runner_factory)
  def _setup_pailgun(self):
    """Sets up a PailgunServer instance."""
    # Constructs and returns a runnable PantsRunner.
    def runner_factory(sock, arguments, environment):
      exiter = self._exiter_class(sock)
      return self._runner_class(sock, exiter, arguments, environment)

    return PailgunServer(self._bind_addr, runner_factory)
 def setUp(self):
   self.mock_handler_inst = mock.Mock()
   self.mock_runner_factory = mock.Mock(side_effect=Exception('this should never be called'))
   self.mock_handler_class = mock.Mock(return_value=self.mock_handler_inst)
   with mock.patch.object(PailgunServer, 'server_bind'), \
        mock.patch.object(PailgunServer, 'server_activate'):
     self.server = PailgunServer(
       server_address=('0.0.0.0', 0),
       runner_factory=self.mock_runner_factory,
       handler_class=self.mock_handler_class
     )
Exemple #6
0
    def _setup_pailgun(self):
        """Sets up a PailgunServer instance."""

        # Constructs and returns a runnable PantsRunner.
        def runner_factory(sock, arguments, environment):
            return self._runner_class.create(sock, arguments, environment,
                                             self._scheduler_service)

        # Plumb the daemon's lifecycle lock to the `PailgunServer` to safeguard teardown.
        @contextmanager
        def lifecycle_lock():
            with self.lifecycle_lock:
                yield

        return PailgunServer(self._bind_addr, runner_factory, lifecycle_lock)
Exemple #7
0
  def _setup_pailgun(self):
    """Sets up a PailgunServer instance."""
    # Constructs and returns a runnable PantsRunner.
    def runner_factory(sock, arguments, environment):
      exiter = self._exiter_class(sock)
      graph_helper = None
      deferred_exc = None

      self._logger.debug('execution commandline: %s', arguments)
      options_bootstrapper = OptionsBootstrapper(args=arguments)
      build_config = BuildConfigInitializer.get(options_bootstrapper)
      options = OptionsInitializer.create(options_bootstrapper, build_config)

      graph_helper, target_roots = None, None
      try:
        self._logger.debug('warming the product graph via %s', self._scheduler_service)
        # N.B. This call is made in the pre-fork daemon context for reach and reuse of the
        # resident scheduler.
        graph_helper, target_roots = self._scheduler_service.warm_product_graph(
          options,
          self._target_roots_calculator
        )
      except Exception:
        deferred_exc = sys.exc_info()
        self._logger.warning(
          'encountered exception during SchedulerService.warm_product_graph(), deferring:\n%s',
          ''.join(traceback.format_exception(*deferred_exc))
        )

      return self._runner_class(
        sock,
        exiter,
        arguments,
        environment,
        target_roots,
        graph_helper,
        self.fork_lock,
        deferred_exc
      )

    # Plumb the daemon's lifecycle lock to the `PailgunServer` to safeguard teardown.
    @contextmanager
    def lifecycle_lock():
      with self.lifecycle_lock:
        yield

    return PailgunServer(self._bind_addr, runner_factory, lifecycle_lock)
Exemple #8
0
    def _setup_pailgun(self):
        """Sets up a PailgunServer instance."""

        # Constructs and returns a runnable PantsRunner.
        def runner_factory(sock, arguments, environment):
            exiter = self._exiter_class(sock)
            graph_helper = None
            deferred_exc = None

            # Capture the size of the graph prior to any warming, for stats.
            preceding_graph_size = self._scheduler_service.product_graph_len()
            self._logger.debug('resident graph size: %s', preceding_graph_size)

            self._logger.debug('execution commandline: %s', arguments)
            options, _ = OptionsInitializer(
                OptionsBootstrapper(args=arguments)).setup(init_logging=False)
            target_roots = self._target_roots_calculator.create(
                options,
                change_calculator=self._scheduler_service.change_calculator)

            try:
                self._logger.debug('warming the product graph via %s',
                                   self._scheduler_service)
                # N.B. This call is made in the pre-fork daemon context for reach and reuse of the
                # resident scheduler.
                graph_helper = self._scheduler_service.warm_product_graph(
                    target_roots)
            except Exception:
                deferred_exc = sys.exc_info()
                self._logger.warning(
                    'encountered exception during SchedulerService.warm_product_graph(), deferring:\n%s',
                    ''.join(traceback.format_exception(*deferred_exc)))

            return self._runner_class(sock, exiter, arguments, environment,
                                      target_roots, graph_helper,
                                      self.fork_lock, preceding_graph_size,
                                      deferred_exc)

        # Plumb the daemon's lifecycle lock to the `PailgunServer` to safeguard teardown.
        @contextmanager
        def lifecycle_lock():
            with self.lifecycle_lock:
                yield

        return PailgunServer(self._bind_addr, runner_factory, lifecycle_lock)
Exemple #9
0
  def _setup_pailgun(self):
    """Sets up a PailgunServer instance."""
    # Constructs and returns a runnable PantsRunner.
    def runner_factory(sock, arguments, environment):
      exiter = self._exiter_class(sock)
      graph_helper = None
      deferred_exc = None

      self._logger.debug('execution commandline: %s', arguments)
      if self._scheduler_service:
        # N.B. This parses sys.argv by way of OptionsInitializer/OptionsBootstrapper prior to
        # the main pants run to derive target roots for caching in the underlying product graph.
        target_roots = self._target_roots_class.create(
          args=arguments,
          change_calculator=self._scheduler_service.change_calculator
        )
        try:
          self._logger.debug('warming the product graph via %s', self._scheduler_service)
          # N.B. This call is made in the pre-fork daemon context for reach and reuse of the
          # resident scheduler.
          graph_helper = self._scheduler_service.warm_product_graph(target_roots)
        except Exception:
          deferred_exc = sys.exc_info()
          self._logger.warning(
            'encountered exception during SchedulerService.warm_product_graph(), deferring:\n%s',
            ''.join(traceback.format_exception(*deferred_exc))
          )

      return self._runner_class(sock, exiter, arguments, environment, graph_helper, deferred_exc)

    @contextmanager
    def context_lock():
      """This lock is used to safeguard Pailgun request handling against a fork() with the
      scheduler lock held by another thread (e.g. the FSEventService thread), which can
      lead to a pailgun deadlock.
      """
      if self._scheduler_service:
        with self._scheduler_service.locked():
          yield
      else:
        yield

    return PailgunServer(self._bind_addr, runner_factory, context_lock)
    def _setup_pailgun(self):
        """Sets up a PailgunServer instance."""

        # Constructs and returns a runnable PantsRunner.
        def runner_factory(sock, arguments, environment):
            return self._runner_class.create(
                sock,
                arguments,
                environment,
                self.services,
                self._scheduler_service,
            )

        # Plumb the daemon's lifecycle lock to the `PailgunServer` to safeguard teardown.
        # This indirection exists to allow the server to be created before PantsService.setup
        # has been called to actually initialize the `services` field.
        @contextmanager
        def lifecycle_lock():
            with self.services.lifecycle_lock:
                yield

        return PailgunServer(self._bind_addr, runner_factory, lifecycle_lock)