responses.addResponse(data, true); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr());
@SuppressWarnings("unchecked") @Override public Object up(Event evt) { switch (evt.getType()) { case Event.FIND_MBRS: List<Address> missing = (List<Address>) evt.getArg(); Responses responses = new Responses(false); for (Address laddr : missing) { try { if (laddr instanceof JGAddress) { PingData pd = new PingData(laddr, true, laddr.toString(), newIpAddress(laddr)); responses.addResponse(pd, false); updateUDPCache(pd); } } catch (RuntimeException e) { logger.warn("Unable to create PingData response", e); throw e; } } return responses; } return up_prot.up(evt); }
protected void addResponse(PingData rsp, boolean overwrite) { if(discovery_rsp_callback != null) { try { discovery_rsp_callback.accept(rsp); } catch(Throwable t) { log.error("%s: failed invoking callback for discovery response: %s", local_addr, t); } } synchronized(ping_responses) { for(Iterator<Map.Entry<Long,Responses>> it=ping_responses.entrySet().iterator(); it.hasNext();) { Map.Entry<Long,Responses> entry=it.next(); long timestamp=entry.getKey(); Responses rsps=entry.getValue(); rsps.addResponse(rsp, overwrite); if(rsps.isDone() || TimeUnit.MILLISECONDS.convert(System.nanoTime() - timestamp, TimeUnit.NANOSECONDS) > discovery_rsp_expiry_time) { it.remove(); rsps.done(); clearRequestFutures(); } } } }
/** Removes responses which are done or whose timeout has expired (in the latter case, an expired response is marked as done) */ @ManagedOperation(description="Removes expired or completed responses") public void weedOutCompletedDiscoveryResponses() { synchronized(ping_responses) { for(Iterator<Map.Entry<Long,Responses>> it=ping_responses.entrySet().iterator(); it.hasNext();) { Map.Entry<Long,Responses> entry=it.next(); long timestamp=entry.getKey(); Responses rsps=entry.getValue(); if(rsps.isDone() || TimeUnit.MILLISECONDS.convert(System.nanoTime() - timestamp, TimeUnit.NANOSECONDS) > discovery_rsp_expiry_time) { it.remove(); rsps.done(); clearRequestFutures(); } } } }
@Override public void findMembers(List<Address> members, boolean initial_discovery, Responses responses) { num_discovery_requests++; List<PingData> retval=(List<PingData>)down_prot.down(new Event(Event.GET_PING_DATA, cluster_name)); if(retval != null) retval.stream().filter(data -> !data.getAddress().equals(local_addr)).forEach(data -> responses.addResponse(data, false)); responses.done(); // so waitFor() doesn't block at all }
public void addResponse(PingData rsp, boolean overwrite) { if(rsp == null) return; boolean is_coord_rsp=rsp.isCoord(), changed=false; lock.lock(); try { // https://jira.jboss.org/jira/browse/JGRP-1179 int ind=find(rsp); if(ind == -1) { // new addition add(rsp); changed=true; } else { PingData existing=ping_rsps[ind]; // cannot be null if(overwrite || (is_coord_rsp && !existing.isCoord())) { ping_rsps[ind]=rsp; changed=true; } } if(changed && ((num_expected_rsps > 0 && index >= num_expected_rsps) || break_on_coord_rsp && is_coord_rsp)) _done(); } finally { lock.unlock(); } }
public void findMembers(final List<Address> members, final boolean initial_discovery, Responses responses) { try { readAll(members, cluster_name, responses); if(responses.isEmpty()) { PhysicalAddress physical_addr=(PhysicalAddress)down(new Event(Event.GET_PHYSICAL_ADDRESS,local_addr)); PingData coord_data=new PingData(local_addr, true, NameCache.get(local_addr), physical_addr).coord(is_coord); PingData data=responses.findResponseFrom(local_addr); responses.clear(); else responses.done();
public Responses findMembers(final List<Address> members, final boolean initial_discovery, boolean async, long timeout) { num_discovery_requests++; int num_expected=members != null? members.size() : 0; int capacity=members != null? members.size() : 16; Responses rsps=new Responses(num_expected, initial_discovery && break_on_coord_rsp, capacity); addResponse(rsps); if(async || async_discovery || (num_discovery_runs > 1) && initial_discovery) { timer.execute(() -> invokeFindMembers(members, initial_discovery, rsps, async)); if(num_discovery_runs > 1 && initial_discovery) { int num_reqs_to_send=num_discovery_runs-1; long last_send=timeout - (timeout/num_discovery_runs); long interval=last_send/num_reqs_to_send; for(long i=0,delay=interval; i < num_reqs_to_send; i++,delay+=interval) { Future<?> future=timer.schedule(() -> invokeFindMembers(members, initial_discovery, rsps, async), delay, TimeUnit.MILLISECONDS); this.discovery_req_futures.add(future); num_discovery_requests++; } } } else invokeFindMembers(members, initial_discovery, rsps, async); weedOutCompletedDiscoveryResponses(); return rsps; }
protected void fetchPhysicalAddrs(List<Address> missing) { long current_time=0; boolean do_send=false; synchronized(this) { if(last_discovery_request == 0 || (current_time=time_service.timestamp()) - last_discovery_request >= MIN_WAIT_BETWEEN_DISCOVERIES) { last_discovery_request=current_time == 0? time_service.timestamp() : current_time; do_send=true; } } if(do_send) { missing.removeAll(logical_addr_cache.keySet()); if(!missing.isEmpty()) { // FIND_MBRS either returns immediately or is processed in a separate thread Responses rsps=fetchResponsesFromDiscoveryProtocol(missing); rsps.done(); } } }
public Responses clear() { lock.lock(); try { index=0; return _done(); } finally { lock.unlock(); } }
@Override public void findMembers(List<Address> members, boolean initial_discovery, Responses responses) { num_discovery_requests++; List<PingData> retval=(List<PingData>)down_prot.down(new Event(Event.GET_PING_DATA, cluster_name)); if(retval != null) retval.stream().filter(data -> !data.getAddress().equals(local_addr)).forEach(data -> responses.addResponse(data, false)); responses.done(); // so waitFor() doesn't block at all }
public void findMembers(final List<Address> members, final boolean initial_discovery, Responses responses) { try { readAll(members, cluster_name, responses); if(responses.isEmpty()) { PhysicalAddress physical_addr=(PhysicalAddress)down(new Event(Event.GET_PHYSICAL_ADDRESS,local_addr)); PingData coord_data=new PingData(local_addr, true, NameCache.get(local_addr), physical_addr).coord(is_coord); write(Collections.singletonList(coord_data), cluster_name); return; } PhysicalAddress phys_addr=(PhysicalAddress)down_prot.down(new Event(Event.GET_PHYSICAL_ADDRESS, local_addr)); PingData data=responses.findResponseFrom(local_addr); // the logical addr *and* IP address:port have to match if(data != null && data.getPhysicalAddr().equals(phys_addr)) { if(data.isCoord() && initial_discovery) responses.clear(); else ; // use case #1 if we have predefined files: most members join but are not coord } else { sendDiscoveryResponse(local_addr, phys_addr, NameCache.get(local_addr), null, false); } } finally { responses.done(); } }
public void addResponse(PingData rsp, boolean overwrite) { if(rsp == null) return; boolean is_coord_rsp=rsp.isCoord(), changed=false; lock.lock(); try { // https://jira.jboss.org/jira/browse/JGRP-1179 int ind=find(rsp); if(ind == -1) { // new addition add(rsp); changed=true; } else { PingData existing=ping_rsps[ind]; // cannot be null if(overwrite || (is_coord_rsp && !existing.isCoord())) { ping_rsps[ind]=rsp; changed=true; } } if(changed && ((num_expected_rsps > 0 && index >= num_expected_rsps) || break_on_coord_rsp && is_coord_rsp)) _done(); } finally { lock.unlock(); } }
/** Removes responses which are done or whose timeout has expired (in the latter case, an expired response is marked as done) */ @ManagedOperation(description="Removes expired or completed responses") public void weedOutCompletedDiscoveryResponses() { synchronized(ping_responses) { for(Iterator<Map.Entry<Long,Responses>> it=ping_responses.entrySet().iterator(); it.hasNext();) { Map.Entry<Long,Responses> entry=it.next(); long timestamp=entry.getKey(); Responses rsps=entry.getValue(); if(rsps.isDone() || TimeUnit.MILLISECONDS.convert(System.nanoTime() - timestamp, TimeUnit.NANOSECONDS) > discovery_rsp_expiry_time) { it.remove(); rsps.done(); } } } }
public Responses findMembers(List<Address> members, boolean initial_discovery, boolean async) { num_discovery_requests++; int num_expected=members != null? members.size() : 0; int capacity=members != null? members.size() : 16; final Responses rsps=new Responses(num_expected, initial_discovery && break_on_coord_rsp, capacity); findMembers(members, initial_discovery, rsps, async); return rsps; }
protected void sendToSingleMember(final Address dest, byte[] buf, int offset, int length) throws Exception { if(dest instanceof PhysicalAddress) { sendUnicast((PhysicalAddress)dest, buf, offset, length); return; } PhysicalAddress physical_dest; if((physical_dest=getPhysicalAddressFromCache(dest)) != null) { sendUnicast(physical_dest,buf,offset,length); return; } if(who_has_cache.addIfAbsentOrExpired(dest)) { // true if address was added // FIND_MBRS must return quickly Responses responses=fetchResponsesFromDiscoveryProtocol(Collections.singletonList(dest)); try { for(PingData data : responses) { if(data.getAddress() != null && data.getAddress().equals(dest)) { if((physical_dest=data.getPhysicalAddr()) != null) { sendUnicast(physical_dest, buf, offset, length); return; } } } log.warn(Util.getMessage("PhysicalAddrMissing"), local_addr, dest); } finally { responses.done(); } } }
public Responses done() { lock.lock(); try {return _done();} finally {lock.unlock();} }
if(data == null || (members != null && !members.contains(data.getAddress()))) continue; rsps.addResponse(data, false); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr());