@Override public void beforeCommand(Command command, CommandEnvironment env) { this.env = env; env.getEventBus().register(this); if (workers == null) { Path logDir = env.getRuntime().getOutputBase().getRelative("worker-logs"); try { logDir.createDirectory(); } catch (IOException e) { env.getReporter() .handle(Event.error("Could not create directory for worker logs: " + logDir)); } GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig(); // It's better to re-use a worker as often as possible and keep it hot, in order to profit // from JIT optimizations as much as possible. config.setLifo(true); // Check for & deal with idle workers every 5 seconds. config.setTimeBetweenEvictionRunsMillis(5 * 1000); // Always test the liveliness of worker processes. config.setTestOnBorrow(true); config.setTestOnCreate(true); config.setTestOnReturn(true); config.setTestWhileIdle(true); // Don't limit the total number of worker processes, as otherwise the pool might be full of // e.g. Java workers and could never accommodate another request for a different kind of // worker. config.setMaxTotal(-1); workers = new WorkerPool(new WorkerFactory(), config); workers.setReporter(env.getReporter()); workers.setLogDirectory(logDir); } }
@Before public final void startServer() throws Exception { // Do not use `createUnixTempDir()` here since the file name that results is longer // than 108 characters, so cannot be used as local socket address. File file = File.createTempFile("scratch", ".tmp", new File("/tmp")); file.delete(); file.mkdir(); serverDir = this.scratch.dir(file.getAbsolutePath()); workspaceDir = this.scratch.createUnixTempDir(); workspaceDir.createDirectory(); client = new RPCTestingClient(outErr, serverDir.getRelative("server.socket")); RPCService service = new RPCService(helloWorldCommand); server = new RPCServer( new JavaClock(), service, MAX_IDLE_MILLIS, HEALTH_CHECK_MILLIS, serverDir, workspaceDir); serverThread.start(); }