changeset 255:7c3bea2249ab

Bug 3458: Temp directory for ArchiveData is not removed when exiting Reviewed-by: ykubota https://github.com/HeapStats/heapstats/pull/125
author Yasumasa Suenaga <yasuenag@gmail.com>
date Wed, 01 Nov 2017 13:11:23 +0900
parents b65ab2ba6cd8
children ca86f078eb34
files ChangeLog analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java
diffstat 2 files changed, 27 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Oct 31 16:22:46 2017 +0900
+++ b/ChangeLog	Wed Nov 01 13:11:23 2017 +0900
@@ -1,3 +1,7 @@
+2017-11-01 Yasumasa Suenaga <yasuenag@gmail.com>
+
+	* Bug 3458: Temp directory for ArchiveData is not removed when exiting
+
 2017-10-31 Yasumasa Suenaga <yasuenag@gmail.com>
 
 	* Bug 3456: Build warnings w/ GCC 7.2.1
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java	Tue Oct 31 16:22:46 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java	Wed Nov 01 13:11:23 2017 +0900
@@ -111,8 +111,12 @@
 
     private static Set<PhantomRefWrapper> refSet;
 
+    private static Thread cleanerThread;
+
+    private static volatile boolean isCleanerTerminated;
+
     private static void cleaner() {
-        while (true) {
+        while (!isCleanerTerminated) {
             try {
                 PhantomRefWrapper ref = (PhantomRefWrapper) refQueue.remove();
                 ref.clean();
@@ -121,14 +125,29 @@
                 // Do nothing.
             }
         }
+
+        refSet.forEach(PhantomRefWrapper::clean);
+    }
+
+    public static void sendCleanerTerminateRequest() {
+        isCleanerTerminated = true;
+        cleanerThread.interrupt();
+
+        try {
+            cleanerThread.join();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
     }
 
     static {
         refQueue = new ReferenceQueue<>();
         refSet = Collections.synchronizedSet(new HashSet<>());
-        Thread th = new Thread(ArchiveData::cleaner, "ArchiveData cleaner");
-        th.setDaemon(true);
-        th.start();
+        cleanerThread = new Thread(ArchiveData::cleaner, "ArchiveData cleaner");
+        cleanerThread.setDaemon(true);
+        cleanerThread.start();
+
+        Runtime.getRuntime().addShutdownHook(new Thread(ArchiveData::sendCleanerTerminateRequest));
     }
 
     /**
@@ -140,7 +159,6 @@
     public ArchiveData(LogData log) throws IOException{
         this(log, null);
         extractPath = Files.createTempDirectory("heapstats_archive").toFile();
-        extractPath.deleteOnExit();
         refSet.add(new PhantomRefWrapper(this));
     }