diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/server/RPCServer.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/server/RPCServer.java | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/server/RPCServer.java b/src/main/java/com/google/devtools/build/lib/server/RPCServer.java index a1e9982a73..903ef567a7 100644 --- a/src/main/java/com/google/devtools/build/lib/server/RPCServer.java +++ b/src/main/java/com/google/devtools/build/lib/server/RPCServer.java @@ -26,10 +26,12 @@ import com.google.devtools.build.lib.unix.LocalClientSocket; import com.google.devtools.build.lib.unix.LocalServerSocket; import com.google.devtools.build.lib.unix.LocalSocketAddress; import com.google.devtools.build.lib.util.Clock; +import com.google.devtools.build.lib.util.OsUtils; import com.google.devtools.build.lib.util.ThreadUtils; import com.google.devtools.build.lib.util.io.OutErr; import com.google.devtools.build.lib.util.io.StreamMultiplexer; import com.google.devtools.build.lib.vfs.Path; +import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.io.InputStream; @@ -365,6 +367,18 @@ public final class RPCServer { ensureExclusiveAccess(socketFile); + // We create the server.pid file strictly before binding the socket. + // The client only accesses the pid file after connecting to the socket + // which ensures that it gets the correct pid value. + Path pidFile = serverDirectory.getRelative("server.pid"); + deleteAtExit(pidFile, /*deleteParent=*/ false); + try { + pidFile.delete(); + } catch (IOException e) { + // Ignore. + } + pidFile.createSymbolicLink(new PathFragment(String.valueOf(OsUtils.getpid()))); + LocalServerSocket serverSocket = new LocalServerSocket(); serverSocket.bind(new LocalSocketAddress(socketFile.getPathFile())); FilesystemUtils.chmod(socketFile.getPathFile(), 0600); // Lock it down. |