package com.cube.replication;
import com.cube.cluster.ClusterNode;
import java.util.ArrayList;
import java.util.List;
/**
* Simple replication strategy that places replicas on consecutive nodes.
* Good for single-datacenter deployments.
*/
public class SimpleReplicationStrategy implements ReplicationStrategy {
@Override
public List<ClusterNode> getReplicaNodes(String key, int replicationFactor, List<ClusterNode> availableNodes) {
List<ClusterNode> replicas = new ArrayList<>();
if (availableNodes.isEmpty()) {
return replicas;
}
// Use consistent hashing to determine primary node
int startIndex = getStartIndex(key, availableNodes.size());
// Select consecutive nodes
for (int i = 0; i < replicationFactor && i < availableNodes.size(); i++) {
int nodeIndex = (startIndex + i) % availableNodes.size();
ClusterNode node = availableNodes.get(nodeIndex);
// Only add alive nodes
if (node.isAlive()) {
replicas.add(node);
}
}
return replicas;
}
/**
* Calculate start index using consistent hashing
*/
private int getStartIndex(String key, int nodeCount) {
// Simple hash function
int hash = key.hashCode();
// Ensure positive and within range
return Math.abs(hash) % nodeCount;
}
@Override
public String getName() {
return "SimpleStrategy";
}
}