package net.ion.craken.node.crud.store; import java.io.IOException; import java.util.concurrent.TimeUnit; import net.ion.craken.node.Workspace; import net.ion.craken.node.crud.Craken; import net.ion.craken.node.crud.impl.OldWorkspace; import net.ion.craken.node.crud.tree.impl.PropertyId; import net.ion.craken.node.crud.tree.impl.PropertyValue; import net.ion.craken.node.crud.tree.impl.TreeNodeKey; import net.ion.framework.util.StringUtil; import net.ion.framework.util.WithinThreadExecutor; import net.ion.nsearcher.config.Central; import net.ion.nsearcher.config.CentralConfig; import org.apache.lucene.store.Directory; import org.infinispan.AdvancedCache; import org.infinispan.Cache; import org.infinispan.atomic.AtomicMap; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ClusteringConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.io.GridFile.Metadata; import org.infinispan.io.GridFilesystem; import org.infinispan.lucene.directory.BuildContext; import org.infinispan.lucene.directory.DirectoryBuilder; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.transaction.TransactionMode; public class OldFileConfigBuilder extends WorkspaceConfigBuilder { private CacheMode cacheMode = CacheMode.LOCAL ; private GridFilesystem gfs; private String rootPath; private Central central; OldFileConfigBuilder(String rootPath){ this.rootPath = rootPath ; } public static OldFileConfigBuilder directory(String rootPath) { return new OldFileConfigBuilder(rootPath); } @Override public Workspace createWorkspace(Craken craken, AdvancedCache<PropertyId, PropertyValue> cache) throws IOException { return new OldWorkspace(craken, cache, this); } public WorkspaceConfigBuilder build(DefaultCacheManager dm, String wsName) throws IOException { if (StringUtil.isBlank(rootPath)) { ClusteringConfigurationBuilder real_configBuilder = new ConfigurationBuilder().read(dm.getDefaultCacheConfiguration()) .transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().clustering(); ClusteringConfigurationBuilder idx_meta_builder = new ConfigurationBuilder().persistence().passivation(false) .clustering().stateTransfer().timeout(300, TimeUnit.SECONDS).clustering(); ClusteringConfigurationBuilder idx_chunk_builder = new ConfigurationBuilder().persistence().passivation(false) .clustering().stateTransfer().timeout(300, TimeUnit.SECONDS).clustering();; ClusteringConfigurationBuilder idx_lock_builder = new ConfigurationBuilder().persistence().passivation(true) .clustering().stateTransfer().timeout(300, TimeUnit.SECONDS).clustering();; if (cacheMode().isClustered()){ real_configBuilder.cacheMode(CacheMode.REPL_ASYNC) ; idx_meta_builder.cacheMode(CacheMode.REPL_SYNC) ; idx_chunk_builder.cacheMode(CacheMode.DIST_SYNC) ; idx_lock_builder.cacheMode(CacheMode.REPL_SYNC) ; } dm.defineConfiguration(wsName, real_configBuilder.build()); dm.defineConfiguration(wsName + "-meta", idx_meta_builder.build()); dm.defineConfiguration(wsName + "-chunk", idx_chunk_builder.build()); dm.defineConfiguration(wsName + "-lock", idx_lock_builder.build()); this.central = makeCentral(dm, wsName); this.gfs = makeGridSystem(dm, wsName); } else if (StringUtil.isNotBlank(rootPath)) { ClusteringConfigurationBuilder real_configBuilder = null; ClusteringConfigurationBuilder meta_configBuilder = null ; ClusteringConfigurationBuilder chunk_configBuilder = null ; ClusteringConfigurationBuilder blob_metaBuilder = null ; ClusteringConfigurationBuilder blob_chunkBuilder = null ; real_configBuilder = new ConfigurationBuilder().read(dm.getDefaultCacheConfiguration()).eviction().maxEntries(maxEntry()) // .eviction().expiration().lifespan(30, TimeUnit.SECONDS) .transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().clustering(); meta_configBuilder = new ConfigurationBuilder().persistence().passivation(false) .addSingleFileStore().fetchPersistentState(false).preload(true).shared(false).purgeOnStartup(false).ignoreModifications(false).location(path()) .async().disable().flushLockTimeout(300000).shutdownTimeout(2000) .modificationQueueSize(100).threadPoolSize(10) .clustering() ; chunk_configBuilder = new ConfigurationBuilder().persistence().passivation(false) .addSingleFileStore().fetchPersistentState(false).preload(true).shared(false).purgeOnStartup(false).ignoreModifications(false).location(path()) .async().disable().flushLockTimeout(300000).shutdownTimeout(2000) .modificationQueueSize(100).threadPoolSize(10) .eviction().maxEntries(maxSegment()) .clustering() ; blob_metaBuilder = new ConfigurationBuilder() .persistence().passivation(false) .addSingleFileStore().fetchPersistentState(false).preload(true).shared(false).purgeOnStartup(false).ignoreModifications(false).location(path()) .async().disable().flushLockTimeout(300000).shutdownTimeout(2000) .modificationQueueSize(50).threadPoolSize(3).clustering(); blob_chunkBuilder = new ConfigurationBuilder() .eviction() .persistence().passivation(false) .addSingleFileStore().fetchPersistentState(true).preload(false).shared(false).purgeOnStartup(false).ignoreModifications(false).location(path()) .async().disable().flushLockTimeout(300000).shutdownTimeout(2000) .modificationQueueSize(50).threadPoolSize(3) .eviction().maxEntries(maxSegment()).expiration().maxIdle(100, TimeUnit.SECONDS) .clustering(); if (cacheMode().isClustered() && cacheMode().isReplicated()){ real_configBuilder.clustering().cacheMode(CacheMode.REPL_SYNC).persistence().addClusterLoader().remoteCallTimeout(10, TimeUnit.SECONDS).clustering() ; //.l1().enable().clustering() ; meta_configBuilder.clustering().cacheMode(CacheMode.REPL_SYNC) ; chunk_configBuilder.clustering().cacheMode(CacheMode.REPL_SYNC).persistence().addClusterLoader().remoteCallTimeout(100, TimeUnit.SECONDS) ; blob_metaBuilder.clustering().cacheMode(CacheMode.REPL_SYNC) ; blob_chunkBuilder.clustering().cacheMode(CacheMode.REPL_SYNC) ; } else if (cacheMode().isClustered()){ real_configBuilder.clustering().cacheMode(CacheMode.REPL_SYNC).persistence().addClusterLoader().remoteCallTimeout(10, TimeUnit.SECONDS).clustering() ; //.l1().enable().clustering() ; meta_configBuilder.clustering().cacheMode(CacheMode.REPL_SYNC) ; chunk_configBuilder.clustering().cacheMode(CacheMode.DIST_SYNC).persistence().addClusterLoader().remoteCallTimeout(100, TimeUnit.SECONDS) ; blob_metaBuilder.clustering().cacheMode(CacheMode.REPL_SYNC) ; blob_chunkBuilder.clustering().cacheMode(CacheMode.DIST_SYNC) ; } dm.defineConfiguration(wsName, real_configBuilder.build()); dm.defineConfiguration(wsName + "-meta", meta_configBuilder.build()) ; dm.defineConfiguration(wsName + "-chunk", chunk_configBuilder.build()) ; this.central = makeCentral(dm, wsName); dm.defineConfiguration(blobMeta(wsName), blob_metaBuilder.build()) ; dm.defineConfiguration(blobChunk(wsName), blob_chunkBuilder.build()) ; this.gfs = makeGridSystem(dm, wsName); } return this ; } public String path(){ return rootPath ; } public OldFileConfigBuilder distMode(CacheMode cmode){ this.cacheMode = cmode ; return this ; } public CacheMode cacheMode(){ return cacheMode ; } public GridFilesystem gfs() { return gfs; } public Central central() { return this.central; } private GridFilesystem makeGridSystem(DefaultCacheManager dm, String wsName) { Cache<String, byte[]> blobChunk = dm.getCache(blobChunk(wsName)); Cache<String, Metadata> blobMeta = dm.getCache(blobMeta(wsName)); return new GridFilesystem(blobChunk, blobMeta, 8192); } private Central makeCentral(DefaultCacheManager dm, String wsName) throws IOException { Cache<TreeNodeKey, AtomicMap<PropertyId, PropertyValue>> cache = dm.getCache(wsName); String name = cache.getName(); EmbeddedCacheManager cacheManager = cache.getCacheManager(); Cache<?, ?> metaCache = cacheManager.getCache(name + "-meta"); Cache<?, ?> dataCache = cacheManager.getCache(name + "-chunk"); Cache<?, ?> lockCache = cacheManager.getCache(name + "-lock"); BuildContext bcontext = DirectoryBuilder.newDirectoryInstance(metaCache, dataCache, lockCache, name); // bcontext.chunkSize(1024 * 1024); Directory directory = bcontext.create(); return CentralConfig.oldFromDir(directory).indexConfigBuilder().executorService(new WithinThreadExecutor()).build(); } }