Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support store block meta to RocksBlockStore, store location to heap #15238

Open
wants to merge 2 commits into
base: master-2.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
*/
public enum MetastoreType {
HEAP,
ROCKS
ROCKS,
ROCKS_BLOCK_META_ONLY,
}
5 changes: 5 additions & 0 deletions core/common/src/main/java/alluxio/metrics/MetricKey.java
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,11 @@ public static String getSyncMetricName(long mountId) {
.setDescription("An estimate of the blocks heap size")
.setMetricType(MetricType.GAUGE)
.build();
public static final MetricKey MASTER_BLOCK_LOCATIONS_COUNT =
new MetricKey.Builder("Master.BlockLocationCount")
.setDescription("Count of blocks location")
.setMetricType(MetricType.GAUGE)
.build();
public static final MetricKey MASTER_RPC_QUEUE_LENGTH =
new Builder("Master.RpcQueueLength")
.setDescription("Length of the master rpc queue. "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import alluxio.master.metastore.heap.HeapBlockMetaStore;
import alluxio.master.metastore.heap.HeapInodeStore;
import alluxio.master.metastore.rocks.RocksBlockMetaStore;
import alluxio.master.metastore.rocks.RocksBlockMetaStoreMetaOnly;
import alluxio.master.metastore.rocks.RocksInodeStore;
import alluxio.util.CommonUtils;

Expand Down Expand Up @@ -70,6 +71,8 @@ public static BlockMetaStore.Factory getBlockStoreFactory(String baseDir) {
return HeapBlockMetaStore::new;
case ROCKS:
return () -> new RocksBlockMetaStore(baseDir);
case ROCKS_BLOCK_META_ONLY:
return () -> new RocksBlockMetaStoreMetaOnly(baseDir);
default:
throw new IllegalStateException("Unknown metastore type: " + type);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/

package alluxio.master.metastore.rocks;

import alluxio.collections.TwoKeyConcurrentMap;
import alluxio.metrics.MetricKey;
import alluxio.metrics.MetricsSystem;
import alluxio.proto.meta.Block.BlockLocation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.concurrent.ThreadSafe;

/**
* Block store backed by RocksDB and HEAP.
*/
@ThreadSafe
public class RocksBlockMetaStoreMetaOnly extends RocksBlockMetaStore {
private static final Logger LOG = LoggerFactory.getLogger(RocksBlockMetaStoreMetaOnly.class);
// Map from block id to block locations.
public final TwoKeyConcurrentMap<Long, Long, BlockLocation, Map<Long, BlockLocation>>
mBlockLocations = new TwoKeyConcurrentMap<>(() -> new HashMap<>(4));

/**
* Creates and initializes a rocks block store.
*
* @param baseDir the base directory in which to store block store metadata
*/
public RocksBlockMetaStoreMetaOnly(String baseDir) {
super(baseDir);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RocksBlockMetaStore() creates BlockMeta and BlockLocation tables in RocksDB, and BlockLocation is not needed.

You can probably do

class RocksBlockMetaStore {
    RocksBlockMetaStore() {
      .. 
      initDb();
    }
    public initDb() {
      // create rocks configs etc
      createBlockMetaTable();
      createBlockLocationsTable();
    }
}

public class RocksBlockMetaStoreMetaOnly extends RocksBlockMetaStore {
    RocksBlockMetaStoreMetaOnly() {
      super();
      // create your TwoKeyHashMap
    }

    @Override
    public initDb() {
      // create rocks configs etc
      createBlockMetaTable();
      // do not create BlockLocation table
    }
}

MetricsSystem.registerGaugeIfAbsent(MetricKey.MASTER_BLOCK_LOCATIONS_COUNT.getName(),
mBlockLocations::size);
}

@Override
public List<BlockLocation> getLocations(long blockid) {
if (!mBlockLocations.containsKey(blockid)) {
return Collections.emptyList();
}
return new ArrayList<>(mBlockLocations.get(blockid).values());
}

@Override
public void addLocation(long blockId, BlockLocation location) {
mBlockLocations.addInnerValue(blockId, location.getWorkerId(), location);
}

@Override
public void removeLocation(long blockId, long workerId) {
mBlockLocations.removeInnerValue(blockId, workerId);
}
}