@Override public Address generateAddress() { ExtendedUUID uuid = ExtendedUUID.randomUUID(); uuid.put(SITE, Util.stringToBytes(this.topology.getSite())); uuid.put(RACK, Util.stringToBytes(this.topology.getRack())); uuid.put(MACHINE, Util.stringToBytes(this.topology.getMachine())); return uuid; } }
public static ExtendedUUID randomUUID() {return new ExtendedUUID(generateRandomBytes());}
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(); }
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); }
@Override public <T extends FlagsUUID> T addContents(T o) { super.addContents(o); if(o instanceof ExtendedUUID) { ExtendedUUID other=(ExtendedUUID)o; if(other.keys != null) { for(int i=0; i < other.keys.length; i++) { byte[] key=other.keys[i]; byte[] val=other.values[i]; if(!keyExists(key)) put(key, val); // overwrite } } } return (T)this; }
public ExtendedUUID put(byte[] key, byte[] val) { return put(0, key, val); }
JChannel ch=getProtocolStack().getChannel(); ch.addAddressGenerator(() -> { ExtendedUUID retval=ExtendedUUID.randomUUID(); if(can_become_site_master) retval.setFlag(can_become_site_master_flag); return retval; });
/** Does the payload match the 'site' ID. Checks only unicast destinations (multicast destinations return true) */ protected boolean isLocal(Address dest) { if(dest instanceof ExtendedUUID) { byte[] tmp=((ExtendedUUID)dest).get(SITE_ID); String str=Util.bytesToString(tmp); return Objects.equals(str, site); } return true; }
public boolean keyExists(String key) { return keyExists(Util.stringToBytes(key)); }
protected void write(DataOutput out) throws IOException { 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); } } }
/** * 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(can_become_site_master_flag)) continue; if(selected++ < max_site_masters) retval.add(member); } if(retval.isEmpty()) { Address coord=view.getCoord(); if(coord != null) retval.add(coord); } return retval; }
public ExtendedUUID put(String key, byte[] val) { return put(Util.stringToBytes(key), val); }
@Override public <T extends FlagsUUID> T addContents(T o) { super.addContents(o); if(o instanceof ExtendedUUID) { ExtendedUUID other=(ExtendedUUID)o; if(other.keys != null) { for(int i=0; i < other.keys.length; i++) { byte[] key=other.keys[i]; byte[] val=other.values[i]; if(!keyExists(key)) put(key, val); // overwrite } } } return (T)this; }
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); }
JChannel ch=getProtocolStack().getChannel(); ch.addAddressGenerator(() -> { ExtendedUUID retval=ExtendedUUID.randomUUID(); if(can_become_site_master) retval.setFlag(can_become_site_master_flag); return retval; });
public byte[] get(String key) { return get(Util.stringToBytes(key)); }
public boolean keyExists(String key) { return keyExists(Util.stringToBytes(key)); }
protected void write(DataOutput out) throws IOException { 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); } } }