Ejemplo n.º 1
0
    def kill_buckd(self):
        with Tracing('BuckRepo.kill_buckd'):
            buckd_socket_path = self._buck_project.get_buckd_socket_path()
            if os.path.exists(buckd_socket_path):
                print("Shutting down nailgun server...", file=sys.stderr)
                try:
                    with NailgunConnection('local:.buckd/sock', cwd=self._buck_project.root) as c:
                        c.send_command('ng-stop')
                except NailgunException as e:
                    if e.code not in (NailgunException.CONNECT_FAILED,
                                      NailgunException.CONNECTION_BROKEN,
                                      NailgunException.UNEXPECTED_CHUNKTYPE):
                        raise BuckToolException(
                            'Unexpected error shutting down nailgun server: ' +
                            str(e))

            self._buck_project.clean_up_buckd()
Ejemplo n.º 2
0
 def test_nailgun_disconnect(self):
     """
     We should disconnect before time elapses because of configuration:
     Heartbeats are sent every 5 secs
     Server expects to look for disconnects if no hearbeat is received in 1 sec
     Server runs for 30 sec given we still have heartbeats, so it should output about 6 'H'
     We assert that number of 'H' is smaller
     """
     output = StringIO()
     with NailgunConnection(self.transport_address,
                            stderr=None,
                            stdin=None,
                            stdout=output,
                            heartbeat_interval_sec=5) as c:
         exit_code = c.send_command(
             'com.martiansoftware.nailgun.examples.Heartbeat', ['30000'])
     self.assertTrue(output.getvalue().count('H') < 3)
Ejemplo n.º 3
0
    def kill_buckd(self):
        with Tracing('BuckTool.kill_buckd'):
            buckd_transport_file_path = self._buck_project.get_buckd_transport_file_path()
            if transport_exists(buckd_transport_file_path):
                logging.debug("Shutting down buck daemon.")
                try:
                    with NailgunConnection(self._buck_project.get_buckd_transport_address(),
                                           cwd=self._buck_project.root) as c:
                        c.send_command('ng-stop')
                except NailgunException as e:
                    if e.code not in (NailgunException.CONNECT_FAILED,
                                      NailgunException.CONNECTION_BROKEN,
                                      NailgunException.UNEXPECTED_CHUNKTYPE):
                        raise BuckToolException(
                            'Unexpected error shutting down nailgun server: ' +
                            str(e))

            self._buck_project.clean_up_buckd()
Ejemplo n.º 4
0
    def _is_buckd_running(self):
        with Tracing('BuckRepo._is_buckd_running'):
            buckd_socket_path = self._buck_project.get_buckd_socket_path()

            if not os.path.exists(buckd_socket_path):
                return False

            try:
                with NailgunConnection('local:.buckd/sock',
                                       stdin=None,
                                       stdout=None,
                                       stderr=None) as c:
                    c.send_command('ng-stats')
            except NailgunException as e:
                if e.code == NailgunException.CONNECT_FAILED:
                    return False
                else:
                    raise
            return True
Ejemplo n.º 5
0
    def _is_buckd_running(self):
        with Tracing('BuckTool._is_buckd_running'):
            transport_file_path = self._buck_project.get_buckd_transport_file_path()

            if not transport_exists(transport_file_path):
                return False

            try:
                with NailgunConnection(
                        self._buck_project.get_buckd_transport_address(),
                        stdin=None,
                        stdout=None,
                        stderr=None,
                        cwd=self._buck_project.root) as c:
                    c.send_command('ng-stats')
            except NailgunException as e:
                if e.code == NailgunException.CONNECT_FAILED:
                    return False
                else:
                    raise
            return True
Ejemplo n.º 6
0
    def launch_buck(self, build_id):
        with Tracing('BuckTool.launch_buck'):
            with JvmCrashLogger(self, self._buck_project.root):
                if self._command_line.command == "clean" and \
                        not self._command_line.is_help() and \
                        not self._command_line.is_oop_javac():
                    self.kill_buckd()

                buck_version_uid = self._get_buck_version_uid()

                use_buckd = self._use_buckd
                if not self._command_line.is_help(
                ) and not self._command_line.is_oop_javac():
                    has_watchman = bool(which('watchman'))
                    if use_buckd and has_watchman:
                        running_version = self._buck_project.get_running_buckd_version(
                        )

                        if running_version != buck_version_uid:
                            self.kill_buckd()

                        if not self._is_buckd_running():
                            self.launch_buckd(
                                buck_version_uid=buck_version_uid)
                    elif use_buckd and not has_watchman:
                        print(
                            "Not using buckd because watchman isn't installed.",
                            file=sys.stderr)
                    elif not use_buckd:
                        print("Not using buckd because NO_BUCKD is set.",
                              file=sys.stderr)

                env = self._environ_for_buck()
                env['BUCK_BUILD_ID'] = build_id

                if use_buckd and self._is_buckd_running():
                    with Tracing('buck', args={'command': sys.argv[1:]}):
                        exit_code = 2
                        last_diagnostic_time = 0
                        while exit_code == 2:
                            with NailgunConnection(
                                    self._buck_project.
                                    get_buckd_transport_address(),
                                    cwd=self._buck_project.root) as c:
                                now = int(round(time.time() * 1000))
                                env['BUCK_PYTHON_SPACE_INIT_TIME'] = \
                                    str(now - self._init_timestamp)
                                exit_code = c.send_command(
                                    'com.facebook.buck.cli.Main',
                                    sys.argv[1:],
                                    env=env,
                                    cwd=self._buck_project.root)
                                if exit_code == 2:
                                    env['BUCK_BUILD_ID'] = str(uuid.uuid4())
                                    now = time.time()
                                    if now - last_diagnostic_time > DAEMON_BUSY_MESSAGE_SECONDS:
                                        print(
                                            'Daemon is busy, waiting for it to become free...',
                                            file=sys.stderr)
                                        last_diagnostic_time = now
                                    time.sleep(1)
                        return exit_code

                command = ["buck"]
                extra_default_options = [
                    "-Djava.io.tmpdir={0}".format(self._tmp_dir),
                    "-XX:SoftRefLRUPolicyMSPerMB=0",
                    "-XX:+UseG1GC",
                ]
                command.extend(
                    self._get_java_args(buck_version_uid,
                                        extra_default_options))
                command.append(
                    "com.facebook.buck.cli.bootstrapper.ClassLoaderBootstrapper"
                )
                if self._command_line.is_oop_javac():
                    command.append("com.facebook.buck.oop_javac.Main")
                else:
                    command.append("com.facebook.buck.cli.Main")
                command.extend(sys.argv[1:])

                now = int(round(time.time() * 1000))
                env['BUCK_PYTHON_SPACE_INIT_TIME'] = str(now -
                                                         self._init_timestamp)
                if True:
                    java = which("java")
                    if java is None:
                        raise BuckToolException('Could not find java on $PATH')
                    with Tracing('buck', args={'command': command}):
                        buck_exit_code = subprocess.call(
                            command,
                            cwd=self._buck_project.root,
                            env=env,
                            executable=java)
                return buck_exit_code
Ejemplo n.º 7
0
    def launch_buck(self, build_id):
        with Tracing('BuckRepo.launch_buck'):
            self.kill_autobuild()
            if 'clean' in sys.argv:
                self.kill_buckd()

            buck_version_uid = self._get_buck_version_uid()

            use_buckd = self._use_buckd()
            has_watchman = bool(which('watchman'))
            if use_buckd and has_watchman:
                buckd_run_count = self._buck_project.get_buckd_run_count()
                running_version = self._buck_project.get_running_buckd_version(
                )
                new_buckd_run_count = buckd_run_count + 1

                if (buckd_run_count == MAX_BUCKD_RUN_COUNT
                        or running_version != buck_version_uid):
                    self.kill_buckd()
                    new_buckd_run_count = 0

                if new_buckd_run_count == 0 or not self._is_buckd_running():
                    self.launch_buckd(buck_version_uid=buck_version_uid)
                else:
                    self._buck_project.update_buckd_run_count(
                        new_buckd_run_count)
            elif use_buckd and not has_watchman:
                print("Not using buckd because watchman isn't installed.",
                      file=sys.stderr)
            elif not use_buckd:
                print("Not using buckd because NO_BUCKD is set.",
                      file=sys.stderr)

            env = self._environ_for_buck()
            env['BUCK_BUILD_ID'] = build_id

            buck_socket_path = self._buck_project.get_buckd_socket_path()

            if use_buckd and self._is_buckd_running() and \
                    os.path.exists(buck_socket_path):
                with Tracing('buck', args={'command': sys.argv[1:]}):
                    with NailgunConnection('local:.buckd/sock',
                                           cwd=self._buck_project.root) as c:
                        exit_code = c.send_command(
                            'com.facebook.buck.cli.Main',
                            sys.argv[1:],
                            env=env,
                            cwd=self._buck_project.root)
                        if exit_code == 2:
                            print('Daemon is busy, please wait',
                                  'or run "buck kill" to terminate it.',
                                  file=sys.stderr)
                        return exit_code

            command = ["buck"]
            extra_default_options = [
                "-Djava.io.tmpdir={0}".format(self._tmp_dir)
            ]
            command.extend(
                self._get_java_args(buck_version_uid, extra_default_options))
            command.append(
                "com.facebook.buck.cli.bootstrapper.ClassLoaderBootstrapper")
            command.append("com.facebook.buck.cli.Main")
            command.extend(sys.argv[1:])

            return subprocess.call(command,
                                   cwd=self._buck_project.root,
                                   env=env,
                                   executable=which("java"))
Ejemplo n.º 8
0
    def launch_buck(self, build_id):
        with Tracing('BuckRepo.launch_buck'):
            if self._command_line.command == "clean" and not self._command_line.is_help(
            ):
                self.kill_buckd()

            buck_version_uid = self._get_buck_version_uid()

            use_buckd = self._use_buckd()
            if not self._command_line.is_help():
                has_watchman = bool(which('watchman'))
                if use_buckd and has_watchman:
                    buckd_run_count = self._buck_project.get_buckd_run_count()
                    running_version = self._buck_project.get_running_buckd_version(
                    )
                    new_buckd_run_count = buckd_run_count + 1

                    if (buckd_run_count == MAX_BUCKD_RUN_COUNT
                            or running_version != buck_version_uid):
                        self.kill_buckd()
                        new_buckd_run_count = 0

                    if new_buckd_run_count == 0 or not self._is_buckd_running(
                    ):
                        self.launch_buckd(buck_version_uid=buck_version_uid)
                    else:
                        self._buck_project.update_buckd_run_count(
                            new_buckd_run_count)
                elif use_buckd and not has_watchman:
                    print("Not using buckd because watchman isn't installed.",
                          file=sys.stderr)
                elif not use_buckd:
                    print("Not using buckd because NO_BUCKD is set.",
                          file=sys.stderr)

            env = self._environ_for_buck()
            env['BUCK_BUILD_ID'] = build_id

            buck_socket_path = self._buck_project.get_buckd_socket_path()

            if use_buckd and self._is_buckd_running() and \
                    os.path.exists(buck_socket_path):
                with Tracing('buck', args={'command': sys.argv[1:]}):
                    exit_code = 2
                    last_diagnostic_time = 0
                    while exit_code == 2:
                        with NailgunConnection(
                                'local:.buckd/sock',
                                cwd=self._buck_project.root) as c:
                            exit_code = c.send_command(
                                'com.facebook.buck.cli.Main',
                                sys.argv[1:],
                                env=env,
                                cwd=self._buck_project.root)
                            if exit_code == 2:
                                now = time.time()
                                if now - last_diagnostic_time > DAEMON_BUSY_MESSAGE_SECONDS:
                                    print(
                                        'Daemon is busy, waiting for it to become free...',
                                        file=sys.stderr)
                                    last_diagnostic_time = now
                                time.sleep(0.1)
                    return exit_code

            command = ["buck"]
            extra_default_options = [
                "-Djava.io.tmpdir={0}".format(self._tmp_dir)
            ]
            command.extend(
                self._get_java_args(buck_version_uid, extra_default_options))
            command.append(
                "com.facebook.buck.cli.bootstrapper.ClassLoaderBootstrapper")
            command.append("com.facebook.buck.cli.Main")
            command.extend(sys.argv[1:])

            return subprocess.call(command,
                                   cwd=self._buck_project.root,
                                   env=env,
                                   executable=which("java"))
Ejemplo n.º 9
0
    def launch_buck(self, build_id):
        with Tracing('BuckRepo.launch_buck'):
            if not is_java8_or_9():
                WARNING = '\033[93m'
                ENDC = '\033[0m'
                print(WARNING + "::: Buck requires Java 8 or higher." + ENDC,
                      file=sys.stderr)
                if os_platform == 'darwin':
                    print("::: Available Java homes:", file=sys.stderr)
                    check_output(['/usr/libexec/java_home', '-V'])
                    if not os.environ.get("JAVA_HOME"):
                        print(WARNING + "::: No Java home selected" + ENDC,
                              file=sys.stderr)
                    else:
                        print(WARNING + "::: Selected Java home:" + ENDC,
                              file=sys.stderr)
                        print(WARNING +
                              "::: {0}".format(os.environ.get("JAVA_HOME")) +
                              ENDC,
                              file=sys.stderr)
                    print(
                        WARNING +
                        "::: Select a Java home version 1.8 or higher by setting the JAVA_HOME "
                        + "environment variable to point to one" + ENDC,
                        file=sys.stderr)

                print(
                    WARNING +
                    "::: Continuing anyway in 30 seconds, but Buck might crash."
                    + ENDC,
                    file=sys.stderr)
                time.sleep(30)

            if self._command_line.command == "clean" and not self._command_line.is_help(
            ):
                self.kill_buckd()

            buck_version_uid = self._get_buck_version_uid()

            use_buckd = self._use_buckd()
            if not self._command_line.is_help():
                has_watchman = bool(which('watchman'))
                if use_buckd and has_watchman:
                    buckd_run_count = self._buck_project.get_buckd_run_count()
                    running_version = self._buck_project.get_running_buckd_version(
                    )
                    new_buckd_run_count = buckd_run_count + 1

                    if (buckd_run_count == MAX_BUCKD_RUN_COUNT
                            or running_version != buck_version_uid):
                        self.kill_buckd()
                        new_buckd_run_count = 0

                    if new_buckd_run_count == 0 or not self._is_buckd_running(
                    ):
                        self.launch_buckd(buck_version_uid=buck_version_uid)
                    else:
                        self._buck_project.update_buckd_run_count(
                            new_buckd_run_count)
                elif use_buckd and not has_watchman:
                    print("Not using buckd because watchman isn't installed.",
                          file=sys.stderr)
                elif not use_buckd:
                    print("Not using buckd because NO_BUCKD is set.",
                          file=sys.stderr)

            env = self._environ_for_buck()
            env['BUCK_BUILD_ID'] = build_id

            buck_socket_path = self._buck_project.get_buckd_socket_path()

            if use_buckd and self._is_buckd_running() and \
                    os.path.exists(buck_socket_path):
                with Tracing('buck', args={'command': sys.argv[1:]}):
                    exit_code = 2
                    last_diagnostic_time = 0
                    while exit_code == 2:
                        with NailgunConnection(
                                'local:.buckd/sock',
                                cwd=self._buck_project.root) as c:
                            exit_code = c.send_command(
                                'com.facebook.buck.cli.Main',
                                sys.argv[1:],
                                env=env,
                                cwd=self._buck_project.root)
                            if exit_code == 2:
                                now = time.time()
                                if now - last_diagnostic_time > DAEMON_BUSY_MESSAGE_SECONDS:
                                    print(
                                        'Daemon is busy, waiting for it to become free...',
                                        file=sys.stderr)
                                    last_diagnostic_time = now
                                time.sleep(1)
                    return exit_code

            command = ["buck"]
            extra_default_options = [
                "-Djava.io.tmpdir={0}".format(self._tmp_dir)
            ]
            command.extend(
                self._get_java_args(buck_version_uid, extra_default_options))
            command.append(
                "com.facebook.buck.cli.bootstrapper.ClassLoaderBootstrapper")
            command.append("com.facebook.buck.cli.Main")
            command.extend(sys.argv[1:])

            return subprocess.call(command,
                                   cwd=self._buck_project.root,
                                   env=env,
                                   executable=which("java"))
Ejemplo n.º 10
0
 def test_nailgun_default_streams(self):
     with NailgunConnection(self.transport_address) as c:
         exit_code = c.send_command('ng-stats')
     self.assertEqual(exit_code, 0)