You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by rm...@apache.org on 2019/04/08 17:25:14 UTC

[metron] branch master updated: METRON-2022 Metron rest creates large number of connections to ZK which causes subsequent connection to zk fail (merrimanr) closes apache/metron#1367

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

rmerriman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metron.git


The following commit(s) were added to refs/heads/master by this push:
     new a1c257c  METRON-2022 Metron rest creates large number of connections to ZK which causes subsequent connection to zk fail (merrimanr) closes apache/metron#1367
a1c257c is described below

commit a1c257c6a583ba705d5e551fb5e7f5c9862097ac
Author: merrimanr <me...@gmail.com>
AuthorDate: Mon Apr 8 12:25:00 2019 -0500

    METRON-2022 Metron rest creates large number of connections to ZK which causes subsequent connection to zk fail (merrimanr) closes apache/metron#1367
---
 .../metron/solr/client/SolrClientFactory.java      | 84 ++++++++++++++++++++++
 .../java/org/apache/metron/solr/dao/SolrDao.java   | 33 +--------
 .../apache/metron/solr/dao/SolrMetaAlertDao.java   |  6 +-
 .../solr/dao/SolrMetaAlertRetrieveLatestDao.java   |  8 ++-
 .../metron/solr/dao/SolrMetaAlertUpdateDao.java    |  5 +-
 .../metron/solr/client/SolrClientFactoryTest.java  | 57 +++++++++++++++
 .../org/apache/metron/solr/dao/SolrDaoTest.java    | 50 ++-----------
 .../metron/solr/dao/SolrMetaAlertDaoTest.java      | 20 ++++++
 .../integration/SolrMetaAlertIntegrationTest.java  | 11 +--
 .../SolrRetrieveLatestIntegrationTest.java         |  2 +
 .../integration/SolrSearchIntegrationTest.java     |  2 +
 .../integration/SolrUpdateIntegrationTest.java     |  2 +
 12 files changed, 194 insertions(+), 86 deletions(-)

diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/client/SolrClientFactory.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/client/SolrClientFactory.java
new file mode 100644
index 0000000..4c704d9
--- /dev/null
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/client/SolrClientFactory.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metron.solr.client;
+
+import com.google.common.base.Splitter;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+
+/**
+ * Factory for creating a SolrClient.  The default implementation of SolrClient is CloudSolrClient.
+ */
+public class SolrClientFactory {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  private static SolrClient solrClient;
+
+  /**
+   * Creates a SolrClient.
+   * @param globalConfig Global config
+   * @return SolrClient
+   */
+  public static SolrClient create(Map<String, Object> globalConfig) {
+    if (solrClient == null) {
+      synchronized (SolrClientFactory.class) {
+        if (solrClient == null) {
+          solrClient = new CloudSolrClient.Builder().withZkHost(getZkHosts(globalConfig)).build();
+        }
+      }
+    }
+    return solrClient;
+  }
+
+  /**
+   * Closes the SolrClient connection and releases the reference.
+   */
+  public static void close() {
+    synchronized (SolrClientFactory.class) {
+      if (solrClient != null) {
+        try {
+          solrClient.close();
+        } catch (IOException e) {
+          LOG.error(e.getMessage(), e);
+        } finally {
+          solrClient = null;
+        }
+      }
+    }
+  }
+
+  /**
+   * Retrieves zookeeper hosts from the global config and formats them for CloudSolrClient instantiation.
+   * @param globalConfig Global config
+   * @return A list of properly formatted zookeeper servers
+   */
+  protected static List<String> getZkHosts(Map<String, Object> globalConfig) {
+    return Splitter.on(',').trimResults()
+            .splitToList((String) globalConfig.getOrDefault(SOLR_ZOOKEEPER, ""));
+  }
+}
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
index e6906f3..4a58808 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
@@ -17,9 +17,6 @@
  */
 package org.apache.metron.solr.dao;
 
-import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
-
-import com.google.common.base.Splitter;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
@@ -40,8 +37,8 @@ import org.apache.metron.indexing.dao.update.CommentAddRemoveRequest;
 import org.apache.metron.indexing.dao.update.Document;
 import org.apache.metron.indexing.dao.update.OriginalNotFoundException;
 import org.apache.metron.indexing.dao.update.PatchRequest;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
 import org.slf4j.Logger;
@@ -86,7 +83,7 @@ public class SolrDao implements IndexDao {
     }
     if (this.client == null) {
       this.accessConfig = config;
-      this.client = getSolrClient(getZkHosts());
+      this.client = SolrClientFactory.create(config.getGlobalConfigSupplier().get());
       this.solrSearchDao = new SolrSearchDao(this.client, this.accessConfig);
       this.solrRetrieveLatestDao = new SolrRetrieveLatestDao(this.client, this.accessConfig);
       this.solrUpdateDao = new SolrUpdateDao(this.client, this.solrRetrieveLatestDao, this.accessConfig);
@@ -167,32 +164,6 @@ public class SolrDao implements IndexDao {
     return this.solrUpdateDao.removeCommentFromAlert(request, latest);
   }
 
-  /**
-   * Builds a Solr client using the ZK hosts from the global config.
-   * @return SolrClient
-   */
-  public SolrClient getSolrClient() {
-    return new CloudSolrClient.Builder().withZkHost(getZkHosts()).build();
-  }
-
-  /**
-   * Builds a Solr client using the ZK hosts specified.
-   * @return SolrClient
-   */
-  public SolrClient getSolrClient(List<String> zkHosts) {
-    return new CloudSolrClient.Builder().withZkHost(zkHosts).build();
-  }
-
-  /**
-   * Get ZK hosts from the global config.
-   * @return List of ZkHosts
-   */
-  public List<String> getZkHosts() {
-    Map<String, Object> globalConfig = accessConfig.getGlobalConfigSupplier().get();
-    return Splitter.on(',').trimResults()
-        .splitToList((String) globalConfig.getOrDefault(SOLR_ZOOKEEPER, ""));
-  }
-
   void enableKerberos() {
     HttpClientUtil.addConfigurer(new Krb5HttpClientConfigurer());
   }
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
index 8ef9484..26dc25d 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
@@ -47,6 +47,7 @@ import org.apache.metron.indexing.dao.update.CommentAddRemoveRequest;
 import org.apache.metron.indexing.dao.update.Document;
 import org.apache.metron.indexing.dao.update.OriginalNotFoundException;
 import org.apache.metron.indexing.dao.update.PatchRequest;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.solr.client.solrj.SolrClient;
 
 public class SolrMetaAlertDao implements MetaAlertDao {
@@ -144,10 +145,11 @@ public class SolrMetaAlertDao implements MetaAlertDao {
       }
     };
 
-    SolrClient solrClient = solrDao.getSolrClient(solrDao.getZkHosts());
+    SolrClient solrClient = SolrClientFactory.create(globalConfigSupplier.get());
     this.metaAlertSearchDao = new SolrMetaAlertSearchDao(solrClient, solrDao.getSolrSearchDao(), config);
-    this.metaAlertRetrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrDao);
+    this.metaAlertRetrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrClient, solrDao);
     this.metaAlertUpdateDao = new SolrMetaAlertUpdateDao(
+        solrClient,
         solrDao,
         metaAlertSearchDao,
         metaAlertRetrieveLatestDao,
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
index 2797df2..e679d9f 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
@@ -27,6 +27,7 @@ import org.apache.metron.indexing.dao.metaalert.MetaAlertConstants;
 import org.apache.metron.indexing.dao.metaalert.MetaAlertRetrieveLatestDao;
 import org.apache.metron.indexing.dao.search.GetRequest;
 import org.apache.metron.indexing.dao.update.Document;
+import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -36,8 +37,10 @@ public class SolrMetaAlertRetrieveLatestDao implements
     MetaAlertRetrieveLatestDao {
 
   private SolrDao solrDao;
+  private SolrClient solrClient;
 
-  public SolrMetaAlertRetrieveLatestDao(SolrDao solrDao) {
+  public SolrMetaAlertRetrieveLatestDao(SolrClient client, SolrDao solrDao) {
+    this.solrClient = client;
     this.solrDao = solrDao;
   }
 
@@ -52,8 +55,7 @@ public class SolrMetaAlertRetrieveLatestDao implements
           .setFields("*", "[child parentFilter=" + guidClause + " limit=999]");
 
       try {
-        QueryResponse response = solrDao.getSolrClient(solrDao.getZkHosts())
-            .query(METAALERTS_COLLECTION, query);
+        QueryResponse response = solrClient.query(METAALERTS_COLLECTION, query);
         // GUID is unique, so it's definitely the first result
         if (response.getResults().size() == 1) {
           SolrDocument result = response.getResults().get(0);
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
index 124d4be..9072f6a 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
@@ -59,12 +59,13 @@ public class SolrMetaAlertUpdateDao extends AbstractLuceneMetaAlertUpdateDao imp
    * @param retrieveLatestDao A RetrieveLatestDao for getting the current state of items being
    *     mutated.
    */
-  public SolrMetaAlertUpdateDao(SolrDao solrDao,
+  public SolrMetaAlertUpdateDao(SolrClient solrClient,
+          SolrDao solrDao,
       SolrMetaAlertSearchDao metaAlertSearchDao,
       SolrMetaAlertRetrieveLatestDao retrieveLatestDao,
       MetaAlertConfig config) {
     super(solrDao, retrieveLatestDao, config);
-    this.solrClient = solrDao.getSolrClient(solrDao.getZkHosts());
+    this.solrClient = solrClient;
     this.metaAlertSearchDao = metaAlertSearchDao;
   }
 
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/client/SolrClientFactoryTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/client/SolrClientFactoryTest.java
new file mode 100644
index 0000000..12fdcc7
--- /dev/null
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/client/SolrClientFactoryTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metron.solr.client;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+import static org.junit.Assert.assertEquals;
+
+public class SolrClientFactoryTest {
+
+  @Test
+  public void testGetZkHostsSingle() {
+    Map<String, Object> globalConfig = new HashMap<String, Object>() {{
+      put(SOLR_ZOOKEEPER, "   zookeeper:2181   ");
+    }};
+
+    List<String> actual = SolrClientFactory.getZkHosts(globalConfig);
+    List<String> expected = new ArrayList<>();
+    expected.add("zookeeper:2181");
+    assertEquals(expected, actual);
+  }
+
+  @Test
+  public void testGetZkHostsMultiple() {
+    Map<String, Object> globalConfig = new HashMap<String, Object>() {{
+      put(SOLR_ZOOKEEPER, "   zookeeper:2181    ,   zookeeper2:2181    ");
+    }};
+
+    List<String> actual = SolrClientFactory.getZkHosts(globalConfig);
+    List<String> expected = new ArrayList<>();
+    expected.add("zookeeper:2181");
+    expected.add("zookeeper2:2181");
+    assertEquals(expected, actual);
+  }
+}
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
index 9d84669..df7845f 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
@@ -18,20 +18,17 @@
 package org.apache.metron.solr.dao;
 
 import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
-import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.verify;
 import static org.mockito.internal.verification.VerificationModeFactory.times;
 import static org.powermock.api.mockito.PowerMockito.doNothing;
-import static org.powermock.api.mockito.PowerMockito.doReturn;
 import static org.powermock.api.mockito.PowerMockito.mock;
+import static org.powermock.api.mockito.PowerMockito.mockStatic;
 import static org.powermock.api.mockito.PowerMockito.spy;
+import static org.powermock.api.mockito.PowerMockito.when;
 import static org.powermock.api.mockito.PowerMockito.whenNew;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import org.apache.metron.indexing.dao.AccessConfig;
@@ -39,6 +36,7 @@ import org.apache.metron.indexing.dao.search.GetRequest;
 import org.apache.metron.indexing.dao.search.GroupRequest;
 import org.apache.metron.indexing.dao.search.SearchRequest;
 import org.apache.metron.indexing.dao.update.Document;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.solr.client.solrj.SolrClient;
 import org.junit.Before;
 import org.junit.Rule;
@@ -49,7 +47,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({SolrDao.class})
+@PrepareForTest({SolrDao.class, SolrClientFactory.class})
 public class SolrDaoTest {
 
   @Rule
@@ -70,6 +68,7 @@ public class SolrDaoTest {
     solrUpdateDao = mock(SolrUpdateDao.class);
     solrRetrieveLatestDao = mock(SolrRetrieveLatestDao.class);
     solrColumnMetadataDao = mock(SolrColumnMetadataDao.class);
+    mockStatic(SolrClientFactory.class);
   }
 
   @Test
@@ -105,7 +104,7 @@ public class SolrDaoTest {
     );
 
     solrDao = spy(new SolrDao());
-    doReturn(client).when(solrDao).getSolrClient(Collections.singletonList("zookeeper:2181"));
+    when(SolrClientFactory.create(accessConfig.getGlobalConfigSupplier().get())).thenReturn(client);
     whenNew(SolrSearchDao.class).withArguments(client, accessConfig).thenReturn(solrSearchDao);
     whenNew(SolrRetrieveLatestDao.class).withArguments(client, accessConfig)
         .thenReturn(solrRetrieveLatestDao);
@@ -145,41 +144,4 @@ public class SolrDaoTest {
     solrDao.getColumnMetadata(Arrays.asList("bro", "snort"));
     verify(solrColumnMetadataDao).getColumnMetadata(Arrays.asList("bro", "snort"));
   }
-
-  @Test
-  public void testGetZkHostsSingle() {
-    AccessConfig accessConfig = new AccessConfig();
-    accessConfig.setGlobalConfigSupplier(() ->
-        new HashMap<String, Object>() {{
-          put(SOLR_ZOOKEEPER, "   zookeeper:2181   ");
-        }}
-    );
-
-    SolrDao solrDao = new SolrDao();
-    solrDao.init(accessConfig);
-
-    List<String> actual = solrDao.getZkHosts();
-    List<String> expected = new ArrayList<>();
-    expected.add("zookeeper:2181");
-    assertEquals(expected, actual);
-  }
-
-  @Test
-  public void testGetZkHostsMultiple() {
-    AccessConfig accessConfig = new AccessConfig();
-    accessConfig.setGlobalConfigSupplier(() ->
-        new HashMap<String, Object>() {{
-          put(SOLR_ZOOKEEPER, "   zookeeper:2181    ,   zookeeper2:2181    ");
-        }}
-    );
-
-    SolrDao solrDao = new SolrDao();
-    solrDao.init(accessConfig);
-
-    List<String> actual = solrDao.getZkHosts();
-    List<String> expected = new ArrayList<>();
-    expected.add("zookeeper:2181");
-    expected.add("zookeeper2:2181");
-    assertEquals(expected, actual);
-  }
 }
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
index 8920d5a..6817299 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
@@ -19,6 +19,9 @@
 package org.apache.metron.solr.dao;
 
 import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+import static org.powermock.api.mockito.PowerMockito.mock;
+import static org.powermock.api.mockito.PowerMockito.mockStatic;
+import static org.powermock.api.mockito.PowerMockito.when;
 
 import java.io.IOException;
 import java.util.Collections;
@@ -42,11 +45,20 @@ import org.apache.metron.indexing.dao.search.SearchResponse;
 import org.apache.metron.indexing.dao.update.CommentAddRemoveRequest;
 import org.apache.metron.indexing.dao.update.Document;
 import org.apache.metron.indexing.dao.update.PatchRequest;
+import org.apache.metron.solr.client.SolrClientFactory;
+import org.apache.solr.client.solrj.SolrClient;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SolrMetaAlertDao.class, SolrClientFactory.class})
 public class SolrMetaAlertDaoTest {
   private static AccessConfig accessConfig = new AccessConfig();
+  private SolrClient client;
 
   @BeforeClass
   public static void setupBefore() {
@@ -57,6 +69,14 @@ public class SolrMetaAlertDaoTest {
     );
   }
 
+  @SuppressWarnings("unchecked")
+  @Before
+  public void setUp() {
+    client = mock(SolrClient.class);
+    mockStatic(SolrClientFactory.class);
+    when(SolrClientFactory.create(accessConfig.getGlobalConfigSupplier().get())).thenReturn(client);
+  }
+
   @Test(expected = IllegalArgumentException.class)
   public void testInvalidInit() {
     IndexDao dao = new IndexDao() {
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
index 6687e9a..0e4b71f 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
@@ -45,12 +45,14 @@ import org.apache.metron.indexing.dao.search.GetRequest;
 import org.apache.metron.indexing.dao.search.SearchRequest;
 import org.apache.metron.indexing.dao.search.SearchResponse;
 import org.apache.metron.indexing.dao.search.SortField;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.metron.solr.dao.SolrDao;
 import org.apache.metron.solr.dao.SolrMetaAlertDao;
 import org.apache.metron.solr.dao.SolrMetaAlertRetrieveLatestDao;
 import org.apache.metron.solr.dao.SolrMetaAlertSearchDao;
 import org.apache.metron.solr.dao.SolrMetaAlertUpdateDao;
 import org.apache.metron.solr.integration.components.SolrComponent;
+import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.zookeeper.KeeperException;
 import org.junit.After;
@@ -113,12 +115,12 @@ public class SolrMetaAlertIntegrationTest extends MetaAlertIntegrationTest {
       }
     };
 
-
+    SolrClient solrClient = SolrClientFactory.create(globalConfig);
     SolrMetaAlertSearchDao searchDao = new SolrMetaAlertSearchDao(
-        solrDao.getSolrClient(solrDao.getZkHosts()),
+        solrClient,
         solrDao.getSolrSearchDao(), config);
-    SolrMetaAlertRetrieveLatestDao retrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrDao);
-    SolrMetaAlertUpdateDao updateDao = new SolrMetaAlertUpdateDao(solrDao, searchDao,
+    SolrMetaAlertRetrieveLatestDao retrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrClient, solrDao);
+    SolrMetaAlertUpdateDao updateDao = new SolrMetaAlertUpdateDao(solrClient, solrDao, searchDao,
         retrieveLatestDao, config);
     metaDao = new SolrMetaAlertDao(solrDao, searchDao, updateDao, retrieveLatestDao);
   }
@@ -133,6 +135,7 @@ public class SolrMetaAlertIntegrationTest extends MetaAlertIntegrationTest {
 
   @AfterClass
   public static void teardown() {
+    SolrClientFactory.close();
     if (solr != null) {
       solr.stop();
     }
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrRetrieveLatestIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrRetrieveLatestIntegrationTest.java
index f7c2e86..3978052 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrRetrieveLatestIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrRetrieveLatestIntegrationTest.java
@@ -34,6 +34,7 @@ import org.apache.metron.indexing.dao.AccessConfig;
 import org.apache.metron.indexing.dao.IndexDao;
 import org.apache.metron.indexing.dao.search.GetRequest;
 import org.apache.metron.indexing.dao.update.Document;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.metron.solr.dao.SolrDao;
 import org.apache.metron.solr.integration.components.SolrComponent;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -85,6 +86,7 @@ public class SolrRetrieveLatestIntegrationTest {
 
   @AfterClass
   public static void teardown() {
+    SolrClientFactory.close();
     solrComponent.stop();
   }
 
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
index 84f2222..081aa87 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
@@ -34,6 +34,7 @@ import org.apache.metron.indexing.dao.search.InvalidSearchException;
 import org.apache.metron.indexing.dao.search.SearchRequest;
 import org.apache.metron.indexing.dao.search.SearchResponse;
 import org.apache.metron.integration.InMemoryComponent;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.metron.solr.dao.SolrDao;
 import org.apache.metron.solr.integration.components.SolrComponent;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -64,6 +65,7 @@ public class SolrSearchIntegrationTest extends SearchIntegrationTest {
 
   @AfterClass
   public static void teardown() {
+    SolrClientFactory.close();
     if (solrComponent != null) {
       solrComponent.stop();
     }
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
index 5b96559..b2017ea 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
@@ -40,6 +40,7 @@ import org.apache.metron.indexing.dao.MultiIndexDao;
 import org.apache.metron.indexing.dao.UpdateIntegrationTest;
 import org.apache.metron.indexing.dao.update.Document;
 import org.apache.metron.indexing.util.IndexingCacheUtil;
+import org.apache.metron.solr.client.SolrClientFactory;
 import org.apache.metron.solr.dao.SolrDao;
 import org.apache.metron.solr.integration.components.SolrComponent;
 import org.junit.After;
@@ -106,6 +107,7 @@ public class SolrUpdateIntegrationTest extends UpdateIntegrationTest {
 
   @AfterClass
   public static void teardown() {
+    SolrClientFactory.close();
     solrComponent.stop();
   }