/// <summary> /// Refresh projection nodes. /// </summary> /// <returns>Nodes.</returns> private IList <IClusterNode> RefreshNodes() { long oldTopVer = Interlocked.Read(ref _topVer); List <IClusterNode> newNodes = null; DoOutInOp(OpNodes, writer => { writer.WriteLong(oldTopVer); }, input => { PortableReaderImpl reader = Marshaller.StartUnmarshal(input); if (reader.ReadBoolean()) { // Topology has been updated. long newTopVer = reader.ReadLong(); newNodes = IgniteUtils.ReadNodes(reader, _pred); UpdateTopology(newTopVer, newNodes); } }); if (newNodes != null) { return(newNodes); } // No topology changes. Debug.Assert(_nodes != null, "At least one topology update should have occurred."); return(_nodes); }