package net.ion.craken.node.crud.store; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.transaction.Transaction; import net.ion.craken.node.IndexWriteConfig; import net.ion.craken.node.Workspace; import net.ion.craken.node.crud.Craken; import net.ion.craken.node.crud.impl.FileStoreWorkspace; import net.ion.craken.node.crud.tree.TreeCache; import net.ion.craken.node.crud.tree.impl.PropertyId; import net.ion.craken.node.crud.tree.impl.PropertyValue; import net.ion.nsearcher.config.Central; import net.ion.nsearcher.config.CentralConfig; import org.apache.lucene.index.CorruptIndexException; import org.infinispan.AdvancedCache; import org.infinispan.Cache; import org.infinispan.configuration.cache.ClusteringConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.eviction.EvictionStrategy; import org.infinispan.io.GridFile.Metadata; import org.infinispan.io.GridFilesystem; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.transaction.TransactionMode; public class FileStoreWorkspaceConfigBuilder extends WorkspaceConfigBuilder { private File rootDir; private GridFilesystem gfs; private Central central; private File dataDir; private File indexDir; public FileStoreWorkspaceConfigBuilder(String rootPath) throws CorruptIndexException, IOException { this.rootDir = new File(rootPath); this.indexDir = new File(rootDir, "index"); this.dataDir = new File(rootDir, "data"); if (!indexDir.exists()) { indexDir.mkdirs(); } } @Override public Workspace createWorkspace(Craken craken, AdvancedCache<PropertyId, PropertyValue> cache) throws IOException { return new FileStoreWorkspace(craken, cache, this); } @Override public WorkspaceConfigBuilder build(DefaultCacheManager dm, String wsName) throws IOException { ClusteringConfigurationBuilder real_configBuilder = new ConfigurationBuilder().read(dm.getDefaultCacheConfiguration()).eviction().maxEntries(maxEntry()).strategy(EvictionStrategy.LRU) // .eviction().expiration().lifespan(30, TimeUnit.SECONDS) .transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().clustering(); dm.defineConfiguration(wsName, real_configBuilder.build()); dm.defineConfiguration(blobChunk(wsName), new ConfigurationBuilder().read(dm.getDefaultCacheConfiguration()).eviction().expiration().lifespan(30, TimeUnit.SECONDS).transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().clustering().build()); dm.defineConfiguration(blobMeta(wsName), new ConfigurationBuilder().read(dm.getDefaultCacheConfiguration()).eviction().expiration().lifespan(30, TimeUnit.SECONDS).transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().clustering().build()); this.central = CentralConfig.newLocalFile().dirFile(indexDir).build(); this.gfs = makeGridSystem(dm, wsName); return this; } public static WorkspaceConfigBuilder test() throws CorruptIndexException, IOException { return new FileStoreWorkspaceConfigBuilder("./resource/fstemp"); } 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); } public GridFilesystem gfs() { return gfs; } public Central central() { return this.central; } public void createInterceptor(TreeCache<PropertyId, PropertyValue> tcache, Central central, com.google.common.cache.Cache<Transaction, IndexWriteConfig> trans) { // tcache.getCache().getAdvancedCache().addInterceptor(new DebugInterceptor(gfs(), central, trans), 0); } public File dataDir() { return dataDir; } }