|
@@ -100,6 +100,11 @@ public class DataBlockScanner implements Runnable {
|
|
|
}
|
|
|
bpScanner.scanBlockPoolSlice();
|
|
|
}
|
|
|
+
|
|
|
+ // Call shutdown for each allocated BlockPoolSliceScanner.
|
|
|
+ for (BlockPoolSliceScanner bpss: blockPoolScannerMap.values()) {
|
|
|
+ bpss.shutdown();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Wait for at least one block pool to be up
|
|
@@ -232,9 +237,21 @@ public class DataBlockScanner implements Runnable {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public synchronized void shutdown() {
|
|
|
+ public void shutdown() {
|
|
|
+ synchronized (this) {
|
|
|
+ if (blockScannerThread != null) {
|
|
|
+ blockScannerThread.interrupt();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // We cannot join within the synchronized block, because it would create a
|
|
|
+ // deadlock situation. blockScannerThread calls other synchronized methods.
|
|
|
if (blockScannerThread != null) {
|
|
|
- blockScannerThread.interrupt();
|
|
|
+ try {
|
|
|
+ blockScannerThread.join();
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ // shutting down anyway
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|