public void readFrom(DataInput in) throws Exception { super.readFrom(in); short len=in.readShort(); if(len > 0) { subgroups=new View[len]; for(int i=0; i < len; i++) { int index=in.readShort(); Address creator=index >= 0 ? get(index) : Util.readAddress(in); long id=in.readLong(); Address[] mbrs=new Address[in.readShort()]; for(int j=0; j < mbrs.length; j++) { index=in.readShort(); mbrs[j]=index >= 0? get(index) : Util.readAddress(in); } try { View view=View.create(creator, id, mbrs); subgroups[i]=view; } catch(Throwable t) { } } } }
void becomeSingletonMember(Address mbr) { View new_view=View.create(mbr, 0, mbr); // create singleton view with mbr as only member // set the initial digest (since I'm the first member) Digest initial_digest=new Digest(mbr, 0, 0); gms.installView(new_view, initial_digest); gms.becomeCoordinator(); // not really necessary - installView() should do it gms.getUpProtocol().up(new Event(Event.BECOME_SERVER)); gms.getDownProtocol().down(new Event(Event.BECOME_SERVER)); log.debug("%s: created cluster (first member). My view is %s, impl is %s", gms.getLocalAddress(), gms.getViewId(), gms.getImpl().getClass().getName()); } }
private View toView(ArrayList<JChannel> channels) { final List<Address> viewMembers = new ArrayList<>(); for (JChannel c : channels) viewMembers.add(c.getAddress()); return View.create(channels.get(0).getAddress(), viewId.incrementAndGet(), (Address[]) viewMembers.toArray(new Address[viewMembers.size()])); }
public void readFrom(DataInput in) throws Exception { super.readFrom(in); short len=in.readShort(); if(len > 0) { subgroups=new View[len]; for(int i=0; i < len; i++) { int index=in.readShort(); Address creator=index >= 0 ? get(index) : Util.readAddress(in); long id=in.readLong(); Address[] mbrs=new Address[in.readShort()]; for(int j=0; j < mbrs.length; j++) { index=in.readShort(); mbrs[j]=index >= 0? get(index) : Util.readAddress(in); } try { View view=View.create(creator, id, mbrs); subgroups[i]=view; } catch(Throwable t) { } } } }
private List<Address> installNewView() { final List<Address> viewMembers = new ArrayList<>(); for (JChannel c : channels) viewMembers.add(c.getAddress()); View view = View.create(channels.get(0).getAddress(), viewId.incrementAndGet(), (Address[]) viewMembers.toArray(new Address[viewMembers.size()])); log.trace("Before installing new view..."); for (JChannel c : channels) ((GMS) c.getProtocolStack().findProtocol(GMS.class)).installView(view); return viewMembers; }
void becomeSingletonMember(Address mbr) { View new_view=View.create(mbr, 0, mbr); // create singleton view with mbr as only member // set the initial digest (since I'm the first member) Digest initial_digest=new Digest(mbr, 0, 0); gms.installView(new_view, initial_digest); gms.becomeCoordinator(); // not really necessary - installView() should do it gms.getUpProtocol().up(new Event(Event.BECOME_SERVER)); gms.getDownProtocol().down(new Event(Event.BECOME_SERVER)); log.debug("%s: created cluster (first member). My view is %s, impl is %s", gms.getLocalAddress(), gms.getViewId(), gms.getImpl().getClass().getName()); } }
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); } }
private void installNewView(Cache installing, Cache... cachesInView) { JGroupsTransport transport = (JGroupsTransport) installing.getCacheManager().getTransport(); JChannel channel = transport.getChannel(); org.jgroups.Address[] members = Stream.of(cachesInView) .map(c -> ((JGroupsAddress) address(c)).getJGroupsAddress()) .toArray(org.jgroups.Address[]::new); View view = View.create(members[0], transport.getViewId() + 1, members); ((GMS) channel.getProtocolStack().findProtocol(GMS.class)).installView(view); }
/** * Simulates a node crash, discarding all the messages from/to this node and then stopping the caches. */ public static void crashCacheManagers(EmbeddedCacheManager... cacheManagers) { for (EmbeddedCacheManager cm : cacheManagers) { JGroupsTransport t = (JGroupsTransport) cm.getGlobalComponentRegistry().getComponent(Transport.class); JChannel channel = t.getChannel(); try { DISCARD discard = new DISCARD(); discard.setDiscardAll(true); channel.getProtocolStack().insertProtocol(discard, ProtocolStack.Position.ABOVE, TP.class); } catch (Exception e) { log.warn("Problems inserting discard", e); throw new RuntimeException(e); } View view = View.create(channel.getAddress(), 100, channel.getAddress()); ((GMS) channel.getProtocolStack().findProtocol(GMS.class)).installView(view); } killCacheManagers(cacheManagers); }