@Override
  public Block write(Block block) {

    int bufferId =
        assignor.assign(block.getBlockId(), block.getPrimaryDiskId(), block.getReplicaLevel());

    BufferRegion region = getBufferRegion(bufferId, block.getReplicaLevel());

    return region.write(block);
  }
  @Override
  public List<Block> getBlocksInTheSameRegion(Block block) {

    int bufferId =
        assignor.assign(block.getBlockId(), block.getPrimaryDiskId(), block.getReplicaLevel());

    BufferRegion region = getBufferRegion(bufferId, block.getReplicaLevel());

    return region.getBufferedBlocks();
  }
  @Override
  public Block remove(Block block) {

    if (block == null) return null;

    int bufferId =
        assignor.assign(block.getBlockId(), block.getPrimaryDiskId(), block.getReplicaLevel());

    BufferRegion region = getBufferRegion(bufferId, block.getReplicaLevel());

    return region.remove(block.getBlockId());
  }
  @Override
  public List<Block> getBlocksCorrespondingToSpecifiedDisk(int diskId) {
    List<Block> result = new ArrayList<>();

    for (List<BufferRegion> regions : regionTable.values()) {
      for (BufferRegion region : regions) {
        for (Block block : region.getBufferedBlocks()) {
          if (block.getOwnerDiskId() == diskId) result.add(block);
        }
      }
    }
    return result;
  }
 @Override
 public int getCorrespondingBufferId(Block block) {
   return assignor.assign(block.getBlockId(), block.getPrimaryDiskId(), block.getReplicaLevel());
 }