1 /*
2    Copyright (c) 2003, 2021, Oracle and/or its affiliates.
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License, version 2.0,
6    as published by the Free Software Foundation.
7 
8    This program is also distributed with certain software (including
9    but not limited to OpenSSL) that is licensed under separate terms,
10    as designated in a particular file or component or in included license
11    documentation.  The authors of MySQL hereby grant you an additional
12    permission to link the program and your derivative works with the
13    separately licensed software that they have included with MySQL.
14 
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License, version 2.0, for more details.
19 
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
23 */
24 
25 #ifndef CHECKNODEGROUPS_H
26 #define CHECKNODEGROUPS_H
27 
28 #include <string.h>
29 #include <NodeBitmask.hpp>
30 #include "SignalData.hpp"
31 #include "SignalDataPrint.hpp"
32 
33 #define JAM_FILE_ID 190
34 
35 
36 /**
37  * Ask DIH to check if a node set can survive i.e. if it
38  * has at least one node in every node group.  Returns one
39  * of Win, Lose, Partitioning.
40  *
41  * Same class is used for REQ and CONF.  The REQ can also
42  * be executed as a direct signal.
43  */
44 class CheckNodeGroups {
45 public:
46   Uint32 blockRef;              // sender's node id
47   union {
48     Uint32 requestType;           // direct flag, output code
49     Uint32 output;
50   };
51 
52   union {
53     Uint32 nodeId;             // nodeId input for GetNodeGroupMembers
54     Uint32 extraNodeGroups;    // For GetDefaultFragments
55   };
56   NdbNodeBitmaskPOD mask;         /* set of NDB nodes, input for ArbitCheck,
57         			   * output for GetNodeGroupMembers
58 				   */
59   Uint32 senderData;            // Sender data, kept in return signal
60 
61   enum RequestType {
62     Direct              = 0x1,
63     ArbitCheck          = 0x2,
64     GetNodeGroup        = 0x4,
65     GetNodeGroupMembers = 0x8,
66     GetDefaultFragments = 0x10
67   };
68 
69   enum Output {
70     Lose = 1,                   // we cannot survive
71     Win = 2,                    // we and only we can survive
72     Partitioning = 3            // possible network partitioning
73   };
74 
75   STATIC_CONST( SignalLength = 4 + NdbNodeBitmask::Size );
76 };
77 
78 
79 #undef JAM_FILE_ID
80 
81 #endif
82