/*
* Copyright 2017 LinkedIn Corp. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*/
package com.github.ambry.clustermap;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.github.ambry.clustermap.ClusterMapUtils.*;
/**
* {@link ReplicaId} implementation to use within dynamic cluster managers.
*/
class AmbryReplica implements ReplicaId {
private final AmbryPartition partition;
private final AmbryDisk disk;
private final long capacityBytes;
/**
* Instantiate an AmbryReplica instance.
* @param partition the {@link AmbryPartition} of which this is a replica.
* @param disk the {@link AmbryDisk} on which this replica resides.
* @param capacityBytes the capacity in bytes for this replica.
*/
AmbryReplica(AmbryPartition partition, AmbryDisk disk, long capacityBytes) {
this.partition = partition;
this.disk = disk;
this.capacityBytes = capacityBytes;
validate();
}
/**
* Validate the constructed replica.
*/
private void validate() {
if (partition == null || disk == null) {
throw new IllegalStateException("Null partition " + partition + " or disk: " + disk);
}
validateReplicaCapacityInBytes(capacityBytes);
}
@Override
public AmbryPartition getPartitionId() {
return partition;
}
@Override
public AmbryDataNode getDataNodeId() {
return disk.getDataNode();
}
@Override
public String getMountPath() {
return disk.getMountPath();
}
@Override
public String getReplicaPath() {
return disk.getMountPath() + File.separator + partition.toPathString();
}
@Override
public List<AmbryReplica> getPeerReplicaIds() {
List<AmbryReplica> replicasOfPartition = new ArrayList<>(partition.getReplicaIds());
replicasOfPartition.remove(this);
return replicasOfPartition;
}
@Override
public long getCapacityInBytes() {
return capacityBytes;
}
@Override
public AmbryDisk getDiskId() {
return disk;
}
@Override
public boolean isDown() {
return disk.getState() == HardwareState.UNAVAILABLE;
}
@Override
public String toString() {
return "Replica[" + getDataNodeId().getHostname() + ":" + getDataNodeId().getPort() + ":" + getReplicaPath() + "]";
}
}