private boolean processRequest(Socket socket) { try { DataOutputStream output = new DataOutputStream(socket.getOutputStream()); DataInputStream input = new DataInputStream(socket.getInputStream()); try { return processCommand(socket, SubstrateServerMessage.receive(input)); } catch (Throwable t) { log("Execution failed: " + t + "\n"); t.printStackTrace(logOutput); sendExitStatus(output, 1); } } catch (IOException ioe) { log("Failed fetching the output stream."); } finally { closeConnection(socket); log("Connection with the client closed.\n"); // Remove the application class loader and save a GC on the next compilation System.gc(); System.runFinalization(); System.gc(); log("Available Memory: " + Runtime.getRuntime().freeMemory() + "\n"); } return true; }
private static Optional<String> extractLogFile(List<String> args) { Optional<String> portArg = extractArg(args, LOG_PREFIX); return portArg.map(arg -> arg.substring(LOG_PREFIX.length())); }
private static boolean isSystemLoaderLogLevelEntry(Entry<?, ?> e) { return ((List<?>) e.getValue()).stream() .map(x -> getFieldValueOfObject("java.util.logging.Level$KnownLevel", "levelObject", x)) .allMatch(NativeImageBuildServer::isSystemClassLoader); }
printUsageAndExit(); Optional<Integer> port = extractPort(args); if (!port.isPresent()) { printUsageAndExit(); } else { Optional<String> logFile = extractLogFile(args); PrintStream output = System.out; try { new NativeImageBuildServer(port.get(), output).serve(); } catch (IOException e) { System.err.println("Starting server failed with an exception: " + e);
switch (serverCommand.command) { case STOP_SERVER: log("Received 'stop' request. Shutting down server.\n"); sendExitStatus(output, 0); return false; case GET_VERSION: log("Received 'version' request. Responding with " + System.getProperty(GRAALVM_VERSION_PROPERTY) + ".\n"); SubstrateServerMessage.send(new SubstrateServerMessage(serverCommand.command, System.getProperty(GRAALVM_VERSION_PROPERTY).getBytes()), output); return Instant.now().isBefore(lastKeepAliveAction.plus(Duration.ofMinutes(TIMEOUT_MINUTES))); if (activeTasks > 1) { String message = "Can not build image: tasks are already running in the server.\n"; log(message); sendError(output, message); sendExitStatus(output, -1); } else { log("Starting compilation for request:\n%s\n", serverCommand.payloadString()); final ArrayList<String> arguments = new ArrayList<>(Arrays.asList(serverCommand.payloadString().split("\n"))); int exitStatus = withJVMContext( serverStdout, serverStderr, () -> executeCompilation(arguments)); sendExitStatus(output, exitStatus); log("Image building completed.\n"); log("Received 'abort' request. Interrupting all image build tasks.\n"); sendExitStatus(output, 0);
threadPoolExecutor.purge(); if (port == 0) { log("Server selects ephemeral port\n"); } else { log("Try binding server to port " + port + "...\n"); System.out.println(portLogMessage); System.out.flush(); log(portLogMessage); log("Accepted request from " + socket.getInetAddress().getHostName() + ". Queuing to position: " + threadPoolExecutor.getQueue().size() + "\n"); threadPoolExecutor.execute(() -> { if (!processRequest(socket)) { closeServerSocket(serverSocket); log("Compilation server timed out. Shutting down...\n"); } catch (SocketException se) { log("Terminated: " + se.getMessage() + "\n"); if (!terminated) { log("Server error: " + se.getMessage() + "\n"); log("IOException in the socket operation.", e); } finally { log("Shutting down server...\n"); try { Thread.sleep(10000);
public static int run(String[] argsArray, Consumer<byte[]> out, Consumer<byte[]> err) { Consumer<String> outln = s -> out.accept((s + "\n").getBytes()); final List<String> args = new ArrayList<>(Arrays.asList(argsArray)); if (args.size() < 1) { usage(outln); return EXIT_FAIL; } else if (args.size() == 1 && (args.get(0).equals("--help"))) { usage(outln); return EXIT_SUCCESS; } final Optional<String> command = extractArg(args, COMMAND_PREFIX).map(arg -> arg.substring(COMMAND_PREFIX.length())); final Optional<Integer> port = NativeImageBuildServer.extractPort(args); if (port.isPresent() && command.isPresent()) { ServerCommand serverCommand = ServerCommand.valueOf(command.get()); return sendRequest(serverCommand, String.join(" ", args).getBytes(), port.get(), out, err); } else { usage(outln); return EXIT_FAIL; } }
private void closeServerSocket(ServerSocket serverSocket) { try { log("Terminating..."); terminated = true; serverSocket.close(); } catch (IOException e) { throw VMError.shouldNotReachHere(e); } }
private static Integer executeCompilation(ArrayList<String> arguments) { final String[] classpath = NativeImageGeneratorRunner.extractImageClassPath(arguments); URLClassLoader imageClassLoader; ClassLoader applicationClassLoader = Thread.currentThread().getContextClassLoader(); try { imageClassLoader = NativeImageGeneratorRunner.installNativeImageClassLoader(classpath); final ImageBuildTask task = loadCompilationTask(arguments, imageClassLoader); try { tasks.add(task); return task.build(arguments.toArray(new String[arguments.size()]), classpath, imageClassLoader); } finally { tasks.remove(task); } } finally { Thread.currentThread().setContextClassLoader(applicationClassLoader); } }
static Optional<Integer> extractPort(List<String> args) { Optional<String> portArg = extractArg(args, PORT_PREFIX); try { return portArg.map(arg -> Integer.parseInt(arg.substring(PORT_PREFIX.length()))); } catch (Throwable ignored) { System.err.println("error: invalid port number format"); } return Optional.empty(); }