From 5a4309abf05a0674b43f6ce45a809b8868fe2667 Mon Sep 17 00:00:00 2001
From: Matthew Nesbit <matthew.nesbit@r3cev.com>
Date: Fri, 6 May 2016 10:06:34 +0100
Subject: [PATCH] Fix node lock to work on windows where automatic file
 deletion on exit does not work reliably.

---
 src/main/kotlin/core/node/Node.kt | 30 ++++++++++++++----------------
 1 file changed, 14 insertions(+), 16 deletions(-)

diff --git a/src/main/kotlin/core/node/Node.kt b/src/main/kotlin/core/node/Node.kt
index 35780542a9..4520a182ee 100644
--- a/src/main/kotlin/core/node/Node.kt
+++ b/src/main/kotlin/core/node/Node.kt
@@ -23,9 +23,7 @@ import org.glassfish.jersey.servlet.ServletContainer
 import java.io.RandomAccessFile
 import java.lang.management.ManagementFactory
 import java.nio.channels.FileLock
-import java.nio.file.Files
 import java.nio.file.Path
-import java.nio.file.StandardOpenOption
 import java.time.Clock
 import javax.management.ObjectName
 
@@ -155,20 +153,20 @@ class Node(dir: Path, val p2pAddr: HostAndPort, configuration: NodeConfiguration
         // twice with the same directory: that's a user error and we should bail out.
         val pidPath = dir.resolve("process-id")
         val file = pidPath.toFile()
-        if (file.exists()) {
-            val f = RandomAccessFile(file, "rw")
-            val l = f.channel.tryLock()
-            if (l == null) {
-                println("It appears there is already a node running with the specified data directory $dir")
-                println("Shut that other node down and try again. It may have process ID ${file.readText()}")
-                System.exit(1)
-            }
-            nodeFileLock = l
+        if (!file.exists()) {
+            file.createNewFile()
         }
+        file.deleteOnExit()
+        val f = RandomAccessFile(file, "rw")
+        val l = f.channel.tryLock()
+        if (l == null) {
+            println("It appears there is already a node running with the specified data directory $dir")
+            println("Shut that other node down and try again. It may have process ID ${file.readText()}")
+            System.exit(1)
+        }
+        nodeFileLock = l
         val ourProcessID: String = ManagementFactory.getRuntimeMXBean().name.split("@")[0]
-        Files.write(pidPath, ourProcessID.toByteArray(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)
-        pidPath.toFile().deleteOnExit()
-        if (nodeFileLock == null)
-            nodeFileLock = RandomAccessFile(file, "rw").channel.lock()
-    }
+        f.setLength(0)
+        f.write(ourProcessID.toByteArray())
+     }
 }