public virtual void castViewChange(View new_view, Digest digest) { Message view_change_msg; HDR hdr; Stack.NCacheLog.Debug("pb.GMS.castViewChange()", "mcasting view {" + new_view + "} (" + new_view.size() + " mbrs)\n"); if (new_view != null) new_view.BridgeSourceCacheId = impl.UniqueId; view_change_msg = new Message(); // bcast to all members hdr = new HDR(HDR.VIEW, new_view); hdr.digest = digest; view_change_msg.putHeader(HeaderType.GMS, hdr); view_change_msg.Dests = new_view.Members.Clone() as ArrayList; if(stack.NCacheLog.IsInfoEnabled) Stack.NCacheLog.Info("CastView.Watch", "Count of members: " + new_view.Members.Count.ToString()); //TODO: we need to handle scenario when we dont recive castView change from a node _promise = new ViewPromise(new_view.Members.Count); bool waitForViewAcknowledgement = true ; if (!new_view.containsMember(local_addr)) //i am leaving { waitForViewAcknowledgement = false; if (Stack.NCacheLog.IsInfoEnabled) Stack.NCacheLog.Info("GMS.castViewChange()", "I am coordinator and i am leaving"); passDown(new Event(Event.MSG, view_change_msg, Priority.Critical)); } else passDown(new Event(Event.MSG, view_change_msg, Priority.Critical)); if (waitForViewAcknowledgement) { _promise.WaitResult(_castViewChangeTimeOut); if (!_promise.AllResultsReceived()) //retry { view_change_msg.Dests = new_view.Members.Clone() as ArrayList; passDown(new Event(Event.MSG, view_change_msg, Priority.Critical)); _promise.WaitResult(_castViewChangeTimeOut); } if (_promise.AllResultsReceived()) { Stack.NCacheLog.CriticalInfo("GMS.castViewChange()", "View applied"); } } }