private long currentViewId() { long viewId = -1; synchronized (sharedLock) { ViewId view = currentView.getViewId(); if (view != null) { viewId = view.getId(); } } return viewId; }
@GuardedBy("deliverSet") private long internalGetViewId() { return currentView == null ? -1 : currentView.getViewId().getId(); }
/** * Computes the next view. Returns a copy that has {@code leavers} and * {@code suspected_mbrs} removed and {@code joiners} added. */ public View getNextView(Collection<Address> joiners, Collection<Address> leavers, Collection<Address> suspected_mbrs) { synchronized(members) { ViewId view_id=view != null? view.getViewId() : null; if(view_id == null) { log.error(Util.getMessage("ViewidIsNull")); return null; // this should *never* happen ! } long vid=Math.max(view_id.getId(), ltime) + 1; ltime=vid; List<Address> mbrs=computeNewMembership(tmp_members.getMembers(), joiners, leavers, suspected_mbrs); Address new_coord=!mbrs.isEmpty()? mbrs.get(0) : local_addr; View v=new View(new_coord, vid, mbrs); // Update membership (see DESIGN for explanation): tmp_members.set(mbrs); // Update joining list (see DESIGN for explanation) if(joiners != null) joiners.stream().filter(tmp_mbr -> !joining.contains(tmp_mbr)).forEach(joining::add); // Update leaving list (see DESIGN for explanations) if(leavers != null) leavers.stream().filter(addr -> !leaving.contains(addr)).forEach(leaving::add); if(suspected_mbrs != null) suspected_mbrs.stream().filter(addr -> !leaving.contains(addr)).forEach(leaving::add); return v; } }
protected View generateGlobalView(View local_view, View remote_view, boolean merge) { List<View> views=new ArrayList<>(2); if(local_view != null) views.add(local_view); if(remote_view != null) views.add(remote_view); Collections.sort(views, (v1, v2) -> { ViewId vid1=v1.getViewId(), vid2=v2.getViewId(); Address creator1=vid1.getCreator(), creator2=vid2.getCreator(); int rc=creator1.compareTo(creator2); if(rc != 0) return rc; long id1=vid1.getId(), id2=vid2.getId(); return id1 > id2 ? 1 : id1 < id2? -1 : 0; }); List<Address> combined_members=new ArrayList<>(); for(View view: views) combined_members.addAll(view.getMembers()); long new_view_id; synchronized(this) { new_view_id=global_view_id++; } Address view_creator=combined_members.isEmpty()? local_addr : combined_members.get(0); if(merge) return new MergeView(view_creator, new_view_id, combined_members, views); else return new View(view_creator, new_view_id, combined_members); }
ViewId tmp_vid=tmp_view.getViewId(); if(tmp_vid != null) logical_time=Math.max(logical_time, tmp_vid.getId()); // compute the new view id (max of all vids +1) logical_time=Math.max(logical_time, v.getViewId().getId()); Address creator=v.getCreator(); if(creator != null && !merged_mbrs.contains(creator))
public void writeTo(DataOutput out) throws Exception { super.writeTo(out); // write subgroups int len=subgroups != null? subgroups.length : 0; out.writeShort(len); if(len == 0) return; for(View v: subgroups) { int index=get(v.getCreator()); out.writeShort(index); // if we don't find the member, write the addres (https://issues.jboss.org/browse/JGRP-1707) if(index < 0) Util.writeAddress(v.getCreator(), out); out.writeLong(v.getViewId().getId()); int num_mbrs=v.size(); out.writeShort(num_mbrs); for(Address mbr: v) { index=get(mbr); out.writeShort(index); if(index < 0) Util.writeAddress(mbr, out); } } }
log.info("[channel: %s] Injecting a new view: %s", thisNodeAddress, nodeView); long viewId = getProtocolStack().getChannel().getView().getViewId().getId()+1; List<Address> nodes = new ArrayList<>();
protected Object installView(byte[] buf, int offset, int length) { try { ViewData data=Util.streamableFromByteBuffer(ViewData::new, buf, offset, length); if(data.uuids != null) NameCache.add(data.uuids); remote_view=data.remote_view; if(global_view == null || (data.global_view != null &&!global_view.equals(data.global_view))) { global_view=data.global_view; synchronized(this) { if(data.global_view.getViewId().getId() > global_view_id) global_view_id=data.global_view.getViewId().getId(); } if(present_global_views) return up_prot.up(new Event(Event.VIEW_CHANGE, global_view)); } } catch(Exception e) { log.error(Util.getMessage("FailedInstallingView"), e); } return null; }
ViewId vid=new_view.getViewId(); List<Address> mbrs=new_view.getMembers(); ltime=Math.max(vid.getId(), ltime); // compute the logical time, regardless of whether the view is accepted
/** * Drops messages to/from other members and then closes the channel. Note that this member won't get excluded from * the view until failure detection has kicked in and the new coord installed the new view */ public static void shutdown(JChannel ch) throws Exception { DISCARD discard=new DISCARD(); discard.setLocalAddress(ch.getAddress()); discard.setDiscardAll(true); ProtocolStack stack=ch.getProtocolStack(); TP transport=stack.getTransport(); stack.insertProtocol(discard,ProtocolStack.Position.ABOVE,transport.getClass()); //abruptly shutdown FD_SOCK just as in real life when member gets killed non gracefully FD_SOCK fd=ch.getProtocolStack().findProtocol(FD_SOCK.class); if(fd != null) fd.stopServerSocket(false); View view=ch.getView(); if(view != null) { ViewId vid=view.getViewId(); List<Address> members=Collections.singletonList(ch.getAddress()); ViewId new_vid=new ViewId(ch.getAddress(),vid.getId() + 1); View new_view=new View(new_vid,members); // inject view in which the shut down member is the only element GMS gms=stack.findProtocol(GMS.class); gms.installView(new_view); } Util.close(ch); }
public long getSeqno() { return tag != null? tag.getId() : -1; }
private long currentViewId() { long viewId = -1; synchronized (sharedLock) { ViewId view = currentView.getViewId(); if (view != null) { viewId = view.getId(); } } return viewId; }
private long currentViewId() { long viewId = -1; synchronized (sharedLock) { ViewId view = currentView.getVid(); if (view != null) { viewId = view.getId(); } } return viewId; }
public View makeView(Vector<Address> mbrs, ViewId vid) { Address coord=null; long id=0; if(vid != null) { coord=vid.getCoordAddress(); id=vid.getId(); } return new View(coord, id, mbrs); }
public View makeView(Vector<Address> mbrs) { Address coord=null; long id=0; if(view_id != null) { coord=view_id.getCoordAddress(); id=view_id.getId(); } return new View(coord, id, mbrs); }
@GuardedBy("deliverSet") private long internalGetViewId() { return currentView == null ? -1 : currentView.getViewId().getId(); }
protected final View makeView(Vector mbrs) { Address coord; long id; ViewId view_id=new ViewId(local_addr); coord=view_id.getCoordAddress(); id=view_id.getId(); return new View(coord, id, mbrs); }
private MetaValue createViewMetaValue(View view) { Map<String, MetaValue> viewMap = new HashMap<String, MetaValue>(); viewMap.put("id", SimpleValueSupport.wrap(view.getVid().getId())); viewMap.put("creator", SimpleValueSupport.wrap(view.getCreator().toString())); Vector<Address> members = view.getMembers(); MetaValue[] memberValues = new MetaValue[members.size()]; for (int i = 0; i < memberValues.length; i++) { memberValues[i] = SimpleValueSupport.wrap(members.get(i).toString()); } viewMap.put("members", new CollectionValueSupport(MEMBERS_TYPE, memberValues)); if (memberValues.length > 0) { viewMap.put("coordinator", memberValues[0]); } MetaValue viewValue = new MapCompositeValueSupport(viewMap, VIEW_TYPE); return viewValue; }
GroupView(View newView, GroupView previousView, ClusterNodeFactory factory) { this.viewId = newView.getVid().getId(); this.jgmembers = new ArrayList<Address>(newView.getMembers()); this.coordinator = this.jgmembers.size() == 0 ? null : this.jgmembers.get(0); this.allMembers = translateAddresses(newView.getMembers(), factory); this.deadMembers = getDeadMembers(previousView.allMembers, allMembers); this.newMembers = getNewMembers(previousView.allMembers, allMembers); if (newView instanceof MergeView) { MergeView mergeView = (MergeView) newView; List<View> subgroups = mergeView.getSubgroups(); this.originatingGroups = new ArrayList<List<ClusterNode>>(subgroups.size()); for (View view : subgroups) { this.originatingGroups.add(translateAddresses(view.getMembers(), factory)); } } else { this.originatingGroups = null; } } }
public static void installNewView(Stream<Address> members, Function<EmbeddedCacheManager, JChannel> channelRetriever, EmbeddedCacheManager... where) { List<org.jgroups.Address> viewMembers = members.map(a -> ((JGroupsAddress) a).getJGroupsAddress()).collect(Collectors.toList()); List<View> previousViews = new ArrayList<>(where.length); for (EmbeddedCacheManager ecm : where) { previousViews.add(((GMS) channelRetriever.apply(ecm).getProtocolStack().findProtocol(GMS.class)).view()); } long viewId = previousViews.stream().mapToLong(view -> view.getViewId().getId()).max().orElse(0) + 1; View newView; if (previousViews.stream().allMatch(view -> view.getMembers().containsAll(viewMembers))) { newView = View.create(viewMembers.get(0), viewId, viewMembers.toArray(new org.jgroups.Address[viewMembers.size()])); } else { newView = new MergeView(new ViewId(viewMembers.get(0), viewId), viewMembers, previousViews); } log.trace("Before installing new view:" + viewMembers); for (EmbeddedCacheManager ecm : where) { ((GMS) channelRetriever.apply(ecm).getProtocolStack().findProtocol(GMS.class)).installView(newView); } }