Example #1
0
    def test_master_process(self):
        """
        Test
        """

        self.assertEqual(SolBase.get_master_process(), True)
        SolBase.set_master_process(False)
        self.assertEqual(SolBase.get_master_process(), False)
        SolBase.set_master_process(True)
        self.assertEqual(SolBase.get_master_process(), True)
Example #2
0
    def _start_server(self):
        """
        Low level start
        """

        # Allocate a server, and provide a connection callback
        logger.info("listen_addr=%s", self._tcp_server_config.listen_addr)
        logger.info("listen_port=%s", self._tcp_server_config.listen_port)
        logger.info("ssl_enable=%s", self._tcp_server_config.ssl_enable)
        logger.info("ssl_key_file=%s", self._tcp_server_config.ssl_key_file)
        logger.info("ssl_certificate_file=%s",
                    self._tcp_server_config.ssl_certificate_file)

        logger.info("child_process_count=%s",
                    self._tcp_server_config.child_process_count)

        logger.info("ssl_handshake_timeout_ms=%s",
                    self._tcp_server_config.ssl_handshake_timeout_ms)

        logger.info("onstop_call_client_stopsynch=%s",
                    self._tcp_server_config.onstop_call_client_stopsynch)

        logger.info("socket_absolute_timeout_ms=%s",
                    self._tcp_server_config.socket_absolute_timeout_ms)
        logger.info("socket_relative_timeout_ms=%s",
                    self._tcp_server_config.socket_relative_timeout_ms)
        logger.info("socket_min_checkinterval_ms=%s",
                    self._tcp_server_config.socket_min_checkinterval_ms)

        logger.info("_effective_control_interval_ms=%s",
                    self._effective_control_interval_ms)

        logger.info("stop_client_timeout_ms=%s",
                    self._tcp_server_config.stop_client_timeout_ms)
        logger.info("stop_server_timeout_ms=%s",
                    self._tcp_server_config.stop_server_timeout_ms)

        logger.info("client_factory=%s",
                    self._tcp_server_config.client_factory)

        if self._tcp_server_config.ssl_enable is False:
            # No SSL
            logger.info("Starting in TCP/CLEAR mode")
            self._server = StreamServerNoClose(
                (self._tcp_server_config.listen_addr,
                 self._tcp_server_config.listen_port), self._on_connection)
        else:
            # SSL ON
            logger.info("Starting in TCP/SSL mode")
            self._server = StreamServerNoClose(
                (self._tcp_server_config.listen_addr,
                 self._tcp_server_config.listen_port),
                self._on_connection,
                # SSL enabling
                keyfile=self._tcp_server_config.ssl_key_file,
                certfile=self._tcp_server_config.ssl_certificate_file,
                # SSL handshake after accept
                do_handshake_on_connect=True,
                # TLS
                ssl_version=PROTOCOL_TLSv1,
                # Cipher
                # ciphers="RC4-MD5",
                # Args
            )

            self._server.min_delay = 0.0
            self._server.max_delay = 0.0

        # Startup
        if self._tcp_server_config.child_process_count <= 0:
            # Normal start-up
            logger.info("Starting in NON-FORKED mode")
            self._server.start()
        else:
            # Child process startup : prestart
            logger.info("Pre-starting in FORKED mode, subprocess=%s",
                        self._tcp_server_config.child_process_count)
            # GEVENT_RC1 fix : pre_start => init_socket
            self._server.init_socket()

            # Let's rock
            logger.info("Forking gevent")
            for idx in range(self._tcp_server_config.child_process_count):
                # Fork gevent hub
                # GEVENT_RC1 fix : hub.fork => os.fork
                _fork_pid = gevent.fork()

                logger.info("Forking gevent hub done, idx=%s, forkPid=%s, %s",
                            idx, _fork_pid,
                            SolBase.get_current_pid_as_string())

                # Check it
                if _fork_pid == 0:
                    # We are in a child => exit this loop
                    SolBase.set_master_process(False)
                    break
                else:
                    # Master on
                    SolBase.set_master_process(True)

                    # Store child pid
                    logger.info("Storing child _fork_pid=%s", _fork_pid)
                    self._fork_pid_list.append(int(_fork_pid))

            # Start accepting now (parent and all sub-processes)
            logger.info("Accepting now, %s",
                        SolBase.get_current_pid_as_string())
            self._server.start_accepting()