All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.util.AckCollector Maven / Gradle / Ivy

There is a newer version: 9.1.7.Final
Show newest version
package org.jgroups.util;

import org.jgroups.Address;
import org.jgroups.TimeoutException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Collects acks from a number of nodes, waits for all acks. Can also be time bounded
 * @author Bela Ban
 */
public class AckCollector {
    /** List of members from whom we haven't received an ACK yet */
    protected final List
missing_acks; protected final Promise all_acks_received=new Promise(); protected final List
suspected_mbrs=new ArrayList
(5); protected int expected_acks; public AckCollector() { missing_acks=new ArrayList
(); expected_acks=0; } public AckCollector(Collection
members) { missing_acks=new ArrayList
(members != null? members.size() : 10); addAll(members); } public AckCollector(Address ... members) { missing_acks=new ArrayList
(members != null? members.length : 10); addAll(members); } public synchronized void reset(Collection
members) { suspected_mbrs.clear(); missing_acks.clear(); addAll(members); all_acks_received.reset(); } public synchronized void destroy() { suspected_mbrs.clear(); missing_acks.clear(); expected_acks=0; all_acks_received.setResult(null); } public synchronized int size() { return missing_acks.size(); } public synchronized int expectedAcks() { return expected_acks; } public synchronized void ack(Address member) { if(member != null && missing_acks.remove(member) && missing_acks.isEmpty()) all_acks_received.setResult(Boolean.TRUE); } public synchronized void suspect(Address member) { if(member == null) return; if(!suspected_mbrs.contains(member)) suspected_mbrs.add(member); ack(member); } public boolean retainAll(Collection
members) { if(members == null) return false; boolean retval=false; synchronized(this) { suspected_mbrs.retainAll(members); if((retval=missing_acks.retainAll(members)) && missing_acks.isEmpty()) all_acks_received.setResult(Boolean.TRUE); } return retval; } public boolean waitForAllAcks() { if(missing_acks.isEmpty()) return true; Boolean result=all_acks_received.getResult(); return result != null && result; } public boolean waitForAllAcks(long timeout) throws TimeoutException { if(missing_acks.isEmpty()) return true; Boolean result=all_acks_received.getResultWithTimeout(timeout); return result != null && result; } public String toString() { return suspected_mbrs.isEmpty() ? printMissing() : printMissing() + " (suspected: " + printSuspected() + ")"; } public synchronized String printMissing() { return Util.printListWithDelimiter(missing_acks, ", "); } public synchronized String printSuspected() { return Util.printListWithDelimiter(suspected_mbrs, ", "); } protected synchronized void addAll(Address ... members) { if(members == null) return; for(Address member: members) if(member != null && !missing_acks.contains(member)) missing_acks.add(member); expected_acks=missing_acks.size(); } protected synchronized void addAll(Collection
members) { if(members == null) return; for(Address member: members) if(member != null && !missing_acks.contains(member)) missing_acks.add(member); expected_acks=missing_acks.size(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy