/** Sent asynchronously - we don't wait for an ack */ public void deleteCounter(String name) { Owner owner=getOwner(); Request req=new DeleteRequest(owner, name); sendRequest(coord, req); if(!local_addr.equals(coord)) counters.remove(name); }
public void run() { try { _run(); } finally { discard_requests=false; } Request req=new ResendPendingRequests(); sendRequest(null, req); }
protected void handleView(View view) { this.view=view; if(log.isDebugEnabled()) log.debug("view=" + view); List<Address> members=view.getMembers(); Address old_coord=coord; if(!members.isEmpty()) coord=members.get(0); if(Objects.equals(coord, local_addr)) { List<Address> old_backups=backup_coords != null? new ArrayList<>(backup_coords) : null; backup_coords=new CopyOnWriteArrayList<>(Util.pickNext(members, local_addr, num_backups)); // send the current values to all *new* backups List<Address> new_backups=Util.newElements(old_backups,backup_coords); for(Address new_backup: new_backups) { for(Map.Entry<String,VersionedValue> entry: counters.entrySet()) { UpdateRequest update=new UpdateRequest(entry.getKey(), entry.getValue().value, entry.getValue().version); sendRequest(new_backup, update); } } } else backup_coords=null; if(old_coord != null && coord != null && !old_coord.equals(coord) && local_addr.equals(coord)) { discard_requests=true; // set to false when the task is done startReconciliationTask(); } }
responses=new ResponseCollector<>(targets); // send to everyone but us Request req=new ReconcileRequest(names, values, versions); sendRequest(null, req);
public Counter getOrCreateCounter(String name, long initial_value) { if(local_addr == null) throw new IllegalArgumentException("the channel needs to be connected before creating or getting a counter"); Owner owner=getOwner(); GetOrCreateRequest req=new GetOrCreateRequest(owner, name, initial_value); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); long[] result=new long[0]; try { result=promise.getResultWithTimeout(timeout); long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); return new CounterImpl(name); } catch(TimeoutException e) { throw new RuntimeException(e); } }
@Override public long addAndGet(long delta) { if(local_addr.equals(coord)) { VersionedValue val=getCounter(name); long retval=val.addAndGet(delta)[0]; if(backup_coords != null) updateBackups(name, val.value, val.version); return retval; } Owner owner=getOwner(); Request req=new AddAndGetRequest(owner, name, delta); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try { obj=promise.getResultWithTimeout(timeout); if(obj instanceof Throwable) throw new IllegalStateException((Throwable)obj); long[] result=(long[])obj; long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); return value; } catch(TimeoutException e) { throw new RuntimeException(e); } }
@Override public void set(long new_value) { if(local_addr.equals(coord)) { VersionedValue val=getCounter(name); val.set(new_value); if(backup_coords != null) updateBackups(name, val.value, val.version); return; } Owner owner=getOwner(); Request req=new SetRequest(owner, name, new_value); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try { obj=promise.getResultWithTimeout(timeout); if(obj instanceof Throwable) throw new IllegalStateException((Throwable)obj); long[] result=(long[])obj; long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); } catch(TimeoutException e) { throw new RuntimeException(e); } }
Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try {
if(log.isTraceEnabled()) log.trace("[" + local_addr + "] --> [" + coord + "] resending " + request); sendRequest(coord, request);
/** Sent asynchronously - we don't wait for an ack */ public void deleteCounter(String name) { Owner owner=getOwner(); Request req=new DeleteRequest(owner, name); sendRequest(coord, req); if(!local_addr.equals(coord)) counters.remove(name); }
public void run() { try { _run(); } finally { discard_requests=false; } Request req=new ResendPendingRequests(); sendRequest(null, req); }
protected void handleView(View view) { this.view=view; if(log.isDebugEnabled()) log.debug("view=" + view); List<Address> members=view.getMembers(); Address old_coord=coord; if(!members.isEmpty()) coord=members.get(0); if(Objects.equals(coord, local_addr)) { List<Address> old_backups=backup_coords != null? new ArrayList<>(backup_coords) : null; backup_coords=new CopyOnWriteArrayList<>(Util.pickNext(members, local_addr, num_backups)); // send the current values to all *new* backups List<Address> new_backups=Util.newElements(old_backups,backup_coords); for(Address new_backup: new_backups) { for(Map.Entry<String,VersionedValue> entry: counters.entrySet()) { UpdateRequest update=new UpdateRequest(entry.getKey(), entry.getValue().value, entry.getValue().version); sendRequest(new_backup, update); } } } else backup_coords=null; if(old_coord != null && coord != null && !old_coord.equals(coord) && local_addr.equals(coord)) { discard_requests=true; // set to false when the task is done startReconciliationTask(); } }
responses=new ResponseCollector<>(targets); // send to everyone but us Request req=new ReconcileRequest(names, values, versions); sendRequest(null, req);
public Counter getOrCreateCounter(String name, long initial_value) { if(local_addr == null) throw new IllegalArgumentException("the channel needs to be connected before creating or getting a counter"); Owner owner=getOwner(); GetOrCreateRequest req=new GetOrCreateRequest(owner, name, initial_value); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); long[] result=new long[0]; try { result=promise.getResultWithTimeout(timeout); long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); return new CounterImpl(name); } catch(TimeoutException e) { throw new RuntimeException(e); } }
@Override public void set(long new_value) { if(local_addr.equals(coord)) { VersionedValue val=getCounter(name); val.set(new_value); if(backup_coords != null) updateBackups(name, val.value, val.version); return; } Owner owner=getOwner(); Request req=new SetRequest(owner, name, new_value); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try { obj=promise.getResultWithTimeout(timeout); if(obj instanceof Throwable) throw new IllegalStateException((Throwable)obj); long[] result=(long[])obj; long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); } catch(TimeoutException e) { throw new RuntimeException(e); } }
@Override public long addAndGet(long delta) { if(local_addr.equals(coord)) { VersionedValue val=getCounter(name); long retval=val.addAndGet(delta)[0]; if(backup_coords != null) updateBackups(name, val.value, val.version); return retval; } Owner owner=getOwner(); Request req=new AddAndGetRequest(owner, name, delta); Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try { obj=promise.getResultWithTimeout(timeout); if(obj instanceof Throwable) throw new IllegalStateException((Throwable)obj); long[] result=(long[])obj; long value=result[0], version=result[1]; if(!coord.equals(local_addr)) counters.put(name, new VersionedValue(value, version)); return value; } catch(TimeoutException e) { throw new RuntimeException(e); } }
Promise<long[]> promise=new Promise<>(); pending_requests.put(owner, new Tuple<>(req, promise)); sendRequest(coord, req); Object obj=null; try {
if(log.isTraceEnabled()) log.trace("[" + local_addr + "] --> [" + coord + "] resending " + request); sendRequest(coord, request);