if(log.isInfoEnabled()) log.info("mbr=" + mbr);
if(log.isDebugEnabled()) log.debug("mbr=" + mbr);
    public synchronized JoinRsp handleJoin(Address mbr) {        Vector new_mbrs=new Vector();        View v=null;        Digest d, tmp;        if(log.isInfoEnabled()) log.info("mbr=" + mbr);        if(gms.local_addr.equals(mbr)) {            if(log.isErrorEnabled()) log.error("cannot join myself !");            return null;        }        if(gms.members.contains(mbr)) {            if(log.isErrorEnabled())                log.error("member " + mbr                        + " already present; returning existing view " + gms.members.getMembers());            return new JoinRsp(new View(gms.view_id, gms.members.getMembers()), gms.getDigest());            // already joined: return current digest and membership        }        new_mbrs.addElement(mbr);        tmp=gms.getDigest(); // get existing digest        if(tmp == null) {            if(log.isErrorEnabled()) log.error("received null digest from GET_DIGEST: will cause JOIN to fail");            return null;        }        if(log.isInfoEnabled()) log.info("got digest=" + tmp);        d=new Digest(tmp.size() + 1);        // create a new digest, which contains 1 more member        d.add(tmp); // add the existing digest to the new one        d.add(mbr, 0, 0);        // ... and add the new member. it's first seqno will be 1        v=gms.getNextView(new_mbrs, null, null);        if(log.isDebugEnabled()) log.debug("joined member " + mbr + ", view is " + v);        return new JoinRsp(v, d);    }