docs: public void initialize(Configuration config) {
          try {
              //EdgeStore & VertexIndexStore
              KeyColumnValueStore idStore = storeManager.openDatabase(ID_STORE_NAME);
  
              idAuthority = null;
              if (storeFeatures.isKeyConsistent()) {
                  idAuthority = new ConsistentKeyIDAuthority(idStore, storeManager, config);
              } else {
                  throw new IllegalStateException("Store needs to support consistent key or transactional operations for ID manager to guarantee proper id allocations");
              }
  
              KeyColumnValueStore edgeStoreRaw = storeManagerLocking.openDatabase(EDGESTORE_NAME);
              KeyColumnValueStore indexStoreRaw = storeManagerLocking.openDatabase(INDEXSTORE_NAME);
  
              //Configure caches
              if (cacheEnabled) {
                  long expirationTime = configuration.get(DB_CACHE_TIME);
                  Preconditions.checkArgument(expirationTime>=0,"Invalid cache expiration time: %s",expirationTime);
                  if (expirationTime==0) expirationTime=ETERNAL_CACHE_EXPIRATION;
  
                  long cacheSizeBytes;
                  double cachesize = configuration.get(DB_CACHE_SIZE);
                  Preconditions.checkArgument(cachesize>0.0,"Invalid cache size specified: %s",cachesize);
                  if (cachesize<1.0) {
                      //Its a percentage
                      Runtime runtime = Runtime.getRuntime();
                      cacheSizeBytes = (long)((runtime.maxMemory()-(runtime.totalMemory()-runtime.freeMemory())) * cachesize);
                  } else {
                      Preconditions.checkArgument(cachesize>1000,"Cache size is too small: %s",cachesize);
                      cacheSizeBytes = (long)cachesize;
                  }
                  log.info("Configuring total store cache size: {}",cacheSizeBytes);
                  long cleanWaitTime = configuration.get(DB_CACHE_CLEAN_WAIT);
                  Preconditions.checkArgument(EDGESTORE_CACHE_PERCENT + INDEXSTORE_CACHE_PERCENT == 1.0,"Cache percentages don't add up!");
                  long edgeStoreCacheSize = Math.round(cacheSizeBytes * EDGESTORE_CACHE_PERCENT);
                  long indexStoreCacheSize = Math.round(cacheSizeBytes * INDEXSTORE_CACHE_PERCENT);
  
                  edgeStore = new ExpirationKCVSCache(edgeStoreRaw,getMetricsCacheName(EDGESTORE_NAME),expirationTime,cleanWaitTime,edgeStoreCacheSize);
                  indexStore = new ExpirationKCVSCache(indexStoreRaw,getMetricsCacheName(INDEXSTORE_NAME),expirationTime,cleanWaitTime,indexStoreCacheSize);
              } else {
                  edgeStore = new NoKCVSCache(edgeStoreRaw);
                  indexStore = new NoKCVSCache(indexStoreRaw);
              }
  
              //Just open them so that they are cached
              txLogManager.openLog(SYSTEM_TX_LOG_NAME);
              mgmtLogManager.openLog(SYSTEM_MGMT_LOG_NAME);
              txLogStore = new NoKCVSCache(storeManager.openDatabase(SYSTEM_TX_LOG_NAME));
  
  
              //Open global configuration
              KeyColumnValueStore systemConfigStore = storeManagerLocking.openDatabase(SYSTEM_PROPERTIES_STORE_NAME);
              systemConfig = getGlobalConfiguration(new BackendOperation.TransactionalProvider() {
                  @Override
                  public StoreTransaction openTx() throws BackendException {
                      return storeManagerLocking.beginTransaction(StandardBaseTransactionConfig.of(
                              configuration.get(TIMESTAMP_PROVIDER),
                              storeFeatures.getKeyConsistentTxConfig()));
                  }
  
                  @Override
                  public void close() throws BackendException {
                      //Do nothing, storeManager is closed explicitly by Backend
                  }
              },systemConfigStore,configuration);
              userConfig = getConfiguration(new BackendOperation.TransactionalProvider() {
                  @Override
                  public StoreTransaction openTx() throws BackendException {
                      return storeManagerLocking.beginTransaction(StandardBaseTransactionConfig.of(configuration.get(TIMESTAMP_PROVIDER)));
                  }
  
                  @Override
                  public void close() throws BackendException {
                      //Do nothing, storeManager is closed explicitly by Backend
                  }
              },systemConfigStore,USER_CONFIGURATION_IDENTIFIER,configuration);
  
          } catch (BackendException e) {
              throw new TitanException("Could not initialize backend", e);
          }
      }