if(log.isInfoEnabled()) log.info("num_rsps_expected=" + num_rsps_expected
if(log.isDebugEnabled()) log.debug("num_rsps_expected=" + num_rsps_expected
    void getMergeDataFromSubgroupCoordinators(Vector coords, long timeout) {        Message msg;        GMS.GmsHeader hdr;        Address coord;        long curr_time, time_to_wait=0, end_time;        int num_rsps_expected=0;        if(coords == null || coords.size() <= 1) {            if(log.isErrorEnabled()) log.error("coords == null or size <= 1");            return;        }        synchronized(merge_rsps) {            merge_rsps.removeAllElements();                if(log.isInfoEnabled()) log.info("sending MERGE_REQ to " + coords);            for(int i=0; i < coords.size(); i++) {                coord=(Address)coords.elementAt(i);                if(gms.local_addr != null && gms.local_addr.equals(coord)) {                    merge_rsps.add(getMergeResponse(gms.local_addr, merge_id));                    continue;                }                msg=new Message(coord, null, null);                hdr=new GMS.GmsHeader(GMS.GmsHeader.MERGE_REQ);                hdr.mbr=gms.local_addr;                hdr.merge_id=merge_id;                msg.putHeader(gms.getName(), hdr);                gms.passDown(new Event(Event.MSG, msg));            }            // wait until num_rsps_expected >= num_rsps or timeout elapsed            num_rsps_expected=coords.size();            curr_time=System.currentTimeMillis();            end_time=curr_time + timeout;            while(end_time > curr_time) {                time_to_wait=end_time - curr_time;                    if(log.isInfoEnabled()) log.info("waiting for "                            + time_to_wait                            + " msecs for merge responses");                if(merge_rsps.size() < num_rsps_expected) {                    try {                        merge_rsps.wait(time_to_wait);                    }                    catch(Exception ex) {                    }                }                    if(log.isInfoEnabled()) log.info("num_rsps_expected=" + num_rsps_expected                               + ", actual responses=" + merge_rsps.size());                if(merge_rsps.size() >= num_rsps_expected)                    break;                curr_time=System.currentTimeMillis();            }        }    }