You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fo...@apache.org on 2020/08/20 14:57:25 UTC

svn commit: r1881021 - in /jackrabbit/oak/trunk/oak-search-elastic/src: main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ test/java/org/apache/jackrabbit/oak/plugins/index/elastic/

Author: fortino
Date: Thu Aug 20 14:57:25 2020
New Revision: 1881021

URL: http://svn.apache.org/viewvc?rev=1881021&view=rev
Log:
OAK-9169-2 - check elastic connection before activating service provider (patch by Amrit Verma)

Modified:
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticConnection.java
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderService.java
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderServiceTest.java

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticConnection.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticConnection.java?rev=1881021&r1=1881020&r2=1881021&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticConnection.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticConnection.java Thu Aug 20 14:57:25 2020
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
 import org.apache.http.Header;
 import org.apache.http.HttpHost;
 import org.apache.http.message.BasicHeader;
+import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestClient;
 import org.elasticsearch.client.RestClientBuilder;
 import org.elasticsearch.client.RestHighLevelClient;
@@ -119,6 +120,15 @@ public class ElasticConnection implement
         return indexPrefix;
     }
 
+    /**
+     * Checks if elastic server is available for connection.
+     * @return true if available, false otherwise.
+     * @throws IOException if some connection exception occurs.
+     */
+    public boolean isAvailable() throws IOException {
+        return this.getClient().ping(RequestOptions.DEFAULT);
+    }
+
     @Override
     public synchronized void close() throws IOException {
         if (client != null) {

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderService.java?rev=1881021&r1=1881020&r2=1881021&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderService.java Thu Aug 20 14:57:25 2020
@@ -36,6 +36,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.component.annotations.ReferenceCardinality;
@@ -48,6 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -57,17 +59,17 @@ import static org.apache.commons.io.File
 import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
 import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.scheduleWithFixedDelay;
 
-@Component
+@Component(configurationPolicy = ConfigurationPolicy.REQUIRE)
 @Designate(ocd = ElasticIndexProviderService.Config.class)
 public class ElasticIndexProviderService {
 
-    static final String PROP_INDEX_PREFIX = "indexPrefix";
-    private static final String PROP_ELASTIC_SCHEME = ElasticConnection.SCHEME_PROP;
-    private static final String PROP_ELASTIC_HOST = ElasticConnection.HOST_PROP;
-    private static final String PROP_ELASTIC_PORT = ElasticConnection.PORT_PROP;
-    private static final String PROP_ELASTIC_API_KEY_ID = ElasticConnection.API_KEY_ID_PROP;
-    private static final String PROP_ELASTIC_API_KEY_SECRET = ElasticConnection.API_KEY_SECRET_PROP;
-    private static final String PROP_LOCAL_TEXT_EXTRACTION_DIR = "localTextExtractionDir";
+    protected static final String PROP_INDEX_PREFIX = "indexPrefix";
+    protected static final String PROP_ELASTIC_SCHEME = ElasticConnection.SCHEME_PROP;
+    protected static final String PROP_ELASTIC_HOST = ElasticConnection.HOST_PROP;
+    protected static final String PROP_ELASTIC_PORT = ElasticConnection.PORT_PROP;
+    protected static final String PROP_ELASTIC_API_KEY_ID = ElasticConnection.API_KEY_ID_PROP;
+    protected static final String PROP_ELASTIC_API_KEY_SECRET = ElasticConnection.API_KEY_SECRET_PROP;
+    protected static final String PROP_LOCAL_TEXT_EXTRACTION_DIR = "localTextExtractionDir";
 
     @ObjectClassDefinition(name = "ElasticIndexProviderService", description = "Apache Jackrabbit Oak ElasticIndexProvider")
     public @interface Config {
@@ -145,7 +147,7 @@ public class ElasticIndexProviderService
     private String indexPrefix;
 
     @Activate
-    private void activate(BundleContext bundleContext, Config config) {
+    private void activate(BundleContext bundleContext, Config config) throws IOException {
         whiteboard = new OsgiWhiteboard(bundleContext);
 
         //initializeTextExtractionDir(bundleContext, config);
@@ -177,7 +179,11 @@ public class ElasticIndexProviderService
         }
     }
 
-    private void registerIndexCleaner(Config contextConfig) {
+    private void registerIndexCleaner(Config contextConfig) throws IOException {
+        boolean reachable = elasticConnection.isAvailable();
+        if (!reachable) {
+            throw new IllegalArgumentException("Elastic server is not available - " + elasticConnection.toString());
+        }
         ElasticIndexCleaner task = new ElasticIndexCleaner(elasticConnection, nodeStore, contextConfig.remoteIndexDeletionThreshold());
         oakRegs.add(scheduleWithFixedDelay(whiteboard, task, contextConfig.remoteIndexCleanupFrequency()));
     }

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderServiceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderServiceTest.java?rev=1881021&r1=1881020&r2=1881021&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderServiceTest.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticIndexProviderServiceTest.java Thu Aug 20 14:57:25 2020
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.stats.S
 import org.apache.sling.testing.mock.osgi.MockOsgi;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -37,17 +38,24 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexProviderService.PROP_ELASTIC_HOST;
+import static org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexProviderService.PROP_ELASTIC_PORT;
 import static org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexProviderService.PROP_INDEX_PREFIX;
 import static org.junit.Assert.assertNotNull;
 
 public class ElasticIndexProviderServiceTest {
 
+    private static final String elasticConnectionString = System.getProperty("elasticConnectionString");
+
     @Rule
     public final TemporaryFolder folder = new TemporaryFolder(new File("target"));
 
     @Rule
     public final OsgiContext context = new OsgiContext();
 
+    @ClassRule
+    public static ElasticConnectionRule elasticRule = new ElasticConnectionRule(elasticConnectionString);
+
     private final ElasticIndexProviderService service = new ElasticIndexProviderService();
 
     private Whiteboard wb;
@@ -68,6 +76,8 @@ public class ElasticIndexProviderService
         Map<String, Object> props = new HashMap<>();
         props.put("localTextExtractionDir", folder.newFolder("localTextExtractionDir").getAbsolutePath());
         props.put(PROP_INDEX_PREFIX, "elastic");
+        props.put(PROP_ELASTIC_HOST, "localhost");
+        props.put(PROP_ELASTIC_PORT, elasticRule.elastic.getFirstMappedPort());
         MockOsgi.activate(service, context.bundleContext(), props);
 
         assertNotNull(context.getService(QueryIndexProvider.class));