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()
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)
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()
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
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
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
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"))
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"))
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"))
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)