public static ExtendedUUID randomUUID() { return new ExtendedUUID(generateRandomBytes()); }
protected ExtendedUUID put(int start_index, byte[] key, byte[] val) { if(val != null && val.length > 0xff) throw new IllegalArgumentException("value has to be <= " + 0xff + " bytes"); if(keys == null) resize(3); for(int i=start_index; i < keys.length; i++) { byte[] k=keys[i]; if(k == null || Arrays.equals(key, k)) { keys[i]=key; values[i]=val; return this; } } int index=keys.length; resize(keys.length + 3); return put(index, key, val); }
public Address generateAddress() { return ExtendedUUID.randomUUID().put(SITE_ID, Util.stringToBytes(site)); } });
public byte[] get(String key) { return get(Util.stringToBytes(key)); }
public ExtendedUUID put(byte[] key, byte[] val) { return put(0, key, val); }
/** * Iterates over the list of members and adds every member if the member's rank is below max_site_masters. Skips * members which cannot become site masters (can_become_site_master == false). If no site master can be found, * the first member of the view will be returned (even if it has can_become_site_master == false) */ protected List<Address> determineSiteMasters(View view) { List<Address> retval=new ArrayList<>(view.size()); int selected=0; for(Address member: view) { if(member instanceof ExtendedUUID && !((ExtendedUUID)member).isFlagSet(ExtendedUUID.can_become_site_master)) continue; if(selected++ < max_site_masters) retval.add(member); } if(retval.isEmpty()) { Address tmp=Util.getCoordinator(view); if(tmp != null) retval.add(Util.getCoordinator(view)); } return retval; }
protected Address generateAddress() { if(address_generators == null || address_generators.isEmpty()) return UUID.randomUUID(); if(address_generators.size() == 1) return address_generators.get(0).generateAddress(); // at this point we have multiple AddressGenerators installed Address[] addrs=new Address[address_generators.size()]; for(int i=0; i < addrs.length; i++) addrs[i]=address_generators.get(i).generateAddress(); for(int i=0; i < addrs.length; i++) { if(!(addrs[i] instanceof ExtendedUUID)) { log.error("address generator %s does not subclass %s which is required if multiple address generators " + "are installed, removing it", addrs[i].getClass().getSimpleName(), ExtendedUUID.class.getSimpleName()); addrs[i]=null; } } ExtendedUUID uuid=null; for(int i=0; i < addrs.length; i++) { // we only have ExtendedUUIDs in addrs if(addrs[i] != null) { if(uuid == null) uuid=(ExtendedUUID)addrs[i]; else uuid.addContents((ExtendedUUID)addrs[i]); } } return uuid != null? uuid : UUID.randomUUID(); }
public boolean keyExists(String key) { return keyExists(Util.stringToBytes(key)); }
protected void write(DataOutput out) throws IOException { out.writeShort(flags); int length=length(); out.writeByte(length); if(keys == null) return; for(int i=0; i < keys.length; i++) { byte[] k=keys[i]; if(k != null) { out.writeByte(k.length); out.write(k); byte[] v=values[i]; out.writeByte(v != null? v.length : 0); if(v != null) out.write(v); } } }
public String print() { StringBuilder sb=new StringBuilder(super.toString()); if(flags != 0 || keys != null) sb.append(" ("); if(flags != 0) sb.append("flags=" + flags + " (" + flagsToString() + ")"); if(keys == null) return sb.toString(); for(int i=0; i < keys.length; i++) { byte[] key=keys[i]; if(key == null) continue; byte[] val=values[i]; Object obj=val != null && val.length >= Util.MAX_LIST_PRINT_SIZE ? val.length + " bytes" : null; if(val != null && val.length <= Util.MAX_LIST_PRINT_SIZE) { if(obj == null) { try { obj=Util.bytesToString(val); } catch(Throwable t) { obj=val != null? val.length + " bytes" : null; } } } sb.append(", ").append(new AsciiString(key)).append("=").append(obj); } if(flags != 0 || keys != null) sb.append(")"); return sb.toString(); }
public Address generateAddress() { return ExtendedUUID.randomUUID().put(SITE_ID, Util.stringToBytes(site)); } });
protected ExtendedUUID put(int start_index, byte[] key, byte[] val) { if(val != null && val.length > 0xff) throw new IllegalArgumentException("value has to be <= " + 0xff + " bytes"); if(keys == null) resize(3); for(int i=start_index; i < keys.length; i++) { byte[] k=keys[i]; if(k == null || Arrays.equals(key, k)) { keys[i]=key; values[i]=val; return this; } } int index=keys.length; resize(keys.length + 3); return put(index, key, val); }
public byte[] get(String key) { return get(Util.stringToBytes(key)); }
public ExtendedUUID put(byte[] key, byte[] val) { return put(0, key, val); }
protected String flagsToString() { StringBuilder sb=new StringBuilder(); boolean first=true; for(Tuple<Short,String> flag: Arrays.asList(new Tuple<>(site_master, "sm"), new Tuple<>(can_become_site_master, "can_be_sm"))) { if(isFlagSet(flag.getVal1())) { if(first) first=false; else sb.append("|"); sb.append(flag.getVal2()); } } return sb.toString(); } }
protected Address generateAddress() { if(address_generators == null || address_generators.isEmpty()) return UUID.randomUUID(); if(address_generators.size() == 1) return address_generators.get(0).generateAddress(); // at this point we have multiple AddressGenerators installed Address[] addrs=new Address[address_generators.size()]; for(int i=0; i < addrs.length; i++) addrs[i]=address_generators.get(i).generateAddress(); for(int i=0; i < addrs.length; i++) { if(!(addrs[i] instanceof ExtendedUUID)) { log.error("address generator %s does not subclass %s which is required if multiple address generators " + "are installed, removing it", addrs[i].getClass().getSimpleName(), ExtendedUUID.class.getSimpleName()); addrs[i]=null; } } ExtendedUUID uuid=null; for(int i=0; i < addrs.length; i++) { // we only have ExtendedUUIDs in addrs if(addrs[i] != null) { if(uuid == null) uuid=(ExtendedUUID)addrs[i]; else uuid.addContents((ExtendedUUID)addrs[i]); } } return uuid != null? uuid : UUID.randomUUID(); }
public boolean keyExists(String key) { return keyExists(Util.stringToBytes(key)); }