@Override public String getName() { return keyInfo.getKeyName(); }
@Override public void shutdownIndexes() throws JasDBStorageException { LOG.info("Shutting down {} indexes", indexes.size()); for(String bagName : indexes.keySet()) { for(Index index : indexes.get(bagName).values()) { LOG.debug("Closing index: {} on bag: {}", index.getKeyInfo().getKeyName(), bagName); index.close(); } } indexes.clear(); }
private synchronized void loadIndexes(final String bagName) throws JasDBStorageException { LOG.debug("Loading indexes for bag: {}", bagName); if(!indexes.containsKey(bagName)) { Bag bag = metadataStore.getBag(instanceId, bagName); if(bag != null) { Set<IndexDefinition> indexDefinitions = new HashSet<>(bag.getIndexDefinitions()); LOG.info("Found {} potential indexes for bag: {}", indexDefinitions.size(), bagName); Map<String, Index> bagIndexes = new HashMap<>(); for(IndexDefinition indexDefinition : indexDefinitions) { Index index = loadIndex(bagName, indexDefinition); bagIndexes.put(index.getKeyInfo().getKeyName(), index); } this.indexes.put(bagName, bagIndexes); } } }
public static void doIndexInsert(Set<Key> keys, Index index) throws JasDBStorageException { LOG.trace("Inserting {} keys into index: {}", keys.size(), index.getKeyInfo().getKeyName()); StatRecord indexInsert = StatisticsMonitor.createRecord("bag:indexInsert"); for(Key key : keys) { index.insertIntoIndex(key); } indexInsert.stop(); }
private Index createInStore(String bagName, KeyInfo keyInfo) throws JasDBStorageException { if(!indexes.containsKey(bagName)) { loadIndexes(bagName); } Map<String, Index> bagIndexes = this.indexes.get(bagName); if(bagIndexes != null && !bagIndexes.containsKey(keyInfo.getKeyName())) { File indexFile = createIndexFile(bagName, keyInfo.getKeyName(), false); try { Index index = new BTreeIndex(indexFile, keyInfo); configureIndex(IndexTypes.BTREE, index); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); metadataStore.addBagIndex(instanceId, bagName, definition); bagIndexes.put(keyInfo.getKeyName(), index); return index; } catch(ConfigurationException e) { throw new JasDBStorageException("Unable to create index, configuration error", e); } } else if(bagIndexes != null){ return bagIndexes.get(keyInfo.getKeyName()); } else { return null; } }
public BtreePlusBlockPersister(DataBlockFactory dataBlockFactory, int pageSize, KeyInfo keyInfo) { this.dataBlockFactory = dataBlockFactory; this.lockManager = new LockManager(this); this.pageSize = pageSize; this.keyInfo = keyInfo; this.minBlockSize = (int)Math.floor((double)pageSize / 2); initializeBlockFactories(); memoryRegion = new LRURegion<>(keyInfo.getKeyName()); GlobalCachingMemoryManager.getGlobalInstance().registerRegion(memoryRegion); }
@Override public void close() throws JasDBStorageException { flush(); memoryRegion.clear(); GlobalCachingMemoryManager.getGlobalInstance().unregisterRegion(keyInfo.getKeyName()); }
@Override public void removeIndex(String bagName, String keyName) throws JasDBStorageException { Index index = getIndex(bagName, keyName); if(index != null) { Map<String, Index> bagIndexes = indexes.get(bagName); bagIndexes.remove(keyName); KeyInfo keyInfo = index.getKeyInfo(); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); metadataStore.removeBagIndex(instanceId, bagName, definition); index.removeIndex(); } else { throw new JasDBStorageException("Could not remove index, does not exist"); } }
@Override public void ensureIndex(CompositeIndexField queryFields, boolean isUnique, IndexField... valueFields) throws JasDBStorageException { BagConnector connector = RemoteConnectorFactory.createConnector(nodeInformation, BagConnector.class); KeyInfo keyInfo = new KeyInfoImpl(queryFields.getIndexFields(), Lists.newArrayList(valueFields)); connector.createIndex(context, instance, meta.getName(), new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), -1), isUnique); }
private RestEntity loadIndexes(String instanceId, String bagName) throws JasDBException { IndexManager indexManager = getIndexManager(instanceId); StatRecord getIndexCounter = StatisticsMonitor.createRecord("getIndexes"); Map<String, Index> indexes = indexManager.getIndexes(bagName); getIndexCounter.stop(); List<IndexEntry> indexEntries = new ArrayList<>(indexes.size()); for(Index index : indexes.values()) { KeyInfo keyInfo = index.getKeyInfo(); IndexEntry entry = new IndexEntry(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.hasUniqueConstraint(), index.getIndexType()); entry.setMemorySize(index.getMemoryManager().getTotalMemoryUsage()); indexEntries.add(entry); } return new IndexCollection(indexEntries); }
private void initializeIndex(Index index) throws JasDBStorageException { KeyInfo keyInfo = index.getKeyInfo(); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); if(metadataStore.containsIndex(instanceId, bagName, definition)) { try { indexRebuilder.submit(new IndexScanAndRecovery(index, getRecordWriter().readAllRecords(), true)).get(); } catch(ExecutionException | InterruptedException e) { throw new JasDBStorageException("Unable to initialize index, index rebuild failed", e); } } else { throw new JasDBStorageException("Cannot initialize index, does not exist in store"); } }
@Override public void ensureIndex(IndexField indexField, boolean isUnique, IndexField... valueFields) throws JasDBStorageException { BagConnector connector = RemoteConnectorFactory.createConnector(nodeInformation, BagConnector.class); KeyInfo keyInfo = new KeyInfoImpl(indexField, valueFields); connector.createIndex(context, instance, meta.getName(), new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), -1), isUnique); }