/* * The MIT License (MIT) * * Copyright © 2020 xrv * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package io.github.ehlxr.hashing.consistent; import java.util.SortedMap; import java.util.TreeMap; public class Cluster { private static final int SERVER_SIZE_MAX = 1024; private final SortedMap servers = new TreeMap<>(); private int size = 0; public void put(Entry e) { routeServer(e.hashCode()).put(e); } public Entry get(Entry e) { return routeServer(e.hashCode()).get(e); } public Server routeServer(int hash) { if (servers.isEmpty()) return null; if (!servers.containsKey(hash)) { SortedMap tailMap = servers.tailMap(hash); hash = tailMap.isEmpty() ? servers.firstKey() : tailMap.firstKey(); // hash = servers.firstKey(); } return servers.get(hash); } public boolean addServer(Server s) { if (size >= SERVER_SIZE_MAX) return false; servers.put(s.hashCode(), s); size++; return true; } }