You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bo...@apache.org on 2017/03/13 17:01:10 UTC

geode git commit: GEODE-2612: Added gfsh support for invoking callbacks during snapshot load

Repository: geode
Updated Branches:
  refs/heads/develop 4112204a9 -> f111cfef8


GEODE-2612: Added gfsh support for invoking callbacks during snapshot load


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

Branch: refs/heads/develop
Commit: f111cfef8d192b97b35a2433a31bb58fd772f2d0
Parents: 4112204
Author: Barry Oglesby <bo...@pivotal.io>
Authored: Thu Mar 9 15:49:14 2017 -0800
Committer: Barry Oglesby <bo...@pivotal.io>
Committed: Mon Mar 13 09:56:23 2017 -0700

----------------------------------------------------------------------
 .../internal/cli/commands/DataCommands.java     |   7 +-
 .../cli/functions/ImportDataFunction.java       |  15 ++-
 .../internal/cli/i18n/CliStrings.java           |   3 +
 .../commands/GemfireDataCommandsDUnitTest.java  | 117 +++++++++++++++++--
 .../cli/commands/golden-help-offline.properties |   6 +-
 5 files changed, 129 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/f111cfef/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
index a938987..484bbf2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
@@ -841,7 +841,10 @@ public class DataCommands implements CommandMarker {
       @CliOption(key = CliStrings.IMPORT_DATA__MEMBER, mandatory = true,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           optionContext = ConverterHint.MEMBERIDNAME,
-          help = CliStrings.IMPORT_DATA__MEMBER__HELP) String memberNameOrId) {
+          help = CliStrings.IMPORT_DATA__MEMBER__HELP) String memberNameOrId,
+      @CliOption(key = CliStrings.IMPORT_DATA__INVOKE_CALLBACKS, mandatory = false,
+          unspecifiedDefaultValue = "false",
+          help = CliStrings.IMPORT_DATA__INVOKE_CALLBACKS__HELP) boolean invokeCallbacks) {
 
     this.securityService.authorizeRegionWrite(regionName);
 
@@ -856,7 +859,7 @@ public class DataCommands implements CommandMarker {
             .format(CliStrings.INVALID_FILE_EXTENSION, CliStrings.GEODE_DATA_FILE_EXTENSION));
       }
       if (targetMember != null) {
-        final String args[] = {regionName, filePath};
+        final Object args[] = {regionName, filePath, invokeCallbacks};
         ResultCollector<?, ?> rc = CliUtil.executeFunction(importDataFunction, args, targetMember);
         List<Object> results = (List<Object>) rc.getResult();
 

http://git-wip-us.apache.org/repos/asf/geode/blob/f111cfef/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ImportDataFunction.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ImportDataFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ImportDataFunction.java
index 6444662..13949c8 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ImportDataFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ImportDataFunction.java
@@ -22,6 +22,7 @@ import org.apache.geode.cache.Region;
 import org.apache.geode.cache.execute.FunctionAdapter;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.snapshot.RegionSnapshotService;
+import org.apache.geode.cache.snapshot.SnapshotOptions;
 import org.apache.geode.cache.snapshot.SnapshotOptions.SnapshotFormat;
 import org.apache.geode.internal.InternalEntity;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
@@ -36,9 +37,13 @@ public class ImportDataFunction extends FunctionAdapter implements InternalEntit
   private static final long serialVersionUID = 1L;
 
   public void execute(FunctionContext context) {
-    final String[] args = (String[]) context.getArguments();
-    final String regionName = args[0];
-    final String importFileName = args[1];
+    final Object[] args = (Object[]) context.getArguments();
+    final String regionName = (String) args[0];
+    final String importFileName = (String) args[1];
+    boolean invokeCallbacks = false;
+    if (args.length > 2) {
+      invokeCallbacks = (boolean) args[2];
+    }
 
     try {
       final Cache cache = CacheFactory.getAnyInstance();
@@ -46,8 +51,10 @@ public class ImportDataFunction extends FunctionAdapter implements InternalEntit
       final String hostName = cache.getDistributedSystem().getDistributedMember().getHost();
       if (region != null) {
         RegionSnapshotService<?, ?> snapshotService = region.getSnapshotService();
+        SnapshotOptions options = snapshotService.createOptions();
+        options.invokeCallbacks(invokeCallbacks);
         File importFile = new File(importFileName);
-        snapshotService.load(new File(importFileName), SnapshotFormat.GEMFIRE);
+        snapshotService.load(new File(importFileName), SnapshotFormat.GEMFIRE, options);
         String successMessage = CliStrings.format(CliStrings.IMPORT_DATA__SUCCESS__MESSAGE,
             importFile.getCanonicalPath(), hostName, regionName);
         context.getResultSender().lastResult(successMessage);

http://git-wip-us.apache.org/repos/asf/geode/blob/f111cfef/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
index 51d39d6..b835e8b 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
@@ -1566,6 +1566,9 @@ public class CliStrings {
   public static final String IMPORT_DATA__REGION__NOT__FOUND = "Region {0} not found.";
   public static final String IMPORT_DATA__SUCCESS__MESSAGE =
       "Data imported from file : {0} on host : {1} to region : {2}";
+  public static final String IMPORT_DATA__INVOKE_CALLBACKS = "invoke-callbacks";
+  public static final String IMPORT_DATA__INVOKE_CALLBACKS__HELP =
+      "Whether callbacks should be invoked";
 
   /* 'list async-event-queues' command */
   public static final String LIST_ASYNC_EVENT_QUEUES = "list async-event-queues";

http://git-wip-us.apache.org/repos/asf/geode/blob/f111cfef/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/GemfireDataCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/GemfireDataCommandsDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/GemfireDataCommandsDUnitTest.java
index 8a20631..e99a7fb 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/GemfireDataCommandsDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/GemfireDataCommandsDUnitTest.java
@@ -31,8 +31,11 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
-import org.junit.Ignore;
+import org.apache.geode.cache.CacheListener;
+import org.apache.geode.cache.EntryEvent;
+import org.apache.geode.cache.util.CacheListenerAdapter;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -1730,18 +1733,19 @@ public class GemfireDataCommandsDUnitTest extends CliCommandTestBase {
 
       setUpJmxManagerOnVm0ThenConnect(null);
 
-      manager.invoke(new SerializableCallable() {
-        public Object call() {
-          Region region = createParReg(regionName, getCache());
-          return region.put("Manager", "ASD");
+      manager.invoke(new SerializableRunnable() {
+        public void run() {
+          createParReg(regionName, getCache());
         }
       });
 
-      vm1.invoke(new SerializableCallable() {
+      vm1.invoke(new SerializableRunnable() {
         @Override
-        public Object call() throws Exception {
+        public void run() throws Exception {
           Region region = createParReg(regionName, getCache());
-          return region.put("VM1", "QWE");
+          for (int i = 0; i < 100; i++) {
+            region.put(i, i);
+          }
         }
       });
 
@@ -1760,12 +1764,20 @@ public class GemfireDataCommandsDUnitTest extends CliCommandTestBase {
       vm1.invoke(new SerializableRunnable() {
         public void run() {
           Region region = getCache().getRegion(regionName);
-          region.destroy("Manager");
-          region.destroy("VM1");
+          for (int i = 0; i < 100; i++) {
+            region.destroy(i);
+          }
         }
       });
 
       /**
+       * Add CacheListener
+       */
+
+      manager.invoke(addCacheListenerInvocations(regionName));
+      vm1.invoke(addCacheListenerInvocations(regionName));
+
+      /**
        * Import the data
        */
 
@@ -1789,11 +1801,49 @@ public class GemfireDataCommandsDUnitTest extends CliCommandTestBase {
       manager.invoke(new SerializableRunnable() {
         public void run() {
           Region region = getCache().getRegion(regionName);
-          assertEquals(region.get("Manager"), "ASD");
-          assertEquals(region.get("VM1"), "QWE");
+          for (int i = 0; i < 100; i++) {
+            assertEquals(i, region.get(i));
+          }
+        }
+      });
+
+      /**
+       * Verify callbacks were not invoked
+       */
+
+      manager.invoke(verifyCacheListenerInvocations(regionName, false));
+      vm1.invoke(verifyCacheListenerInvocations(regionName, false));
+
+      /**
+       * Import the data with invokeCallbacks=true
+       */
+
+      vm1.invoke(new SerializableRunnable() {
+        public void run() {
+          Region region = getCache().getRegion(regionName);
+          for (int i = 0; i < 100; i++) {
+            region.destroy(i);
+          }
         }
       });
 
+      csb = new CommandStringBuilder(CliStrings.IMPORT_DATA);
+      csb.addOption(CliStrings.IMPORT_DATA__REGION, regionName);
+      csb.addOption(CliStrings.IMPORT_DATA__FILE, filePath);
+      csb.addOption(CliStrings.IMPORT_DATA__MEMBER, "Manager");
+      csb.addOption(CliStrings.IMPORT_DATA__INVOKE_CALLBACKS, "true");
+      commandString = csb.toString();
+      cmdResult = executeCommand(commandString);
+      commandResultToString(cmdResult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+
+      /**
+       * Verify callbacks were invoked
+       */
+
+      manager.invoke(verifyCacheListenerInvocations(regionName, true));
+      vm1.invoke(verifyCacheListenerInvocations(regionName, true));
+
       // Test for bad input
       csb = new CommandStringBuilder(CliStrings.EXPORT_DATA);
       csb.addOption(CliStrings.EXPORT_DATA__REGION, "FDSERW");
@@ -1824,6 +1874,35 @@ public class GemfireDataCommandsDUnitTest extends CliCommandTestBase {
     }
   }
 
+  private SerializableRunnable addCacheListenerInvocations(final String regionName) {
+    return new SerializableRunnable() {
+      public void run() {
+        Region region = getCache().getRegion(regionName);
+        region.getAttributesMutator().addCacheListener(new CountingCacheListener());
+      }
+    };
+  }
+
+  private SerializableRunnable verifyCacheListenerInvocations(final String regionName,
+      boolean callbacksShouldHaveBeenInvoked) {
+    return new SerializableRunnable() {
+      public void run() {
+        Region region = getCache().getRegion(regionName);
+        CacheListener<?, ?>[] listeners = region.getAttributes().getCacheListeners();
+        for (CacheListener<?, ?> listener : listeners) {
+          if (listener instanceof CountingCacheListener) {
+            CountingCacheListener ccl = (CountingCacheListener) listener;
+            if (callbacksShouldHaveBeenInvoked) {
+              assertNotEquals(0, ccl.getEvents());
+            } else {
+              assertEquals(0, ccl.getEvents());
+            }
+          }
+        }
+      }
+    };
+  }
+
   void setupWith2Regions() {
     final VM vm1 = Host.getHost(0).getVM(1);
     final VM vm2 = Host.getHost(0).getVM(2);
@@ -2329,4 +2408,18 @@ public class GemfireDataCommandsDUnitTest extends CliCommandTestBase {
         + memSizeFromFunctionCall);
     assertTrue(memSizeFromFunctionCall.equals(memSizeFromMbean));
   }
+
+  private static class CountingCacheListener extends CacheListenerAdapter {
+
+    private final AtomicInteger events = new AtomicInteger();
+
+    @Override
+    public void afterCreate(EntryEvent event) {
+      events.incrementAndGet();
+    }
+
+    private int getEvents() {
+      return events.get();
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/f111cfef/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
----------------------------------------------------------------------
diff --git a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
index 17b7515..8cc8aba 100644
--- a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
+++ b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
@@ -1682,7 +1682,7 @@ IS AVAILABLE\n\
 SYNOPSIS\n\
 \ \ \ \ Import user data from a file to a region.\n\
 SYNTAX\n\
-\ \ \ \ import data --region=value --file=value --member=value\n\
+\ \ \ \ import data --region=value --file=value --member=value [--invoke-callbacks=value]\n\
 PARAMETERS\n\
 \ \ \ \ region\n\
 \ \ \ \ \ \ \ \ Region into which data will be imported.\n\
@@ -1694,6 +1694,10 @@ PARAMETERS\n\
 \ \ \ \ \ \ \ \ Name/Id of a member which hosts the region. The data will be imported from the specified\n\
 \ \ \ \ \ \ \ \ file on the host where the member is running.\n\
 \ \ \ \ \ \ \ \ Required: true\n\
+\ \ \ \ invoke-callbacks\n\
+\ \ \ \ \ \ \ \ Whether callbacks should be invoked\n\
+\ \ \ \ \ \ \ \ Required: false\n\
+\ \ \ \ \ \ \ \ Default (if the parameter is not specified): false\n\
 
 list-async-event-queues.help=\
 NAME\n\