Ejemplo n.º 1
0
  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);
    }
  }
Ejemplo n.º 2
0
  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();
  }
Ejemplo n.º 3
0
  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;
  }
Ejemplo n.º 4
0
  /**
   * 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();
  }