Skip to content

Commit

Permalink
HSEARCH-472 Allowing for configuration of dynamic shards via configur…
Browse files Browse the repository at this point in the history
…ation properties. Making behaviour consistent with non sharded and statically sharded setup (even though it is not officially documented anymore).
  • Loading branch information
hferentschik committed Sep 27, 2013
1 parent 09a224e commit 921f1b0
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ public IndexManager[] getIndexManagersForAllShards() {
public IndexManager getIndexManagerForAddition(Class<?> entity, Serializable id, String idInString, Document document) {
String shardIdentifier = shardIdentifierProvider.getShardIdentifier( entity, id, idInString, document );
return indexManagerHolder.getOrCreateIndexManager(
getIndexName( shardIdentifier ),
rootIndexName,
shardIdentifier,
entityIndexBinding
);
}
Expand All @@ -96,17 +97,14 @@ private IndexManager[] getIndexManagersFromShards(Set<String> shardIdentifiers)
for ( String shardIdentifier : shardIdentifiers ) {
managers.add(
indexManagerHolder.getOrCreateIndexManager(
getIndexName( shardIdentifier ),
rootIndexName,
shardIdentifier,
entityIndexBinding
)
);
}
return managers.toArray( new IndexManager[shardIdentifiers.size()] );
}

private String getIndexName(String shard) {
return rootIndexName + "." + shard;
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ public class IndexManagerHolder {
private static final Log log = LoggerFactory.make();
private static final String SHARDING_STRATEGY = "sharding_strategy";
private static final String NBR_OF_SHARDS = SHARDING_STRATEGY + ".nbr_of_shards";
private static final String INDEX_SHARD_ID_SEPARATOR = ".";

private final Map<String, IndexManager> indexManagersRegistry = new ConcurrentHashMap<String, IndexManager>();

Expand Down Expand Up @@ -140,8 +141,20 @@ public synchronized MutableEntityIndexBinding buildEntityIndexBinding(
);
}

public IndexManager getOrCreateIndexManager(String indexManagerName, DynamicShardingEntityIndexBinding entityIndexBinding) {
IndexManager indexManager = indexManagersRegistry.get( indexManagerName );
public IndexManager getOrCreateIndexManager(String indexBaseName,
DynamicShardingEntityIndexBinding entityIndexBinding) {
return this.getOrCreateIndexManager( indexBaseName, null, entityIndexBinding );
}

public IndexManager getOrCreateIndexManager(String indexBaseName,
String shardName,
DynamicShardingEntityIndexBinding entityIndexBinding) {
String indexName = indexBaseName;
if ( shardName != null ) {
indexName += INDEX_SHARD_ID_SEPARATOR + shardName;
}

IndexManager indexManager = indexManagersRegistry.get( indexName );
if ( indexManager != null ) {
indexManager.addContainedEntity( entityIndexBinding.getDocumentBuilder().getBeanClass() );
return indexManager;
Expand All @@ -155,11 +168,17 @@ public IndexManager getOrCreateIndexManager(String indexManagerName, DynamicShar
else {
throw log.assertionFailureCannotCastToWorkerBuilderContext( searchFactory.getClass() );
}

Properties properties = entityIndexBinding.getProperties();
if ( shardName != null ) {
properties = new MaskedProperty( properties, shardName, properties );
}

indexManager = createIndexManager(
indexManagerName,
indexName,
entityIndexBinding.getDocumentBuilder().getBeanClass(),
entityIndexBinding.getSimilarity(),
entityIndexBinding.getProperties(),
properties,
entityIndexBinding.getIndexManagerFactory(),
context
);
Expand Down Expand Up @@ -468,7 +487,7 @@ private IndexManager[] createIndexManagers(String indexBaseName,
indexManagers = new IndexManager[nbrOfIndexManagers];
for ( int index = 0; index < nbrOfIndexManagers; index++ ) {
String indexManagerName = nbrOfIndexManagers > 1 ?
indexBaseName + "." + index :
indexBaseName + INDEX_SHARD_ID_SEPARATOR + index :
indexBaseName;
Properties indexProp = indexProperties[index];
IndexManager indexManager = indexManagersRegistry.get( indexManagerName );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@
*/
package org.hibernate.search.test.configuration.sharding;

import java.io.File;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
Expand All @@ -38,13 +40,16 @@
import org.hibernate.search.engine.spi.EntityIndexBinding;
import org.hibernate.search.filter.FullTextFilterImplementor;
import org.hibernate.search.impl.MutableSearchFactory;
import org.hibernate.search.indexes.impl.DirectoryBasedIndexManager;
import org.hibernate.search.indexes.spi.IndexManager;
import org.hibernate.search.spi.BuildContext;
import org.hibernate.search.spi.SearchFactoryBuilder;
import org.hibernate.search.store.IndexShardingStrategy;
import org.hibernate.search.store.ShardIdentifierProvider;
import org.hibernate.search.store.impl.FSDirectoryProvider;
import org.hibernate.search.store.impl.IdHashShardingStrategy;
import org.hibernate.search.store.impl.NotShardedStrategy;
import org.hibernate.search.test.TestConstants;
import org.hibernate.search.test.util.BytemanHelper;
import org.hibernate.search.test.util.ManualConfiguration;
import org.hibernate.search.test.util.TestForIssue;
Expand Down Expand Up @@ -235,6 +240,33 @@ public void testSettingCustomShardIdentifierProviderWithExplicitIndexName() {
);
}

@Test
public void testConfiguringDynamicallyCreatedShardViaConfiguration() {
Map<String, String> shardingProperties = new HashMap<String, String>();
shardingProperties.put(
"hibernate.search.foo.sharding_strategy",
DummyShardIdentifierProvider.class.getName()
);

shardingProperties.put( "hibernate.search.foo.snafu.directory_provider", "filesystem" );
File indexDir = new File( TestConstants.getIndexDirectory( ShardingConfigurationTest.class ) );
shardingProperties.put( "hibernate.search.foo.snafu.indexBase", indexDir.getAbsolutePath() );

MutableSearchFactory searchFactory = getSearchFactory( shardingProperties );

EntityIndexBinding entityIndexBinding = searchFactory.getIndexBinding( Foo.class );
IndexManager indexManagers[] = entityIndexBinding.getIndexManagers();

assertTrue( "There should be two index managers", indexManagers.length == 1 );
assertTrue( "Unexpected index manager type", indexManagers[0] instanceof DirectoryBasedIndexManager );

DirectoryBasedIndexManager directoryBasedIndexManager = (DirectoryBasedIndexManager) indexManagers[0];
assertTrue(
"Unexpected directory provider type: " + directoryBasedIndexManager.getDirectoryProvider().getClass(),
directoryBasedIndexManager.getDirectoryProvider() instanceof FSDirectoryProvider
);
}

private MutableSearchFactory getSearchFactory(Map<String, String> shardingProperties) {
ManualConfiguration configuration = new ManualConfiguration();
configuration.addProperty( "hibernate.search.default.directory_provider", "ram" );
Expand Down Expand Up @@ -285,9 +317,11 @@ public IndexManager[] getIndexManagersForQuery(FullTextFilterImplementor[] fullT
}

public static class DummyShardIdentifierProvider implements ShardIdentifierProvider {
private Set<String> shards = new HashSet<String>();

@Override
public void initialize(Properties properties, BuildContext buildContext) {
shards.add( "snafu" );
}

@Override
Expand All @@ -297,12 +331,12 @@ public String getShardIdentifier(Class<?> entityType, Serializable id, String id

@Override
public Set<String> getShardIdentifiersForQuery(FullTextFilterImplementor[] fullTextFilters) {
return null;
return shards;
}

@Override
public Set<String> getAllShardIdentifiers() {
return null;
return shards;
}
}
}

0 comments on commit 921f1b0

Please sign in to comment.