2121import java .util .Collection ;
2222import java .util .HashMap ;
2323import java .util .Iterator ;
24- import java .util .LinkedHashMap ;
2524import java .util .Map ;
2625import java .util .UUID ;
2726import org .apache .ignite .IgniteCheckedException ;
2827import org .apache .ignite .IgniteException ;
2928import org .apache .ignite .IgniteLogger ;
3029import org .apache .ignite .internal .GridComponent ;
30+ import org .apache .ignite .internal .Order ;
3131import org .apache .ignite .internal .util .typedef .X ;
3232import org .apache .ignite .internal .util .typedef .internal .U ;
3333import org .apache .ignite .marshaller .Marshaller ;
34+ import org .apache .ignite .plugin .extensions .communication .Message ;
3435import org .apache .ignite .spi .discovery .DiscoveryDataBag ;
36+ import org .apache .ignite .spi .discovery .tcp .messages .NodeSpecificData ;
3537
3638import static org .apache .ignite .internal .GridComponent .DiscoveryDataExchangeType .CONTINUOUS_PROC ;
3739
3840/**
3941 * Carries discovery data in marshalled form
4042 * and allows convenient way of converting it to and from {@link DiscoveryDataBag} objects.
4143 */
42- public class DiscoveryDataPacket implements Serializable {
43- /** Local file header signature(read as a little-endian number). */
44- private static int ZIP_HEADER_SIGNATURE = 0x04034b50 ;
44+ public class DiscoveryDataPacket implements Serializable , Message {
45+ /** Local file header signature (read as a little-endian number). */
46+ private static final int ZIP_HEADER_SIGNATURE = 0x04034b50 ;
4547
4648 /** */
4749 private static final long serialVersionUID = 0L ;
4850
4951 /** */
50- private final UUID joiningNodeId ;
52+ @ Order (0 )
53+ private UUID joiningNodeId ;
5154
5255 /** */
56+ @ Order (1 )
5357 private Map <Integer , byte []> joiningNodeData = new HashMap <>();
5458
5559 /** */
5660 private transient Map <Integer , Serializable > unmarshalledJoiningNodeData ;
5761
5862 /** */
63+ @ Order (2 )
5964 private Map <Integer , byte []> commonData = new HashMap <>();
6065
6166 /** */
62- private Map <UUID , Map <Integer , byte []>> nodeSpecificData = new LinkedHashMap <>();
67+ @ Order (3 )
68+ private Map <UUID , NodeSpecificData > nodeSpecificData = new HashMap <>();
6369
6470 /** */
6571 private transient boolean joiningNodeClient ;
6672
73+ /** Constructor. */
74+ public DiscoveryDataPacket () {
75+ // No-op.
76+ }
77+
6778 /**
6879 * @param joiningNodeId Joining node id.
6980 */
@@ -78,6 +89,55 @@ public UUID joiningNodeId() {
7889 return joiningNodeId ;
7990 }
8091
92+ /**
93+ * @param joiningNodeId Joining node ID.
94+ */
95+ public void joiningNodeId (UUID joiningNodeId ) {
96+ this .joiningNodeId = joiningNodeId ;
97+ }
98+
99+ /**
100+ * @return Joining node data.
101+ */
102+ public Map <Integer , byte []> joiningNodeData () {
103+ return joiningNodeData ;
104+ }
105+
106+ /**
107+ * @param joiningNodeData Joining node data.
108+ */
109+ public void joiningNodeData (Map <Integer , byte []> joiningNodeData ) {
110+ this .joiningNodeData = joiningNodeData ;
111+ }
112+
113+ /**
114+ * @return Common data.
115+ */
116+ public Map <Integer , byte []> commonData () {
117+ return commonData ;
118+ }
119+
120+ /**
121+ * @param commonData Common data.
122+ */
123+ public void commonData (Map <Integer , byte []> commonData ) {
124+ this .commonData = commonData ;
125+ }
126+
127+ /**
128+ * @return Node specific data.
129+ */
130+ public Map <UUID , NodeSpecificData > nodeSpecificData () {
131+ return nodeSpecificData ;
132+ }
133+
134+ /**
135+ * @param nodeSpecificData New node specific data.
136+ */
137+ public void nodeSpecificData (Map <UUID , NodeSpecificData > nodeSpecificData ) {
138+ this .nodeSpecificData = nodeSpecificData ;
139+ }
140+
81141 /**
82142 * @param bag Bag.
83143 * @param nodeId Node id.
@@ -98,7 +158,7 @@ public void marshalGridNodeData(DiscoveryDataBag bag, UUID nodeId, Marshaller ma
98158 filterDuplicatedData (marshLocNodeSpecificData );
99159
100160 if (!marshLocNodeSpecificData .isEmpty ())
101- nodeSpecificData .put (nodeId , marshLocNodeSpecificData );
161+ nodeSpecificData .put (nodeId , new NodeSpecificData ( marshLocNodeSpecificData ) );
102162 }
103163 }
104164
@@ -132,8 +192,11 @@ public DiscoveryDataBag unmarshalGridData(
132192 if (nodeSpecificData != null && !nodeSpecificData .isEmpty ()) {
133193 Map <UUID , Map <Integer , Serializable >> unmarshNodeSpecData = U .newLinkedHashMap (nodeSpecificData .size ());
134194
135- for (Map .Entry <UUID , Map <Integer , byte []>> nodeBinEntry : nodeSpecificData .entrySet ()) {
136- Map <Integer , byte []> nodeBinData = nodeBinEntry .getValue ();
195+ for (Map .Entry <UUID , NodeSpecificData > nodeBinEntry : nodeSpecificData .entrySet ()) {
196+ if (nodeBinEntry .getValue () == null )
197+ continue ;
198+
199+ Map <Integer , byte []> nodeBinData = nodeBinEntry .getValue ().nodeSpecificData ();
137200
138201 if (nodeBinData == null || nodeBinData .isEmpty ())
139202 continue ;
@@ -260,12 +323,17 @@ public boolean mergeDataFrom(
260323 }
261324
262325 if (nodeSpecificData .size () != mrgdSpecifDataKeys .size ()) {
263- for (Map .Entry <UUID , Map < Integer , byte []> > e : nodeSpecificData .entrySet ()) {
326+ for (Map .Entry <UUID , NodeSpecificData > e : nodeSpecificData .entrySet ()) {
264327 if (!mrgdSpecifDataKeys .contains (e .getKey ())) {
265- Map < Integer , byte []> data = existingDataPacket .nodeSpecificData .get (e .getKey ());
328+ NodeSpecificData dataMsg = existingDataPacket .nodeSpecificData .get (e .getKey ());
266329
267- if (data != null && mapsEqual (e .getValue (), data )) {
268- e .setValue (data );
330+ if (dataMsg == null )
331+ continue ;
332+
333+ Map <Integer , byte []> data = dataMsg .nodeSpecificData ();
334+
335+ if (data != null && mapsEqual (e .getValue ().nodeSpecificData (), data )) {
336+ e .setValue (new NodeSpecificData (data ));
269337
270338 boolean add = mrgdSpecifDataKeys .add (e .getKey ());
271339
@@ -310,7 +378,7 @@ private boolean mapsEqual(Map<Integer, byte[]> m1, Map<Integer, byte[]> m2) {
310378 * @param clientNode Client node.
311379 * @param log Logger.
312380 * @param panic Throw unmarshalling if {@code true}.
313- * @throws IgniteCheckedException If {@code panic} is {@true } and unmarshalling failed.
381+ * @throws IgniteCheckedException If {@code panic} is {@code True } and unmarshalling failed.
314382 */
315383 private Map <Integer , Serializable > unmarshalData (
316384 Map <Integer , byte []> src ,
@@ -358,11 +426,11 @@ else if (binEntry.getKey() < GridComponent.DiscoveryDataExchangeType.VALUES.leng
358426 }
359427
360428 /**
361- * @param value Value to check.
429+ * @param val Value to check.
362430 * @return {@code true} if value is zipped.
363431 */
364- private boolean isZipped (byte [] value ) {
365- return value != null && value .length > 3 && makeInt (value ) == ZIP_HEADER_SIGNATURE ;
432+ private boolean isZipped (byte [] val ) {
433+ return val != null && val .length > 3 && makeInt (val ) == ZIP_HEADER_SIGNATURE ;
366434 }
367435
368436 /**
@@ -391,7 +459,7 @@ private void marshalData(
391459 int compressionLevel ,
392460 IgniteLogger log
393461 ) {
394- //may happen if nothing was collected from components,
462+ // may happen if nothing was collected from components,
395463 // corresponding map (for common data or for node specific data) left null
396464 if (src == null )
397465 return ;
@@ -407,17 +475,17 @@ private void marshalData(
407475 }
408476 }
409477
410- /**
411- * TODO https://issues.apache.org/jira/browse/IGNITE-4435
412- */
478+ /** */
413479 private void filterDuplicatedData (Map <Integer , byte []> discoData ) {
414- for (Map < Integer , byte []> existingData : nodeSpecificData .values ()) {
480+ for (NodeSpecificData existingData : nodeSpecificData .values ()) {
415481 Iterator <Map .Entry <Integer , byte []>> it = discoData .entrySet ().iterator ();
416482
417483 while (it .hasNext ()) {
418484 Map .Entry <Integer , byte []> discoDataEntry = it .next ();
419485
420- byte [] curData = existingData .get (discoDataEntry .getKey ());
486+ byte [] curData = (existingData == null || existingData .nodeSpecificData () == null )
487+ ? null
488+ : existingData .nodeSpecificData ().get (discoDataEntry .getKey ());
421489
422490 if (Arrays .equals (curData , discoDataEntry .getValue ()))
423491 it .remove ();
@@ -454,4 +522,9 @@ public void joiningNodeClient(boolean joiningNodeClient) {
454522 public void clearUnmarshalledJoiningNodeData () {
455523 unmarshalledJoiningNodeData = null ;
456524 }
525+
526+ /** {@inheritDoc} */
527+ @ Override public short directType () {
528+ return -106 ;
529+ }
457530}
0 commit comments