/** Returns true if all mbrs are elements of this view, false otherwise */ public boolean containsMembers(Address ... mbrs) { if(mbrs == null || members == null) return false; for(Address mbr: mbrs) { if(!containsMember(mbr)) return false; } return true; }
/** * If we are leaving, we have to wait for the view change (last msg in the current view) that * excludes us before we can leave. * @param new_view The view to be installed * @param digest If view is a MergeView, digest contains the seqno digest of all members and has to be set by GMS */ public void handleViewChange(View new_view, Digest digest) { suspected_mbrs.clear(); if(leaving && !new_view.containsMember(gms.local_addr)) // received a view in which I'm not member: ignore return; gms.installView(new_view, digest); }
/** * Called by the GMS when a VIEW is received. * @param new_view The view to be installed * @param digest If view is a MergeView, digest contains the seqno digest of all members and has to * be set by GMS */ public void handleViewChange(View new_view, Digest digest) { if(leaving && !new_view.containsMember(gms.local_addr)) return; gms.installView(new_view, digest); }
protected boolean inView(Address sender, String error_msg) { View curr_view=this.view; if(curr_view == null || curr_view.containsMember(sender)) return true; log.error(error_msg, sender, curr_view); return false; }
if(!from.containsMember(addr)) num_joiners++; if(num_joiners > 0) { int index=0; for(Address addr: to) if(!from.containsMember(addr)) joined[index++]=addr; if(!to.containsMember(addr)) num_left++; if(num_left > 0) { int index=0; for(Address addr: from) if(!to.containsMember(addr)) left[index++]=addr;
/** * @return {@code true} if the member who sent the message left the cluster and the message isn't ready to be deliver. */ @GuardedBy("deliverySet") private boolean removeMessage(MessageInfo messageInfo) { if (currentView.containsMember(messageInfo.getMessage().getSrc()) || messageInfo.isReadyToDeliver()) { return false; } else { messageCache.remove(messageInfo.messageID); return true; } }
protected void writeAll(Address[] excluded_mbrs) { Map<Address,PhysicalAddress> cache_contents= (Map<Address,PhysicalAddress>)down_prot.down(new Event(Event.GET_LOGICAL_PHYSICAL_MAPPINGS, false)); if(excluded_mbrs != null) for(Address excluded_mbr : excluded_mbrs) cache_contents.remove(excluded_mbr); List<PingData> list=new ArrayList<>(cache_contents.size()); for(Map.Entry<Address,PhysicalAddress> entry: cache_contents.entrySet()) { Address addr=entry.getKey(); if(update_store_on_view_change && (view != null && !view.containsMember(addr))) continue; PhysicalAddress phys_addr=entry.getValue(); PingData data=new PingData(addr, true, NameCache.get(addr), phys_addr).coord(addr.equals(local_addr)); list.add(data); } write(list, cluster_name); if(log.isTraceEnabled()) log.trace("%s: wrote to backend store: %s", local_addr, list.stream().map(PingData::getAddress).collect(Collectors.toList())); }
public Object down(Event evt) { Object retval=super.down(evt); switch(evt.type()) { case Event.ADD_PHYSICAL_ADDRESS: Tuple<Address,PhysicalAddress> tuple=evt.arg(); IpAddress val=(IpAddress)tuple.getVal2(); addr_table.put(tuple.getVal1(), new InetSocketAddress(val.getIpAddress(), val.getPort())); break; case Event.VIEW_CHANGE: for(Iterator<Map.Entry<Address,SocketAddress>> it=addr_table.entrySet().iterator(); it.hasNext();) { Map.Entry<Address,SocketAddress> entry=it.next(); if(!view.containsMember(entry.getKey())) { SocketAddress sock_addr=entry.getValue(); it.remove(); Connection conn=connections.remove(sock_addr); Util.close(conn); } } break; } return retval; }
long addRemoteMessageToDeliver(MessageID messageID, Message message, long remoteSequenceNumber, long viewId) { MessageInfo messageInfo; long sequenceNumber; synchronized (deliverySet) { long currentViewId = internalGetViewId(); if (currentViewId != -1 //we have a view, check the view id && viewId <= currentViewId //message from the current or previous view, check the members && !currentView.containsMember(message.getSrc())) { //node no longer in view. discard it return -1; } sequenceNumber = sequenceNumberManager.updateAndGet(remoteSequenceNumber); messageInfo = new MessageInfo(messageID, message, sequenceNumber); deliverySet.add(messageInfo); } messageCache.put(messageID, messageInfo); return sequenceNumber; }
private boolean onViewChange(View view) { boolean coordinatorLeft = false; View oldView; synchronized (sharedLock) { suspected.retainAll(view.getMembers()); oldView = currentView; currentView = view; coordinatorLeft = !oldView.getMembers().isEmpty() && !view.getMembers().isEmpty() && !view.containsMember(oldView.getCreator()); } if (log.isDebugEnabled()) log.debug(localAddress + ": installing view " + view); return coordinatorLeft; }
/** * If the target address is not a member of the new view, we'll mark the response as suspected and unblock * the caller of execute() */ public void viewChange(View view) { if(view == null) return; // SiteAddresses are not checked as they might be in a different cluster if(!(target instanceof SiteAddress) && !view.containsMember(target) && !isDone()) { completeExceptionally(new SuspectedException(target)); corrDone(); } }
Address mbr=entry.getKey(); if(!(mbr instanceof SiteAddress) && !view.containsMember(mbr)) { Rsp<T> rsp=entry.getValue(); if(rsp.setSuspected()) {
View newView =evt.getArg(); boolean coordinatorLeft = onViewChange(newView); boolean singletonMember = newView.size() == 1 && newView.containsMember(localAddress); boolean isThisOurFirstView = viewCounter.addAndGet(1) == 1; if (!tmpView.containsMember(localAddress)) onViewChange(tmpView); break;
/** * Called by join(). Installs the view returned by calling Coord.handleJoin() and becomes coordinator. */ private boolean installView(View new_view, Digest digest) { if(!new_view.containsMember(gms.local_addr)) { log.error("%s: I'm not member of %s, will not install view", gms.local_addr, new_view); return false; } gms.installView(new_view, digest); if(gms.impl == null || gms.impl instanceof ClientGmsImpl) // installView() should have set the role (impl) gms.becomeParticipant(); gms.getUpProtocol().up(new Event(Event.BECOME_SERVER)); gms.getDownProtocol().down(new Event(Event.BECOME_SERVER)); return true; }
if(view != null && !view.containsMember(sender)) { log.error("%s : dropping REQUEST from non-member %s; view=%s" + view, local_addr, sender, view); return null; if(view != null && !view.containsMember(coordinator)) { log.error(local_addr + "%s: dropping RESPONSE from non-coordinator %s; view=%s", local_addr, coordinator, view); return null;
public Object up(Message msg) { LockingHeader hdr=msg.getHeader(id); if(hdr == null) return up_prot.up(msg); Request req=null; try { req=Util.streamableFromBuffer(Request::new, msg.getRawBuffer(), msg.getOffset(), msg.getLength()) .sender(msg.src()); } catch(Exception ex) { log.error("%s: failed deserializing request", local_addr, ex); return null; } if(req.type != Type.LOCK_INFO_REQ && req.type != Type.LOCK_INFO_RSP && req.type != Type.LOCK_REVOKED && null != view && !view.containsMember(msg.getSrc())) { log.error("%s: received request from '%s' but member is not present in the current view - ignoring request", local_addr, msg.src()); return null; } requestReceived(req); return null; }
Address addr=entry.getKey(); if(addr.equals(local_addr) || (view != null && view.containsMember(addr))) { PhysicalAddress physical_addr=entry.getValue(); sendDiscoveryResponse(addr, physical_addr, NameCache.get(addr), msg.getSrc(), isCoord(addr));
if(view != null && !view.containsMember(sender)) { log.error("%s: dropping FORWARD request from non-member %s; view=%s", local_addr, sender, view); return null;
if(!new_view.containsMember(coord)) {
/** * If we are leaving, we have to wait for the view change (last msg in the current view) that * excludes us before we can leave. * @param new_view The view to be installed * @param digest If view is a MergeView, digest contains the seqno digest of all members and has to be set by GMS */ public void handleViewChange(View new_view, Digest digest) { suspected_mbrs.clear(); if(leaving && !new_view.containsMember(gms.local_addr)) // received a view in which I'm not member: ignore return; gms.installView(new_view, digest); }