This is an automated email from the ASF dual-hosted git repository.

jchen21 pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new cbfa6a8  GEODE-6511 Change data source to use connection pool by 
default (#3293)
cbfa6a8 is described below

commit cbfa6a88f700ddd6340b54029d215eaa0b65e128
Author: BenjaminPerryRoss <[email protected]>
AuthorDate: Wed Mar 13 12:11:51 2019 -0700

    GEODE-6511 Change data source to use connection pool by default (#3293)
    
    Co-authored-by: Ben Ross <[email protected]>
    Co-authored-by: Jianxia Chen <[email protected]>
---
 .../cli/DescribeDataSourceCommandDUnitTest.java    | 16 ++--
 .../cli/DestroyDataSourceCommandDUnitTest.java     | 88 +++++++++++++++++++++-
 .../cli/ListDataSourceCommandDUnitTest.java        | 18 ++++-
 .../jdbc/internal/cli/CreateDataSourceCommand.java |  9 ++-
 .../functions/DestroyJndiBindingFunctionTest.java  |  2 +-
 .../apache/geode/internal/jndi/JNDIInvoker.java    | 14 ++--
 .../cli/functions/DestroyJndiBindingFunction.java  |  6 +-
 7 files changed, 128 insertions(+), 25 deletions(-)

diff --git 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeDataSourceCommandDUnitTest.java
 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeDataSourceCommandDUnitTest.java
index 4b08344..cdb4bfb 100644
--- 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeDataSourceCommandDUnitTest.java
+++ 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeDataSourceCommandDUnitTest.java
@@ -61,7 +61,7 @@ public class DescribeDataSourceCommandDUnitTest {
   @Test
   public void describeDataSourceForSimpleDataSource() {
     gfsh.executeAndAssertThat(
-        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
+        "create data-source --name=simple --pooled=false 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
 
     CommandResultAssert result = gfsh.executeAndAssertThat("describe 
data-source --name=simple");
@@ -87,7 +87,7 @@ public class DescribeDataSourceCommandDUnitTest {
   private void executeSql(String sql) {
     server.invoke(() -> {
       try {
-        DataSource ds = JNDIInvoker.getDataSource("simple");
+        DataSource ds = JNDIInvoker.getDataSource("pool");
         Connection conn = ds.getConnection();
         Statement sm = conn.createStatement();
         sm.execute(sql);
@@ -136,24 +136,24 @@ public class DescribeDataSourceCommandDUnitTest {
   @Test
   public void describeDataSourceUsedByRegionsListsTheRegionsInOutput() {
     gfsh.executeAndAssertThat(
-        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\"")
+        "create data-source --name=pool 
--url=\"jdbc:derby:memory:newDB;create=true\"")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
     gfsh.executeAndAssertThat("create region --name=region1 
--type=REPLICATE").statusIsSuccess();
     gfsh.executeAndAssertThat("create region --name=region2 
--type=PARTITION").statusIsSuccess();
     setupDatabase();
     try {
       gfsh.executeAndAssertThat(
-          "create jdbc-mapping --region=region1 --data-source=simple 
--pdx-name="
+          "create jdbc-mapping --region=region1 --data-source=pool --pdx-name="
               + IdAndName.class.getName() + " --schema=mySchema");
       gfsh.executeAndAssertThat(
-          "create jdbc-mapping --region=region2 --data-source=simple 
--pdx-name="
+          "create jdbc-mapping --region=region2 --data-source=pool --pdx-name="
               + IdAndName.class.getName() + " --schema=mySchema");
 
-      CommandResultAssert result = gfsh.executeAndAssertThat("describe 
data-source --name=simple");
+      CommandResultAssert result = gfsh.executeAndAssertThat("describe 
data-source --name=pool");
 
       result.statusIsSuccess()
-          .tableHasRowWithValues("Property", "Value", "name", "simple")
-          .tableHasRowWithValues("Property", "Value", "pooled", "false")
+          .tableHasRowWithValues("Property", "Value", "name", "pool")
+          .tableHasRowWithValues("Property", "Value", "pooled", "true")
           .tableHasRowWithValues("Property", "Value", "url", 
"jdbc:derby:memory:newDB;create=true");
       InfoResultModel infoSection = result.getResultModel()
           
.getInfoSection(DescribeDataSourceCommand.REGIONS_USING_DATA_SOURCE_SECTION);
diff --git 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
index 1df7163..c482405 100644
--- 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
+++ 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
@@ -72,7 +72,7 @@ public class DestroyDataSourceCommandDUnitTest {
         .invokeInEveryMember(
             () -> 
assertThat(JNDIInvoker.getBindingNamesRecursively(JNDIInvoker.getJNDIContext()))
                 .containsKey("java:datasource1").containsValue(
-                    
"org.apache.geode.internal.datasource.GemFireBasicDataSource"),
+                    "com.zaxxer.hikari.HikariDataSource"),
             server1, server2);
 
     gfsh.executeAndAssertThat("destroy data-source 
--name=datasource1").statusIsSuccess()
@@ -120,6 +120,69 @@ public class DestroyDataSourceCommandDUnitTest {
     });
   }
 
+  @Test
+  public void testDestroySimpleDataSource() throws Exception {
+    // drop the default pooled data source
+    gfsh.executeAndAssertThat("destroy data-source 
--name=datasource1").statusIsSuccess();
+
+    // create a simple data source, i.e. non-pooled data source
+    gfsh.execute(
+        "create data-source --name=datasource2 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false");
+
+    // assert that there is a datasource
+    VMProvider
+        .invokeInEveryMember(
+            () -> 
assertThat(JNDIInvoker.getBindingNamesRecursively(JNDIInvoker.getJNDIContext()))
+                .containsKey("java:datasource2").containsValue(
+                    
"org.apache.geode.internal.datasource.GemFireBasicDataSource"),
+            server1, server2);
+
+
+    gfsh.executeAndAssertThat("destroy data-source 
--name=datasource2").statusIsSuccess()
+        .tableHasColumnOnlyWithValues("Member", "server-1", "server-2")
+        .tableHasColumnOnlyWithValues("Message",
+            "Data source \"datasource2\" destroyed on \"server-1\"",
+            "Data source \"datasource2\" destroyed on \"server-2\"");
+
+    // verify cluster config is updated
+    locator.invoke(() -> {
+      InternalLocator internalLocator = ClusterStartupRule.getLocator();
+      AssertionsForClassTypes.assertThat(internalLocator).isNotNull();
+      InternalConfigurationPersistenceService ccService =
+          internalLocator.getConfigurationPersistenceService();
+      Configuration configuration = ccService.getConfiguration("cluster");
+      Document document = 
XmlUtils.createDocumentFromXml(configuration.getCacheXmlContent());
+      NodeList jndiBindings = document.getElementsByTagName("jndi-binding");
+
+      
AssertionsForClassTypes.assertThat(jndiBindings.getLength()).isEqualTo(0);
+
+      boolean found = false;
+      for (int i = 0; i < jndiBindings.getLength(); i++) {
+        Element eachBinding = (Element) jndiBindings.item(i);
+        if (eachBinding.getAttribute("jndi-name").equals("datasource2")) {
+          found = true;
+          break;
+        }
+      }
+      AssertionsForClassTypes.assertThat(found).isFalse();
+    });
+
+    // verify datasource does not exists
+    VMProvider.invokeInEveryMember(
+        () -> 
AssertionsForClassTypes.assertThat(JNDIInvoker.getNoOfAvailableDataSources())
+            .isEqualTo(0),
+        server1, server2);
+
+    // bounce server1 and assert that there is still no datasource received 
from cluster config
+    server1.stop(false);
+    server1 = cluster.startServerVM(1, locator.getPort());
+
+    // verify no datasource from cluster config
+    server1.invoke(() -> {
+      
AssertionsForClassTypes.assertThat(JNDIInvoker.getNoOfAvailableDataSources()).isEqualTo(0);
+    });
+  }
+
   private void createTable() {
     executeSql("create table mySchema.myRegion (id varchar(10) primary key, 
name varchar(10))");
   }
@@ -196,4 +259,27 @@ public class DestroyDataSourceCommandDUnitTest {
       dropTable();
     }
   }
+
+  @Test
+  public void destroySimpleDataSourceFailsIfInUseByJdbcMapping() throws 
Exception {
+    // create a simple data source, i.e. non-pooled data source
+    gfsh.execute(
+        "create data-source --name=datasource2 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false");
+
+    gfsh.executeAndAssertThat("create region --name=myRegion 
--type=REPLICATE").statusIsSuccess();
+    createTable();
+    try {
+      gfsh.executeAndAssertThat(
+          "create jdbc-mapping --data-source=datasource2 --pdx-name=" + 
IdAndName.class.getName()
+              + " --region=myRegion --schema=mySchema")
+          .statusIsSuccess();
+
+      gfsh.executeAndAssertThat("destroy data-source 
--name=datasource2").statusIsError()
+          .containsOutput(
+              "Data source named \"datasource2\" is still being used by region 
\"myRegion\"."
+                  + " Use destroy jdbc-mapping --region=myRegion and then try 
again.");
+    } finally {
+      dropTable();
+    }
+  }
 }
diff --git 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
index b334ee2..ca3df16 100644
--- 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
+++ 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
@@ -56,7 +56,7 @@ public class ListDataSourceCommandDUnitTest {
   @Test
   public void listDataSourceForSimpleDataSource() {
     gfsh.executeAndAssertThat(
-        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
+        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword --pooled=false ")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
 
     CommandResultAssert result = gfsh.executeAndAssertThat("list data-source");
@@ -128,7 +128,7 @@ public class ListDataSourceCommandDUnitTest {
   @Test
   public void listDataSourceUsedByRegionsHasCorrectOutput() {
     gfsh.executeAndAssertThat(
-        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\"")
+        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
     setupDatabase();
     gfsh.executeAndAssertThat("create region --name=region1 
--type=REPLICATE").statusIsSuccess();
@@ -163,9 +163,21 @@ public class ListDataSourceCommandDUnitTest {
   }
 
   @Test
+  public void listDataSourceForPooledDataSourceByDefault() {
+    gfsh.executeAndAssertThat(
+        "create data-source --name=pooledDataSource 
--url=\"jdbc:derby:memory:newDB;create=true\" 
--pooled-data-source-factory-class=org.apache.geode.internal.jta.CacheJTAPooledDataSourceFactory
 
--pool-properties={'name':'prop1','value':'value1'},{'name':'pool.prop2','value':'value2'}")
+        .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
+
+    gfsh.executeAndAssertThat("list data-source").statusIsSuccess()
+        .tableHasRowWithValues("name", "pooled", "in use", "url", 
"pooledDataSource", "true",
+            "false",
+            "jdbc:derby:memory:newDB;create=true");
+  }
+
+  @Test
   public void listDataSourceWithMultipleDataSourcesListsAll() {
     gfsh.executeAndAssertThat(
-        "create data-source --name=simple 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
+        "create data-source --name=simple --pooled=false 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
     gfsh.executeAndAssertThat(
         "create data-source --name=pooledDataSource --pooled 
--url=\"jdbc:derby:memory:newDB;create=true\" 
--pooled-data-source-factory-class=org.apache.geode.internal.jta.CacheJTAPooledDataSourceFactory
 
--pool-properties={'name':'prop1','value':'value1'},{'name':'pool.prop2','value':'value2'}")
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateDataSourceCommand.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateDataSourceCommand.java
index ea68cd7..c4b1255 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateDataSourceCommand.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateDataSourceCommand.java
@@ -91,12 +91,17 @@ public class CreateDataSourceCommand extends 
SingleGfshCommand {
       @CliOption(key = CliStrings.IFNOTEXISTS, help = IFNOTEXISTS__HELP,
           specifiedDefaultValue = "true", unspecifiedDefaultValue = "false") 
boolean ifNotExists,
       @CliOption(key = POOLED, help = POOLED__HELP,
-          specifiedDefaultValue = "true", unspecifiedDefaultValue = "false") 
boolean pooled,
+          specifiedDefaultValue = "true", unspecifiedDefaultValue = "true") 
boolean pooled,
       @CliOption(key = POOL_PROPERTIES, optionContext = 
"splittingRegex=,(?![^{]*\\})",
           help = POOL_PROPERTIES_HELP) PoolProperty[] poolProperties) {
 
     JndiBindingsType.JndiBinding configuration = new 
JndiBindingsType.JndiBinding();
-    configuration.setConnPooledDatasourceClass(pooledDataSourceFactoryClass);
+    if (pooled) {
+      if (pooledDataSourceFactoryClass == null) {
+        pooledDataSourceFactoryClass = 
DEFAULT_POOLED_DATA_SOURCE_FACTORY_CLASS;
+      }
+      configuration.setConnPooledDatasourceClass(pooledDataSourceFactoryClass);
+    }
     configuration.setConnectionUrl(url);
     configuration.setJndiName(name);
     configuration.setPassword(password);
diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
index 3717fdc..87758b4 100644
--- 
a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
@@ -134,7 +134,7 @@ public class DestroyJndiBindingFunctionTest {
     when(context.getArguments()).thenReturn(new Object[] {"jndi1", true});
     when(context.getResultSender()).thenReturn(resultSender);
     DestroyJndiBindingFunction destroyFunctionSpy = 
spy(destroyJndiBindingFunction);
-    doReturn(true).when(destroyFunctionSpy).checkForInvalidDataSource(any());
+    doReturn(false).when(destroyFunctionSpy).isValidDataSource(any());
 
     destroyFunctionSpy.execute(context);
     verify(resultSender).lastResult(resultCaptor.capture());
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java 
b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
index 5c050d3..8380539 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
@@ -48,8 +48,7 @@ import 
org.apache.geode.internal.datasource.ClientConnectionFactoryWrapper;
 import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.datasource.DataSourceCreateException;
 import org.apache.geode.internal.datasource.DataSourceFactory;
-import org.apache.geode.internal.datasource.GemFireBasicDataSource;
-import org.apache.geode.internal.datasource.GemFireConnPooledDataSource;
+import org.apache.geode.internal.datasource.GemFireTransactionDataSource;
 import org.apache.geode.internal.jta.TransactionManagerImpl;
 import org.apache.geode.internal.jta.TransactionUtils;
 import org.apache.geode.internal.jta.UserTransactionImpl;
@@ -406,14 +405,15 @@ public class JNDIInvoker {
     }
   }
 
-  public static boolean checkForInvalidDataSource(String name) {
+  public static boolean isValidDataSource(String name) {
     Object dataSource = dataSourceMap.get(name);
 
-    if (dataSource == null || dataSource instanceof GemFireBasicDataSource
-        || dataSource instanceof GemFireConnPooledDataSource) {
-      return false;
+    if (dataSource == null || (dataSource != null && dataSource instanceof 
DataSource
+        && !(dataSource instanceof GemFireTransactionDataSource))) {
+      return true;
     }
-    return true;
+
+    return false;
   }
 
   /**
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
index a31d8bd..eba763e 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
@@ -32,7 +32,7 @@ public class DestroyJndiBindingFunction extends 
CliFunction<Object[]> {
 
     if (destroyingDataSource) {
       typeName = "Data source";
-      if (checkForInvalidDataSource(jndiName)) {
+      if (!isValidDataSource(jndiName)) {
         return new CliFunctionResult(context.getMemberName(), 
CliFunctionResult.StatusState.ERROR,
             CliStrings.format(
                 "Data Source {0} has invalid type for destroy data-source, 
destroy jndi-binding command should be used.",
@@ -53,7 +53,7 @@ public class DestroyJndiBindingFunction extends 
CliFunction<Object[]> {
     }
   }
 
-  boolean checkForInvalidDataSource(String jndiName) {
-    return JNDIInvoker.checkForInvalidDataSource(jndiName);
+  boolean isValidDataSource(String jndiName) {
+    return JNDIInvoker.isValidDataSource(jndiName);
   }
 }

Reply via email to