public void openSystemStore(StoreDefinition storeDef) { logger.info("Opening system store '" + storeDef.getName() + "' (" + storeDef.getType() + ")."); StorageConfiguration config = storageConfigs.get(storeDef.getType()); if (config == null) throw new ConfigurationException( "Attempt to open system store " + storeDef.getName() + " but " + storeDef.getType() + " storage engine has not been enabled."); final StorageEngine<ByteArray, byte[], byte[]> engine = config.getStore(storeDef, null); // Noted that there is no read-only processing as for user stores. // openStore() should have atomic semantics try { registerSystemEngine(engine); if (voldemortConfig.isServerRoutingEnabled()) registerNodeStores(storeDef, metadata.getCluster(), voldemortConfig.getNodeId()); if (storeDef.hasRetentionPeriod()) scheduleCleanupJob(storeDef, engine); } catch (Exception e) { unregisterSystemEngine(engine); throw new VoldemortException(e); } }
public void unregisterSystemEngine(StorageEngine<ByteArray, byte[], byte[]> engine) { String storeName = engine.getName(); Store<ByteArray, byte[], byte[]> store = storeRepository.removeLocalStore(storeName); if (store != null) { if (voldemortConfig.isJmxEnabled()) { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); if (voldemortConfig.isEnableRebalanceService()) { ObjectName name = null; if (this.voldemortConfig.isEnableJmxClusterName()) name = JmxUtils.createObjectName( metadata.getCluster().getName() + "." + JmxUtils.getPackageName(RedirectingStore.class), store.getName()); else name = JmxUtils.createObjectName( JmxUtils.getPackageName(RedirectingStore.class), store.getName()); synchronized (mbeanServer) { if (mbeanServer.isRegistered(name)) JmxUtils.unregisterMbean(mbeanServer, name); } } if (voldemortConfig.isStatTrackingEnabled()) { ObjectName name = null; if (this.voldemortConfig.isEnableJmxClusterName()) name = JmxUtils.createObjectName( metadata.getCluster().getName() + "." + JmxUtils.getPackageName(store.getClass()), store.getName()); else name = JmxUtils.createObjectName( JmxUtils.getPackageName(store.getClass()), store.getName()); synchronized (mbeanServer) { if (mbeanServer.isRegistered(name)) JmxUtils.unregisterMbean(mbeanServer, name); } } } if (voldemortConfig.isServerRoutingEnabled()) { this.storeRepository.removeRoutedStore(storeName); for (Node node : metadata.getCluster().getNodes()) this.storeRepository.removeNodeStore(storeName, node.getId()); } } storeRepository.removeStorageEngine(storeName); // engine.truncate(); why truncate here when unregister? Isn't close // good enough? engine.close(); }
public StorageEngine<ByteArray, byte[], byte[]> openStore(StoreDefinition storeDef) { logger.info("Opening store '" + storeDef.getName() + "' (" + storeDef.getType() + ")."); StorageConfiguration config = storageConfigs.get(storeDef.getType()); if (config == null) throw new ConfigurationException( "Attempt to open store " + storeDef.getName() + " but " + storeDef.getType() + " storage engine has not been enabled."); boolean isReadOnly = storeDef.getType().compareTo(ReadOnlyStorageConfiguration.TYPE_NAME) == 0; final RoutingStrategy routingStrategy = new RoutingStrategyFactory().updateRoutingStrategy(storeDef, metadata.getCluster()); final StorageEngine<ByteArray, byte[], byte[]> engine = config.getStore(storeDef, routingStrategy); // Update the routing strategy + add listener to metadata if (storeDef.getType().compareTo(ReadOnlyStorageConfiguration.TYPE_NAME) == 0) { metadata.addMetadataStoreListener( storeDef.getName(), new MetadataStoreListener() { public void updateRoutingStrategy(RoutingStrategy updatedRoutingStrategy) { ((ReadOnlyStorageEngine) engine).setRoutingStrategy(updatedRoutingStrategy); } public void updateStoreDefinition(StoreDefinition storeDef) { return; } }); } // openStore() should have atomic semantics try { registerEngine(engine, isReadOnly, storeDef.getType(), storeDef); if (voldemortConfig.isServerRoutingEnabled()) registerNodeStores(storeDef, metadata.getCluster(), voldemortConfig.getNodeId()); if (storeDef.hasRetentionPeriod()) scheduleCleanupJob(storeDef, engine); } catch (Exception e) { removeEngine(engine, isReadOnly, storeDef.getType(), false); throw new VoldemortException(e); } return engine; }
/** * Unregister and remove the engine from the storage repository. This is called during deletion of * stores and if there are exceptions adding/opening stores * * @param engine The actual engine to remove * @param isReadOnly Is this read-only? * @param storeType The storage type of the store * @param truncate Should the store be truncated? */ public void removeEngine( StorageEngine<ByteArray, byte[], byte[]> engine, boolean isReadOnly, String storeType, boolean truncate) { String storeName = engine.getName(); Store<ByteArray, byte[], byte[]> store = storeRepository.removeLocalStore(storeName); boolean isSlop = storeType.compareTo("slop") == 0; boolean isView = storeType.compareTo(ViewStorageConfiguration.TYPE_NAME) == 0; boolean isMetadata = storeName.compareTo(MetadataStore.METADATA_STORE_NAME) == 0; if (store != null) { if (voldemortConfig.isJmxEnabled()) { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); if (!isSlop && voldemortConfig.isEnableRebalanceService() && !isReadOnly && !isMetadata && !isView) { ObjectName name = null; if (this.voldemortConfig.isEnableJmxClusterName()) name = JmxUtils.createObjectName( metadata.getCluster().getName() + "." + JmxUtils.getPackageName(RedirectingStore.class), store.getName()); else name = JmxUtils.createObjectName( JmxUtils.getPackageName(RedirectingStore.class), store.getName()); synchronized (mbeanServer) { if (mbeanServer.isRegistered(name)) JmxUtils.unregisterMbean(mbeanServer, name); } } if (voldemortConfig.isStatTrackingEnabled()) { ObjectName name = null; if (this.voldemortConfig.isEnableJmxClusterName()) name = JmxUtils.createObjectName( metadata.getCluster().getName() + "." + JmxUtils.getPackageName(store.getClass()), store.getName()); else name = JmxUtils.createObjectName( JmxUtils.getPackageName(store.getClass()), store.getName()); synchronized (mbeanServer) { if (mbeanServer.isRegistered(name)) JmxUtils.unregisterMbean(mbeanServer, name); } } } if (voldemortConfig.isServerRoutingEnabled() && !isSlop) { this.storeRepository.removeRoutedStore(storeName); for (Node node : metadata.getCluster().getNodes()) this.storeRepository.removeNodeStore(storeName, node.getId()); } } storeRepository.removeStorageEngine(storeName); if (truncate) engine.truncate(); engine.close(); }