Example usage for org.apache.cassandra.dht Murmur3Partitioner MINIMUM

List of usage examples for org.apache.cassandra.dht Murmur3Partitioner MINIMUM

Introduction

In this page you can find the example usage for org.apache.cassandra.dht Murmur3Partitioner MINIMUM.

Prototype

LongToken MINIMUM

To view the source code for org.apache.cassandra.dht Murmur3Partitioner MINIMUM.

Click Source Link

Usage

From source file:com.spotify.cassandra.opstools.autobalance.Main.java

License:Apache License

private void run(CommandLine cmd) throws IOException, InterruptedException {
    boolean dryrun = cmd.hasOption("d");
    boolean force = cmd.hasOption("f");
    boolean noresolve = cmd.hasOption("r");
    int port = cmd.hasOption("p") ? Integer.parseInt(cmd.getOptionValue("p")) : 7199;
    String nodehost = cmd.hasOption("h") ? cmd.getOptionValue("h") : "localhost";

    System.out.println("Collecting information about the cluster...");

    NodeProbe nodeProbe = new NodeProbe(nodehost, port);

    if (nodeProbe.getTokens().size() != 1) {
        System.err.println("Cluster is using vnodes and should already be automatically balanced!");
        System.exit(1);/*from w  ww.  j  a  v  a2s.  c o  m*/
    }

    boolean hasData = false;
    if (!dryrun) {
        Map<String, String> loadMap = nodeProbe.getLoadMap();
        for (String s : loadMap.values()) {
            if (s.contains("KB"))
                continue;
            if (s.contains("MB") || s.contains("GB") || s.contains("TB")) {
                hasData = true;
                continue;
            }
            throw new RuntimeException("Unknown suffix in load map; don't dare to continue");
        }
    }

    String partitioner = nodeProbe.getPartitioner();
    BigInteger minToken, maxToken;

    if (partitioner.equals(RandomPartitioner.class.getName())) {
        minToken = RandomPartitioner.ZERO;
        maxToken = RandomPartitioner.MAXIMUM;
    } else if (partitioner.equals(Murmur3Partitioner.class.getName())) {
        minToken = BigInteger.valueOf(Murmur3Partitioner.MINIMUM.token);
        maxToken = BigInteger.valueOf(Murmur3Partitioner.MAXIMUM);
    } else {
        throw new RuntimeException("Unsupported partitioner: " + partitioner);
    }

    // Get current mapping of all live nodes

    List<String> liveNodes = nodeProbe.getLiveNodes();

    Map<String, BigInteger> hostTokenMap = new HashMap<String, BigInteger>();
    Map<String, String> hostDcMap = new HashMap<String, String>();

    for (String host : liveNodes) {
        String dc = nodeProbe.getEndpointSnitchInfoProxy().getDatacenter(host);

        String decoratedHost = host;

        if (!noresolve) {
            // Prefix host with canonical host name.
            // This makes things prettier and also causes tokens to be assigned in logical order.
            decoratedHost = InetAddress.getByName(host).getCanonicalHostName() + "/" + host;
        } else {
            decoratedHost = "/" + host;
        }

        hostDcMap.put(decoratedHost, dc);

        List<String> tokens = nodeProbe.getTokens(host);

        if (tokens.size() > 1) {
            throw new RuntimeException("vnodes not supported");
        }
        if (tokens.size() == 0) {
            throw new RuntimeException("No token for " + host + "; aborting");
        }

        hostTokenMap.put(decoratedHost, new BigInteger(tokens.get(0)));
    }

    Balancer balancer = new Balancer(hostTokenMap, hostDcMap, minToken, maxToken);
    Map<String, BigInteger> newMap = balancer.balance();

    List<Operation> operations = new ArrayList<Operation>();

    boolean movesNeeded = false;
    for (Map.Entry<String, BigInteger> entry : hostTokenMap.entrySet()) {
        String host = entry.getKey();
        BigInteger oldToken = entry.getValue();
        BigInteger newToken = newMap.get(host);
        if (!oldToken.equals(newToken)) {
            movesNeeded = true;
        }
        operations.add(new Operation(host, hostDcMap.get(host), oldToken, newToken));
    }

    if (movesNeeded && hasData && !dryrun && !force) {
        dryrun = true;
        System.out.println(
                "The cluster is unbalanced but has data, so no operations will actually be carried out. Use --force if you want the cluster to balance anyway.");
    }

    Collections.sort(operations);

    boolean unbalanced = false, moved = false;
    for (Operation op : operations) {
        if (op.oldToken.equals(op.newToken)) {
            System.out.println(op.host + ": Stays on token " + op.oldToken);
        } else {
            System.out.println(op.host + ": Moving from token " + op.oldToken + " to token " + op.newToken);
            if (!dryrun) {
                String ip = op.host.substring(op.host.lastIndexOf("/") + 1);
                NodeProbe np = new NodeProbe(ip, 7199);
                np.move(op.newToken.toString());
                moved = true;
            } else {
                unbalanced = true;
            }
        }
    }

    if (!unbalanced && moved) {
        System.out.println("The cluster is now balanced!");
    }
}

From source file:com.spotify.scio.cassandra.CompatUtil.java

License:Apache License

public static BigInteger minToken(String partitioner) {
    switch (partitioner) {
    case "org.apache.cassandra.dht.RandomPartitioner":
        return RandomPartitioner.ZERO;
    case "org.apache.cassandra.dht.Murmur3Partitioner":
        return BigInteger.valueOf((long) Murmur3Partitioner.MINIMUM.getTokenValue());
    default:/*w w  w. j  av a2s .c  o m*/
        throw new IllegalArgumentException("Unsupported partitioner " + partitioner);
    }
}

From source file:com.spotify.scio.cassandra.CompatUtil.java

License:Apache License

public static BigInteger getToken(String partitioner, ByteBuffer key) {
    switch (partitioner) {
    case "org.apache.cassandra.dht.RandomPartitioner":
        return randomPartitioner.getToken(key).getTokenValue();
    case "org.apache.cassandra.dht.Murmur3Partitioner":
        return BigInteger.valueOf((long) murmur3Partitioner.getToken(key).getTokenValue())
                .add(BigInteger.valueOf((long) Murmur3Partitioner.MINIMUM.getTokenValue()));
    default:/*from   w  w  w .  j a  v  a2 s  .  c  o m*/
        throw new IllegalArgumentException("Unsupported partitioner " + partitioner);
    }
}