usergrid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sfeld...@apache.org
Subject incubator-usergrid git commit: moving towards futures
Date Thu, 19 Feb 2015 17:57:24 GMT
Repository: incubator-usergrid
Updated Branches:
  refs/heads/USERGRID-273-indexbuffer 83744b35d -> 8659771b1


moving towards futures


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/8659771b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/8659771b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/8659771b

Branch: refs/heads/USERGRID-273-indexbuffer
Commit: 8659771b1e84a73689b53c7d85194658f2bf64ee
Parents: 83744b3
Author: Shawn Feldman <sfeldman@apache.org>
Authored: Thu Feb 19 09:57:10 2015 -0800
Committer: Shawn Feldman <sfeldman@apache.org>
Committed: Thu Feb 19 09:57:10 2015 -0800

----------------------------------------------------------------------
 .../persistence/index/EntityIndexBatch.java     |  26 ++-
 .../persistence/index/IndexBatchBuffer.java     |   9 +-
 .../usergrid/persistence/index/IndexFig.java    |  24 +-
 .../index/impl/IndexBatchBufferImpl.java        | 234 ++++++++++---------
 .../persistence/index/impl/EntityIndexTest.java |  52 ++++-
 5 files changed, 216 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/8659771b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexBatch.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexBatch.java
b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexBatch.java
index 68008bf..f5b8abc 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexBatch.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexBatch.java
@@ -29,37 +29,41 @@ public interface EntityIndexBatch {
 
     /**
      * Create index for Entity
+     *
      * @param indexScope The scope for the index
-     * @param entity Entity to be indexed.
+     * @param entity     Entity to be indexed.
      */
-    public EntityIndexBatch index( final IndexScope indexScope, final Entity entity );
+    public EntityIndexBatch index(final IndexScope indexScope, final Entity entity);
 
     /**
      * Remove index of entity
-     * @param scope The scope for the entity
+     *
+     * @param scope  The scope for the entity
      * @param entity Entity to be removed from index.
      */
-    public EntityIndexBatch deindex(final IndexScope scope, final Entity entity );
+    public EntityIndexBatch deindex(final IndexScope scope, final Entity entity);
 
     /**
      * Remove index of entity.
-     * @param scope The scope to use for removal
+     *
+     * @param scope  The scope to use for removal
      * @param result CandidateResult to be removed from index.
      */
-    public EntityIndexBatch deindex(final IndexScope scope, final CandidateResult result
);
+    public EntityIndexBatch deindex(final IndexScope scope, final CandidateResult result);
 
     /**
      * Remove index of entity.
-     * @param scope The scope to remove
-     * @param id Id to be removed from index.
+     *
+     * @param scope   The scope to remove
+     * @param id      Id to be removed from index.
      * @param version Version to be removed from index.
      */
     public EntityIndexBatch deindex(final IndexScope scope, final Id id, final UUID version);
 
 
-        /**
-         * Execute the batch
-         */
+    /**
+     * Execute the batch
+     */
     public void execute();
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/8659771b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexBatchBuffer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexBatchBuffer.java
b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexBatchBuffer.java
index 4a384b4..6314bf2 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexBatchBuffer.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexBatchBuffer.java
@@ -18,6 +18,9 @@ package org.apache.usergrid.persistence.index;
 
 import org.elasticsearch.action.delete.DeleteRequestBuilder;
 import org.elasticsearch.action.index.IndexRequestBuilder;
+import rx.Observable;
+
+import java.util.concurrent.Future;
 
 /**
  * Buffer for index operations,
@@ -36,14 +39,16 @@ public interface IndexBatchBuffer {
 
     /**
      * put request into buffer
+     *
      * @param builder
      */
-    public void put(IndexRequestBuilder builder);
+    public Observable put(IndexRequestBuilder builder);
 
     /**
      * put request into buffer
+     *
      * @param builder
      */
-    public void put(DeleteRequestBuilder builder);
+    public Observable put(DeleteRequestBuilder builder);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/8659771b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexFig.java
b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexFig.java
index 36ca588..9bdac36 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexFig.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexFig.java
@@ -53,13 +53,17 @@ public interface IndexFig extends GuicyFig {
 
     public static final String INDEX_BUFFER_TIMEOUT = "elasticsearch.buffer_size";
 
+    public static final String INDEX_BATCH_SIZE = "elasticsearch.batch_size";
+
+    public static final String INDEX_WRITE_CONSISTENCY_LEVEL = "elasticsearch.write_consistency_level";
+
     /**
      * the number of times we can fail before we refresh the client
      */
     public static final String ELASTICSEARCH_FAIL_REFRESH = "elasticsearch.fail_refresh";
 
     public static final String QUERY_LIMIT_DEFAULT = "index.query.limit.default";
-    
+
     @Default( "127.0.0.1" )
     @Key( ELASTICSEARCH_HOSTS )
     String getHosts();
@@ -68,10 +72,10 @@ public interface IndexFig extends GuicyFig {
     @Key( ELASTICSEARCH_PORT )
     int getPort();
 
-    @Default( "usergrid" ) 
+    @Default( "usergrid" )
     @Key( ELASTICSEARCH_CLUSTER_NAME)
     String getClusterName();
-    
+
     @Default( "usergrid" ) // no underbars allowed
     @Key( ELASTICSEARCH_INDEX_PREFIX )
     String getIndexPrefix();
@@ -79,7 +83,7 @@ public interface IndexFig extends GuicyFig {
     @Default( "alias" ) // no underbars allowed
     @Key( ELASTICSEARCH_ALIAS_POSTFIX )
     String getAliasPostfix();
-    
+
     @Default( "1" ) // TODO: does this timeout get extended on each query?
     @Key( QUERY_CURSOR_TIMEOUT_MINUTES )
     int getQueryCursorTimeout();
@@ -93,7 +97,7 @@ public interface IndexFig extends GuicyFig {
     @Key( QUERY_LIMIT_DEFAULT )
     int getQueryLimitDefault();
 
-    @Default( "false" ) 
+    @Default( "false" )
     @Key( ELASTICSEARCH_FORCE_REFRESH )
     public boolean isForcedRefresh();
 
@@ -117,11 +121,19 @@ public interface IndexFig extends GuicyFig {
     @Default("2")
     int getIndexCacheMaxWorkers();
 
-    @Default("1000")
+    @Default("250")
     @Key( INDEX_BUFFER_TIMEOUT )
     int getIndexBufferTimeout();
 
     @Default("100")
     @Key( INDEX_BUFFER_SIZE )
     int getIndexBufferSize();
+
+    @Default("300")
+    @Key( INDEX_BATCH_SIZE)
+    int getIndexBatchSize();
+
+    @Default("one")
+    @Key( INDEX_WRITE_CONSISTENCY_LEVEL )
+    String getWriteConsistencyLevel();
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/8659771b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexBatchBufferImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexBatchBufferImpl.java
b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexBatchBufferImpl.java
index 17380b3..aa4ea17 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexBatchBufferImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexBatchBufferImpl.java
@@ -23,6 +23,7 @@ import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.index.IndexBatchBuffer;
 import org.apache.usergrid.persistence.index.IndexFig;
+import org.elasticsearch.action.WriteConsistencyLevel;
 import org.elasticsearch.action.bulk.BulkItemResponse;
 import org.elasticsearch.action.bulk.BulkRequestBuilder;
 import org.elasticsearch.action.bulk.BulkResponse;
@@ -36,11 +37,12 @@ import rx.Observable;
 import rx.Subscriber;
 import rx.Subscription;
 import rx.functions.Action1;
+import sun.jvm.hotspot.opto.Block;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 
 
 /**
@@ -50,105 +52,110 @@ import java.util.concurrent.TimeUnit;
 public class IndexBatchBufferImpl implements IndexBatchBuffer {
 
     private static final Logger log = LoggerFactory.getLogger(IndexBatchBufferImpl.class);
-    private final Client client;
-    private final FailureMonitor failureMonitor;
-    private final IndexFig config;
-    private final boolean refresh;
-    private final int timeout;
-    private final int bufferSize;
     private final MetricsFactory metricsFactory;
-    private final Timer flushTimer;
-    private final Counter indexSizeCounter;
     private Producer producer;
-    private Subscription producerObservable;
-    private BlockingQueue blockingQueue;
+    private Consumer consumer;
 
     @Inject
     public IndexBatchBufferImpl(final IndexFig config, final EsProvider provider, MetricsFactory
metricsFactory){
         this.metricsFactory = metricsFactory;
-        this.client = provider.getClient();
-        this.failureMonitor = new FailureMonitorImpl( config, provider );
-        this.config = config;
         this.producer = new Producer();
-        this.refresh = config.isForcedRefresh();
-        this.timeout = config.getIndexBufferTimeout();
-        this.bufferSize = config.getIndexBufferSize();
-        this.flushTimer = metricsFactory.getTimer(IndexBatchBuffer.class, "index.buffer.flush");
-        this.indexSizeCounter =  metricsFactory.getCounter(IndexBatchBuffer.class, "index.buffer.size");
-        blockingQueue = new ArrayBlockingQueue(500);
-        init();
+        this.consumer = new Consumer(config,producer,metricsFactory, provider);
     }
 
 
-
-    private void init() {
-        this.producerObservable = Observable.create(producer)
-                .doOnNext(new Action1<RequestBuilderContainer>() {
-                    @Override
-                    public void call(RequestBuilderContainer container) {
-                        try {
-                            blockingQueue.offer(container, 2500, TimeUnit.MILLISECONDS);
-                        }catch (InterruptedException ie){
-                            throw new RuntimeException(ie);
-                        }
-                    }
-                })
-                .buffer(timeout, TimeUnit.MILLISECONDS, bufferSize)
-                .doOnNext(new Action1<List<RequestBuilderContainer>>() {
-                    @Override
-                    public void call(List<RequestBuilderContainer> builderContainerList)
{
-                        flushTimer.time();
-                        indexSizeCounter.dec(builderContainerList.size());
-                        execute();
-                    }
-                })
-                .subscribe();
-    }
-
-    public void put(IndexRequestBuilder builder){
+    public Observable put(IndexRequestBuilder builder){
+        RequestBuilderContainer container = new RequestBuilderContainer(builder);
         metricsFactory.getCounter(IndexBatchBuffer.class,"index.buffer.size").inc();
-        producer.put(new RequestBuilderContainer(builder));
+        producer.put(container);
+        return container.getFuture();
     }
 
-    public void put(DeleteRequestBuilder builder){
+    public Observable put(DeleteRequestBuilder builder){
+        RequestBuilderContainer container = new RequestBuilderContainer(builder);
         metricsFactory.getCounter(IndexBatchBuffer.class,"index.buffer.size").inc();
         producer.put(new RequestBuilderContainer(builder));
+        return container.getFuture();
     }
 
     public void flushAndRefresh(){
-        execute(true);
+       try {
+           Thread.sleep(500);
+       }catch (Exception e){
+
+       }
     }
     public void flush(){
-        execute();
+        try {
+            Thread.sleep(500);
+        }catch (Exception e){
+
+        }
     }
 
-    private void execute(){
-        execute(this.refresh);
+    private static class Producer implements Observable.OnSubscribe<RequestBuilderContainer>
{
+
+        private Subscriber<? super RequestBuilderContainer> subscriber;
+
+        @Override
+        public void call(Subscriber<? super RequestBuilderContainer> subscriber) {
+            this.subscriber = subscriber;
+        }
+
+        public void put(RequestBuilderContainer r){
+            subscriber.onNext(r);
+        }
     }
 
-    /**
-     * Execute the request, check for errors, then re-init the batch for future use
-     */
-    private void execute(boolean refresh ) {
-        if (blockingQueue.size() == 0) {
-            return;
+    public static class Consumer {
+        private final Observable<List<RequestBuilderContainer>> consumer;
+        private final Timer flushTimer;
+        private final Counter indexSizeCounter;
+        private final BlockingQueue<RequestBuilderContainer> blockingQueue;
+        private final Client client;
+        private final IndexFig config;
+        private final FailureMonitorImpl failureMonitor;
+
+        public Consumer(final IndexFig config, Producer producer,MetricsFactory metricsFactory,
final EsProvider provider){
+            this.config = config;
+            this.client = provider.getClient();
+            this.failureMonitor = new FailureMonitorImpl(config,provider);
+            this.blockingQueue = new ArrayBlockingQueue<>(config.getIndexBatchSize());
+            this.flushTimer = metricsFactory.getTimer(IndexBatchBuffer.class, "index.buffer.flush");
+            this.indexSizeCounter =  metricsFactory.getCounter(IndexBatchBuffer.class, "index.buffer.size");
+            this.consumer = Observable.create(producer)
+                    .buffer(config.getIndexBufferTimeout(), TimeUnit.MILLISECONDS, config.getIndexBufferSize())
+                    .doOnNext(new Action1<List<RequestBuilderContainer>>() {
+                        @Override
+                        public void call(List<RequestBuilderContainer> containerList)
{
+                            for (RequestBuilderContainer container : containerList) {
+                                blockingQueue.add(container);
+                            }
+                            flushTimer.time();
+                            indexSizeCounter.dec(containerList.size());
+                            execute(config.isForcedRefresh());
+                        }
+                    });
+            consumer.subscribe();
         }
-        BulkRequestBuilder bulkRequest = client.prepareBulk();
-        bulkRequest.setRefresh(refresh);
-        int count = bufferSize;
-        //clear the queue or proceed to buffersize
-        while (blockingQueue.size() > 0 && count-- > 0) {
-            RequestBuilderContainer container = null;
-            try {
-                Object o =   blockingQueue.take();
-                if (o != null) {
-                    container = (RequestBuilderContainer) o;
-                }
-            } catch (InterruptedException ie) {
-                log.error("Problem taking messages off of queue", ie);
-                throw new RuntimeException(ie);
+
+        /**
+         * Execute the request, check for errors, then re-init the batch for future use
+         */
+        private void execute(boolean refresh) {
+
+            if (blockingQueue.size() == 0) {
+                return;
             }
-            if(container != null) {
+
+            BulkRequestBuilder bulkRequest = initRequest(refresh);
+
+            Collection<RequestBuilderContainer> containerCollection = new ArrayList<>(config.getIndexBatchSize());
+            blockingQueue.drainTo(containerCollection);
+            int count = 0;
+            //clear the queue or proceed to buffersize
+            for (RequestBuilderContainer container : containerCollection) {
+
                 ShardReplicationOperationRequestBuilder builder = container.getBuilder();
                 //only handle two types of requests for now, annoyingly there is no base
class implementation on BulkRequest
                 if (builder instanceof IndexRequestBuilder) {
@@ -157,57 +164,76 @@ public class IndexBatchBufferImpl implements IndexBatchBuffer {
                 if (builder instanceof DeleteRequestBuilder) {
                     bulkRequest.add((DeleteRequestBuilder) builder);
                 }
-            }
-        }
-        //nothing to do, we haven't added anthing to the index
-        if (bulkRequest.numberOfActions() == 0) {
-            return;
-        }
 
-        final BulkResponse responses;
+                if (count++ == config.getIndexBatchSize()) {
+                    sendRequest(bulkRequest);
+                    bulkRequest = initRequest(refresh);
 
-        try {
-            responses = bulkRequest.execute().actionGet();
-        } catch (Throwable t) {
-            log.error("Unable to communicate with elasticsearch");
-            failureMonitor.fail("Unable to execute batch", t);
-            throw t;
+                }
+            }
+            sendRequest(bulkRequest);
+            for (RequestBuilderContainer container : containerCollection) {
+                container.done();
+            }
         }
 
-        failureMonitor.success();
+        private BulkRequestBuilder initRequest(boolean refresh) {
+            BulkRequestBuilder bulkRequest = client.prepareBulk();
+            bulkRequest.setConsistencyLevel(WriteConsistencyLevel.fromString(config.getWriteConsistencyLevel()));
+            bulkRequest.setRefresh(refresh);
+            return bulkRequest;
+        }
 
-        for (BulkItemResponse response : responses) {
-            if (response.isFailed()) {
-                throw new RuntimeException("Unable to index documents.  Errors are :"
-                        + response.getFailure().getMessage());
+        private void sendRequest(BulkRequestBuilder bulkRequest) {
+            //nothing to do, we haven't added anthing to the index
+            if (bulkRequest.numberOfActions() == 0) {
+                return;
             }
-        }
-    }
 
-    private static class Producer implements Observable.OnSubscribe<RequestBuilderContainer>
{
+            final BulkResponse responses;
 
-        private Subscriber<? super RequestBuilderContainer> subscriber;
+            try {
+                responses = bulkRequest.execute().actionGet();
+            } catch (Throwable t) {
+                log.error("Unable to communicate with elasticsearch");
+                failureMonitor.fail("Unable to execute batch", t);
+                throw t;
+            }
 
-        @Override
-        public void call(Subscriber<? super RequestBuilderContainer> subscriber) {
-            this.subscriber = subscriber;
-        }
+            failureMonitor.success();
 
-        public void put(RequestBuilderContainer r){
-            subscriber.onNext(r);
+            for (BulkItemResponse response : responses) {
+                if (response.isFailed()) {
+                    throw new RuntimeException("Unable to index documents.  Errors are :"
+                            + response.getFailure().getMessage());
+                }
+            }
         }
+
     }
 
     private static class RequestBuilderContainer{
         private final ShardReplicationOperationRequestBuilder builder;
+        private final Observable<RequestBuilderContainer> containerFuture;
 
         public RequestBuilderContainer(ShardReplicationOperationRequestBuilder builder){
+            final RequestBuilderContainer parent = this;
             this.builder = builder;
+            this.containerFuture
+                    = Observable.create(new Observable.OnSubscribe<RequestBuilderContainer>(){
+                
+            })
         }
 
         public ShardReplicationOperationRequestBuilder getBuilder(){
             return builder;
         }
+        public void done(){
+            containerFuture.();
+        }
+        public Observable<RequestBuilderContainer> getFuture(){
+            return containerFuture;
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/8659771b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
index 736eb9b..6cda9f2 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
@@ -21,6 +21,8 @@ package org.apache.usergrid.persistence.index.impl;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.usergrid.persistence.index.*;
 import org.apache.usergrid.persistence.index.query.CandidateResult;
@@ -53,9 +55,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.*;
 
 
 @RunWith(EsRunner.class)
@@ -64,12 +64,9 @@ public class EntityIndexTest extends BaseIT {
 
     private static final Logger log = LoggerFactory.getLogger( EntityIndexTest.class );
 
-
     @Inject
     public EntityIndexFactory eif;
 
-
-
     @Test
     public void testIndex() throws IOException {
         Id appId = new SimpleId( "application" );
@@ -91,6 +88,49 @@ public class EntityIndexTest extends BaseIT {
     }
 
     @Test
+    public void testIndexThreads() throws IOException {
+        final Id appId = new SimpleId( "application" );
+
+        final ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
+
+        long now = System.currentTimeMillis();
+        final int threads = 1000;
+        final EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
+        final IndexScope indexScope = new IndexScopeImpl(appId, "things");
+        final String entityType = "thing";
+        entityIndex.initializeIndex();
+        final CountDownLatch latch = new CountDownLatch(threads);
+        final AtomicLong failTime=new AtomicLong(0);
+        for(int i=0;i<threads;i++) {
+            Thread thread = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        insertJsonBlob(entityIndex, entityType, indexScope, "/sample-small.json",
1, 0);
+                        entityIndex.refresh();
+                    } catch (Exception e) {
+                        synchronized (failTime) {
+                            if (failTime.get() == 0) {
+                                failTime.set(System.currentTimeMillis());
+                            }
+                        }
+                        System.out.println(e.toString());
+                        fail("threw exception");
+                    }finally {
+                        latch.countDown();
+                    }
+                }
+            });
+            thread.start();
+        }
+        try {
+            latch.await();
+        }catch (InterruptedException ie){
+            throw new RuntimeException(ie);
+        }
+        assertTrue("system must have failed at "+(failTime.get() - now) ,failTime.get()==0);
+    }
+
+    @Test
     public void testMultipleIndexInitializations(){
         Id appId = new SimpleId( "application" );
 


Mime
View raw message