SGF-696 - Add support for invoking callbacks when loading snapshots.

This commit is contained in:
John Blum
2017-11-11 20:45:15 -08:00
parent c1ccfa33f6
commit 80d33e5fa0
4 changed files with 69 additions and 24 deletions

View File

@@ -97,6 +97,7 @@ class SnapshotServiceParser extends AbstractSingleBeanDefinitionParser {
true));
}
ParsingUtils.setPropertyValue(snapshotMetadataElement, snapshotMetadataBuilder, "invokeCallbacks");
ParsingUtils.setPropertyValue(snapshotMetadataElement, snapshotMetadataBuilder, "parallel");
return snapshotMetadataBuilder.getBeanDefinition();

View File

@@ -447,7 +447,9 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
}
protected SnapshotOptions<K, V> createOptions(SnapshotMetadata<K, V> metadata) {
return createOptions()
.invokeCallbacks(metadata.isInvokeCallbacks())
.setFilter(metadata.getFilter())
.setParallelMode(metadata.isParallel());
}
@@ -531,9 +533,10 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
}
}
protected void logDebug(Throwable t, String message, Object... arguments) {
protected void logDebug(Throwable cause, String message, Object... arguments) {
if (log.isDebugEnabled()) {
log.debug(String.format(message, arguments), t);
log.debug(String.format(message, arguments), cause);
}
}
@@ -740,11 +743,13 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
*/
public static class SnapshotMetadata<K, V> {
protected static final boolean DEFAULT_INVOKE_CALLBACKS = false;
protected static final boolean DEFAULT_PARALLEL = false;
protected static final SnapshotFormat DEFAULT_SNAPSHOT_FORMAT = SnapshotFormat.GEMFIRE;
private boolean parallel;
private boolean invokeCallbacks = DEFAULT_INVOKE_CALLBACKS;
private boolean parallel = DEFAULT_PARALLEL;
private final File location;
@@ -793,6 +798,14 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
return this.filter;
}
public void setInvokeCallbacks(boolean invokeCallbacks) {
this.invokeCallbacks = invokeCallbacks;
}
public boolean isInvokeCallbacks() {
return this.invokeCallbacks;
}
public void setParallel(boolean parallel) {
this.parallel = parallel;
}
@@ -803,8 +816,11 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
@Override
public String toString() {
return String.format("{ @type = %1$s, location = %2$s, format = %3$s, filter = %4$s, parallel = %5$s }",
getClass().getName(), getLocation().getAbsolutePath(), getFormat(), getFilter(), isParallel());
return String.format(
"{ @type = %1$s, location = %2$s, format = %3$s, filter = %4$s, invokeCallbacks = %5$s, parallel = %6$s }",
getClass().getName(), getLocation().getAbsolutePath(), getFormat(), getFilter(),
isInvokeCallbacks(), isParallel());
}
}
@@ -828,6 +844,7 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
}
protected String getFileExtension(File file) {
String fileExtension = "";
if (nullSafeIsFile(file)) {

View File

@@ -249,6 +249,7 @@ both in the same definition) is illegal.
</xsd:sequence>
<xsd:attribute name="filter-ref" type="xsd:string" use="optional"/>
<xsd:attribute name="format" type="xsd:string" use="optional" default="GEMFIRE"/>
<xsd:attribute name="invoke-callbacks" type="xsd:string" use="optional" default="false"/>
<xsd:attribute name="location" type="xsd:string" use="required"/>
<xsd:attribute name="parallel" type="xsd:string" use="optional" default="false"/>
</xsd:complexType>

View File

@@ -107,24 +107,27 @@ public class SnapshotServiceFactoryBeanTest {
}
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location) {
return newSnapshotMetadata(location, null, false, SnapshotFormat.GEMFIRE);
return newSnapshotMetadata(location, null, false, false, SnapshotFormat.GEMFIRE);
}
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(SnapshotFilter<K, V> filter, boolean parallel) {
return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter, parallel);
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(SnapshotFilter<K, V> filter,
boolean invokeCallbacks, boolean parallel) {
return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter, invokeCallbacks, parallel);
}
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location, SnapshotFilter<K, V> filter,
boolean parallel) {
boolean invokeCallbacks, boolean parallel) {
return newSnapshotMetadata(location, filter, parallel, SnapshotFormat.GEMFIRE);
return newSnapshotMetadata(location, filter, invokeCallbacks, parallel, SnapshotFormat.GEMFIRE);
}
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location, SnapshotFilter<K, V> filter,
boolean parallel, SnapshotFormat format) {
boolean invokeCallbacks, boolean parallel, SnapshotFormat format) {
SnapshotMetadata<K, V> snapshotMetadata = new SnapshotMetadata<>(location, format, filter);
snapshotMetadata.setInvokeCallbacks(invokeCallbacks);
snapshotMetadata.setParallel(parallel);
return snapshotMetadata;
@@ -722,14 +725,17 @@ public class SnapshotServiceFactoryBeanTest {
when(mockCache.getSnapshotService()).thenReturn(mockCacheSnapshotService);
when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
.thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
SnapshotMetadata[] expectedImports =
toArray(newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne, true),
newSnapshotMetadata(mockSnapshotFilterTwo, false));
SnapshotMetadata[] expectedImports = toArray(
newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne, false, true),
newSnapshotMetadata(mockSnapshotFilterTwo, true, false)
);
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
@@ -756,8 +762,10 @@ public class SnapshotServiceFactoryBeanTest {
verify(mockCacheSnapshotService, times(1))
.load(eq(FileSystemUtils.safeListFiles(FileSystemUtils.WORKING_DIRECTORY, FileSystemUtils.FileOnlyFilter.INSTANCE)),
eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo));
verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false));
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
}
@@ -783,16 +791,19 @@ public class SnapshotServiceFactoryBeanTest {
when(mockRegion.getSnapshotService()).thenReturn(mockRegionSnapshotService);
when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
.thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
File snapshotDatTwo = mockFile("snapshot-2.dat");
SnapshotMetadata[] expectedImports =
toArray(newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne, true),
newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo, false));
SnapshotMetadata[] expectedImports = toArray(
newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne, false, true),
newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo, true, false)
);
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
@@ -818,8 +829,10 @@ public class SnapshotServiceFactoryBeanTest {
.load(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsOne));
verify(mockRegionSnapshotService, times(1))
.load(eq(snapshotDatTwo), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo));
verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false));
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
}
@@ -841,14 +854,17 @@ public class SnapshotServiceFactoryBeanTest {
when(mockCache.getSnapshotService()).thenReturn(mockCacheSnapshotService);
when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
.thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
SnapshotMetadata[] expectedExports =
toArray(newSnapshotMetadata(mockSnapshotFilterOne, true),
newSnapshotMetadata(mockSnapshotFilterTwo, false));
SnapshotMetadata[] expectedExports = toArray(
newSnapshotMetadata(mockSnapshotFilterOne, false, true),
newSnapshotMetadata(mockSnapshotFilterTwo, true, false)
);
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
@@ -867,8 +883,10 @@ public class SnapshotServiceFactoryBeanTest {
eq(expectedExports[0].getFormat()), eq(mockSnapshotOptionsOne));
verify(mockCacheSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()),
eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo));
verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false));
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
}
@@ -893,14 +911,17 @@ public class SnapshotServiceFactoryBeanTest {
when(mockRegion.getSnapshotService()).thenReturn(mockRegionSnapshotService);
when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
.thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
SnapshotMetadata[] expectedExports =
toArray(newSnapshotMetadata(mockSnapshotFilterOne, true),
newSnapshotMetadata(mockSnapshotFilterTwo, false));
SnapshotMetadata[] expectedExports = toArray(
newSnapshotMetadata(mockSnapshotFilterOne, false, true),
newSnapshotMetadata(mockSnapshotFilterTwo, true, false)
);
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
@@ -920,19 +941,22 @@ public class SnapshotServiceFactoryBeanTest {
eq(expectedExports[0].getFormat()), eq(mockSnapshotOptionsOne));
verify(mockRegionSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()),
eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo));
verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false));
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true));
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
}
@Test
public void createOptionsWithParallelModeAndFilterOnSnapshotServiceAdapterSupport() {
public void createOptionsWithParallelModeInvokeCallbacksAndFilterOnSnapshotServiceAdapterSupport() {
SnapshotFilter mockSnapshotFilter = mock(SnapshotFilter.class, "MockSnapshotFilter");
SnapshotOptions mockSnapshotOptions = mock(SnapshotOptions.class, "MockSnapshotOptions");
when(mockSnapshotOptions.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptions);
when(mockSnapshotOptions.setFilter(any(SnapshotFilter.class))).thenReturn(mockSnapshotOptions);
when(mockSnapshotOptions.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptions);
@@ -946,10 +970,12 @@ public class SnapshotServiceFactoryBeanTest {
new SnapshotMetadata<>(mockFile("snapshot.gfd"), SnapshotMetadata.DEFAULT_SNAPSHOT_FORMAT,
mockSnapshotFilter);
snapshotMetadata.setInvokeCallbacks(true);
snapshotMetadata.setParallel(true);
assertThat(snapshotService.createOptions(snapshotMetadata), is(equalTo(mockSnapshotOptions)));
verify(mockSnapshotOptions, times(1)).invokeCallbacks(eq(true));
verify(mockSnapshotOptions, times(1)).setFilter(eq(mockSnapshotFilter));
verify(mockSnapshotOptions, times(1)).setParallelMode(eq(true));
}