Repository: geode
Updated Branches:
  refs/heads/feature/GEM-1483 1ceb97c7a -> 40fb5fdf9 (forced update)


GEODE-3194: cleanup disk store on failed initial recovery

This closes #627


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/987f2032
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/987f2032
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/987f2032

Branch: refs/heads/feature/GEM-1483
Commit: 987f20326d00a60429b90149e32ba8b82b199634
Parents: 02adb28
Author: Nick Reich <nre...@pivotal.io>
Authored: Wed Jul 12 09:54:07 2017 -0700
Committer: Darrel Schneider <dschnei...@pivotal.io>
Committed: Wed Jul 12 10:52:45 2017 -0700

----------------------------------------------------------------------
 .../internal/cache/DiskStoreFactoryImpl.java    | 18 ++++++++++++++++--
 .../cache/DiskStoreFactoryJUnitTest.java        | 20 ++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/987f2032/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreFactoryImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreFactoryImpl.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreFactoryImpl.java
index 7a7044b..0288ef1 100755
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreFactoryImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreFactoryImpl.java
@@ -119,7 +119,7 @@ public class DiskStoreFactoryImpl implements 
DiskStoreFactory {
       DiskStoreImpl ds =
           new DiskStoreImpl(this.cache, this.attrs, true/* ownedByRegion */, 
internalRegionArgs);
       if (isOwnedByPR) {
-        ds.doInitialRecovery();
+        initializeDiskStore(ds);
       }
       this.cache.addRegionOwnedDiskStore(ds);
       return ds;
@@ -141,7 +141,7 @@ public class DiskStoreFactoryImpl implements 
DiskStoreFactory {
           // Added for M&M
           this.cache.getInternalDistributedSystem()
               .handleResourceEvent(ResourceEvent.DISKSTORE_CREATE, dsi);
-          dsi.doInitialRecovery();
+          initializeDiskStore(dsi);
           this.cache.addDiskStore(dsi);
           if (registry != null) {
             registry.creatingDiskStore(dsi);
@@ -168,6 +168,20 @@ public class DiskStoreFactoryImpl implements 
DiskStoreFactory {
     return result;
   }
 
+  /**
+   * Protected for testing purposes. If during the initial recovery for the 
disk store, an uncaught
+   * exception is thrown, the disk store will not be in a valid state. In this 
case, we want to
+   * ensure the resources of the disk store are cleaned up.
+   */
+  protected void initializeDiskStore(DiskStoreImpl diskStore) {
+    try {
+      diskStore.doInitialRecovery();
+    } catch (RuntimeException e) {
+      diskStore.close();
+      throw e;
+    }
+  }
+
   private DiskStore findExisting(String name) {
     DiskStore existing = null;
     if (this.cache instanceof GemFireCacheImpl) {

http://git-wip-us.apache.org/repos/asf/geode/blob/987f2032/geode-core/src/test/java/org/apache/geode/internal/cache/DiskStoreFactoryJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/internal/cache/DiskStoreFactoryJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/internal/cache/DiskStoreFactoryJUnitTest.java
index ea0baa2..fdbe184 100644
--- 
a/geode-core/src/test/java/org/apache/geode/internal/cache/DiskStoreFactoryJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/internal/cache/DiskStoreFactoryJUnitTest.java
@@ -16,6 +16,11 @@ package org.apache.geode.internal.cache;
 
 import static org.apache.geode.distributed.ConfigurationProperties.*;
 import static org.junit.Assert.*;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.FilenameFilter;
@@ -424,6 +429,21 @@ public class DiskStoreFactoryJUnitTest {
     removeFiles(diskStore);
   }
 
+  @Test
+  public void failedDiskStoreInitialRecoveryCleansUpDiskStore() {
+    DiskStoreFactory dsf = cache.createDiskStoreFactory();
+    DiskStoreImpl diskStore = mock(DiskStoreImpl.class);
+    doThrow(RuntimeException.class).when(diskStore).doInitialRecovery();
+    boolean threwException = false;
+    try {
+      ((DiskStoreFactoryImpl) dsf).initializeDiskStore(diskStore);
+    } catch (RuntimeException e) {
+      threwException = true;
+    }
+    assertTrue(threwException);
+    verify(diskStore, times(1)).close();
+  }
+
   // setDiskDirs and setDiskDirsAndSizes are tested in 
DiskRegionIllegalArguementsJUnitTest
   // also setDiskUsageWarningPercentage and setDiskUsageCriticalPercentage
 }

Reply via email to