| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // @@@ START COPYRIGHT @@@ |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| // @@@ END COPYRIGHT @@@ |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef INTERNAL_H_ |
| #define INTERNAL_H_ |
| |
| enum InternalType |
| { |
| InternalType_Null // Noop |
| , InternalType_ActivateSpare // activate a spare node |
| , InternalType_Clone // Add clone process to monitor |
| , InternalType_Device // Add or Change device to monitor |
| , InternalType_Down // Node down |
| , InternalType_Dump // Dump process |
| , InternalType_DumpComplete // Dump process complete |
| , InternalType_Event // Send Event to process |
| , InternalType_Exit // Delete process for monitor |
| , InternalType_IoData // Stdin/Stdout data for a process |
| , InternalType_Kill // Kill monitored process |
| , InternalType_NameServerAdd // Add NameServer to configuration database |
| , InternalType_NameServerDelete // Delete NameServer from configuration database |
| , InternalType_NodeAdd // Add Node to configuration database |
| , InternalType_NodeAdded // Reload Node configuration and send node added notice |
| , InternalType_NodeDelete // Delete Node from configuration database |
| , InternalType_NodeDeleted // Reload Node configuration and send node deleted notice |
| , InternalType_NodeName // Node Name Change |
| , InternalType_Notify // Register for monitoring of process death |
| , InternalType_PersistAdd // Add persist template to configuration database |
| , InternalType_PersistDelete // Delete persist template from configuration database |
| , InternalType_Process // Add process to monitor |
| , InternalType_ProcessInit // Process fork completed |
| , InternalType_Open // Add open to monitor |
| , InternalType_Set // Add or change configuration key |
| , InternalType_StdinReq // Request stdin data via ancestor |
| , InternalType_Sync // Sync monitor for Bcast operation |
| , InternalType_Up // Node up |
| , InternalType_CreatePrimitives // Create primitive processes local request |
| // generated during monitor initialization |
| // it is never generated by remote monitor |
| , InternalType_Quiesce // Quiesce started |
| , InternalType_PostQuiece // Quiesce ended |
| , InternalType_Revive // Revive request |
| , InternalType_Snapshot // Snapshot request |
| , InternalType_UniqStr // Unique string |
| , InternalType_TmReady // DTM ready for transactions |
| , InternalType_Shutdown // Shutdown |
| , InternalType_SchedData // Processor & memory statistics |
| , InternalType_SoftNodeDown // Soft Node down (SQWatchdog not triggered) |
| , InternalType_SoftNodeUp // Soft Node up |
| }; |
| |
| enum SyncType |
| { |
| SyncType_NULL, // No sync requested |
| SyncType_TmData, // sync to exchange TM data amoung TMs |
| SyncType_TmSyncState // sync the current TmSync state across the cluster |
| }; |
| |
| enum SyncState |
| { |
| SyncState_Null, // No sync active |
| SyncState_Start, // Sync request started |
| SyncState_Continue, // Continue with sync on remote node |
| SyncState_Abort, // Sync Abort data |
| SyncState_Commit, // Sync Commit data |
| SyncState_Suspended // Sync Suspended (until spare goes active) |
| }; |
| |
| typedef enum { |
| State_Default=0, |
| State_Quiesce, // node quiesce state while going down |
| State_SoftDown, // node soft down on DTM abort -> restart |
| State_SoftUp, // node soft up on DTM restart |
| State_Ready_To_Exit |
| } IntNodeState; |
| |
| typedef unsigned long long upNode_t; |
| typedef struct |
| { |
| upNode_t upNodes[MAX_NODE_MASKS]; |
| } upNodes_t; |
| |
| typedef int Verifier_t; // Process verifier typedef |
| |
| struct clone_def |
| { |
| bool backup; // true for a backup process |
| bool unhooked; |
| bool event_messages; // true if wants to receive notices |
| bool system_messages; // true if wants to system messages |
| int nid; // node id of process |
| Verifier_t verifier; // verifier of the process |
| PROCESSTYPE type; // process handling catagory |
| int priority; // process priority |
| int parent_nid; // node id of parent process |
| int parent_pid; // process id of parent process |
| Verifier_t parent_verifier; // verifier of parent process |
| int os_pid; // native OS process id |
| pid_t prior_pid; // for restarted persistent process, the |
| // previous process id. Otherwise zero. |
| bool persistent; // persistent process or not |
| int persistent_retries; // number of times process has been restarted |
| int origPNidNs; // originating pnid |
| |
| int argc; // number of command line arguments |
| struct timespec creation_time; // process creation time |
| |
| #ifdef NAMESERVER_PROCESS |
| int pathLen; |
| int ldpathLen; |
| int programLen; |
| #else |
| strId_t pathStrId; // program lookup path (string id) |
| strId_t ldpathStrId; // library load path (string id) |
| strId_t programStrId; // full path to object file (string id) |
| #endif |
| |
| int nameLen; |
| int portLen; |
| int argvLen; |
| int infileLen; |
| int outfileLen; |
| char stringData; // variable length string data |
| }; |
| |
| struct device_def |
| { |
| char ldev_name[MAX_KEY_NAME]; // Logical device name |
| bool primary_mounted; // phyical primary device's mount state |
| bool mirror_mounted; // phyical mirror device's mount state |
| }; |
| |
| struct down_def |
| { |
| int pnid; // Physical node id |
| }; |
| |
| struct shutdown_def |
| { |
| int level; // shutdown level |
| }; |
| |
| struct dump_def |
| { |
| int nid; // Node id of process to dump |
| int pid; // Process id of process to dump |
| Verifier_t verifier; // verifier of the process to dump |
| int dumper_nid; // Requesting process's node id |
| int dumper_pid; // Requesting process's process id |
| Verifier_t dumper_verifier; // Requesting process's verifier |
| char core_file[MAX_PROCESS_PATH]; // target core path |
| DUMPSTATUS status; // completion status |
| }; |
| |
| struct exit_def |
| { |
| int nid; // Node id of process exiting |
| int pid; // Process id of process exiting |
| Verifier_t verifier; // Verifier of the process exiting |
| char name[MAX_PROCESS_NAME]; // Name of process exiting |
| bool abended; |
| }; |
| |
| struct exit_ns_def |
| { |
| int nid; // Node id of process exiting |
| int pid; // Process id of process exiting |
| Verifier_t verifier; // Verifier of the process exiting |
| char name[MAX_PROCESS_NAME]; // Name of process exiting |
| bool abended; |
| int sockFd; // monitor socket fd to reply |
| int origPNid; // pnid of nameserver which processed request |
| struct message_def *msg; // requester's request buffer to reply |
| }; |
| |
| struct event_def |
| { |
| int nid; // Nid id of process to receive event |
| int pid; // Process id of process to receive event |
| Verifier_t verifier; // Verifier of the process to receive event |
| int event_id; // Event id to send to nid,pid |
| int length; // Length in byte of Data buffer used |
| char data; // Data to be replicated across cluster |
| }; |
| |
| enum StdIoType |
| { |
| STDIN_DATA, |
| STDOUT_DATA |
| }; |
| |
| typedef struct |
| { |
| int nid; // Nid id of process to receive io data |
| int pid; // Process id of process to receive io data |
| Verifier_t verifier; // Verifier of the process to receive io data |
| StdIoType ioType; |
| int length; // Length in byte of Data buffer used |
| char data[MAX_SYNC_DATA]; // Data to be replicated across cluster |
| } ioData_t; |
| |
| enum StdinReqType |
| { |
| STDIN_REQ_DATA, |
| STDIN_FLOW_OFF, |
| STDIN_FLOW_ON |
| }; |
| |
| struct stdin_req_def |
| { |
| int nid; // Node id of process requesting stdin data |
| int pid; // Process id of process requesting stdin data |
| Verifier_t verifier; |
| StdinReqType reqType; |
| int supplier_nid; // Node id of process supplying stdin data |
| int supplier_pid; // Process id of process to supplying stdin data |
| }; |
| |
| struct kill_def |
| { |
| int nid; // Node id of process to kill |
| int pid; // Process id of process to kill |
| Verifier_t verifier; // Verifier of the process to kill |
| bool persistent_abort; // when true, persistent process is not restarted |
| // otherwise, it is ignored |
| }; |
| |
| struct nameserver_add_def |
| { |
| int req_nid; // Node id of requesting process |
| int req_pid; // Process id of requesting process |
| Verifier_t req_verifier; // Verifier of the requesting process |
| char node_name[MPI_MAX_PROCESSOR_NAME]; // Node's name |
| }; |
| |
| struct nameserver_delete_def |
| { |
| int req_nid; // Node id of requesting process |
| int req_pid; // Process id of requesting process |
| Verifier_t req_verifier; // Verifier of the requesting process |
| char node_name[MPI_MAX_PROCESSOR_NAME]; // Node's name |
| }; |
| |
| struct node_add_def |
| { |
| int req_nid; // Node id of requesting process |
| int req_pid; // Process id of requesting process |
| Verifier_t req_verifier; // Verifier of the requesting process |
| char node_name[MPI_MAX_PROCESSOR_NAME]; // Node's name |
| int first_core; // First or only core assigned |
| int last_core; // Last core assigned or -1 |
| int processors; // Number of processors in logical node |
| int roles; // Role assigment |
| }; |
| |
| struct node_added_def |
| { |
| int pnid; // Target pnid |
| }; |
| |
| struct node_delete_def |
| { |
| int req_nid; // Node id of requesting process |
| int req_pid; // Process id of requesting process |
| Verifier_t req_verifier; // Verifier of the requesting process |
| int pnid; // Target pnid |
| }; |
| |
| struct node_deleted_def |
| { |
| int pnid; // Target pnid |
| }; |
| |
| struct node_name_def |
| { |
| int req_nid; // Node id of requesting process |
| int req_pid; // Process id of requesting process |
| Verifier_t req_verifier; // Verifier of the requesting process |
| char current_name[MPI_MAX_PROCESSOR_NAME]; |
| char new_name[MPI_MAX_PROCESSOR_NAME]; |
| }; |
| |
| struct notify_def |
| { |
| int nid; // Node id of process being notified |
| int pid; // Process id of process being notified |
| Verifier_t verifier; // Verifier of the requesting process |
| int canceled; // If true, notice request has been canceled |
| int target_nid; // Node id of process being monitored |
| int target_pid; // Process id of process being monitored |
| Verifier_t target_verifier; // Verifier of the requesting process |
| _TM_Txid_External trans_id; // Associated TransID |
| }; |
| |
| struct process_def |
| { |
| bool backup; // true for a backup process |
| bool unhooked; |
| int nid; // node id of process |
| int pid; // process id |
| #ifdef NAMESERVER_PROCESS |
| Verifier_t verifier; // verifier |
| #endif |
| PROCESSTYPE type; // process handling catagory |
| int priority; // process priority |
| int parent_nid; // node id of parent process |
| int parent_pid; // process id of parent process |
| Verifier_t parent_verifier; // process id of parent process |
| int pair_parent_nid; // node id of real process pair parent process |
| int pair_parent_pid; // process id of real process pair parent process |
| Verifier_t pair_parent_verifier; // process id of real process pair parent process |
| int argc; // number of command line arguments |
| void *tag; // process tag |
| #ifdef NAMESERVER_PROCESS |
| int pathLen; |
| int ldpathLen; |
| int programLen; |
| #else |
| strId_t pathStrId; // program lookup path (string id) |
| strId_t ldpathStrId; // library load path (string id) |
| strId_t programStrId; // full path to object file (string id) |
| #endif |
| int nameLen; |
| int argvLen; |
| int infileLen; |
| int outfileLen; |
| char stringData; // variable length string data |
| }; |
| |
| struct process_init_def |
| { |
| int nid; // Node id of child process |
| int pid; // Process id of child process |
| Verifier_t verifier; // Verifier of child process |
| STATE state; |
| int origNid; // Node id where the "new process" request originated |
| int result; // zero if process created, error code otherwise |
| void *tag; // process tag sent with original "process" replication |
| char name[MAX_PROCESS_NAME]; // Name of child process |
| }; |
| |
| struct open_def |
| { |
| int nid; // Node id of process performing open |
| int pid; // Process id of process performing open |
| Verifier_t verifier; // verifier of the process performing open |
| int opened_nid; // Node id of process to be opened |
| int opened_pid; // Process id of process to be opened |
| Verifier_t opened_verifier; // verifier of the process to be opened |
| }; |
| |
| // Processor status for a given core |
| typedef struct |
| { |
| long long cpu_user; // Time in user mode |
| long long cpu_nice; // Time in user mode, low priority |
| long long cpu_system; // Time in system mode |
| long long cpu_idle; // Time in idle task |
| long long cpu_iowait; // Time waiting for i/o |
| long long cpu_irq; // Time in hardware interrupt |
| long long cpu_soft_irq; // Time in software interrupt |
| } ProcStat_t; |
| |
| #ifdef EXCHANGE_CPU_SCHEDULING_DATA |
| struct scheddata_def |
| { |
| int PNid; // Node ID of scheduling data |
| int processors; // Number of processors in node |
| unsigned int memory_total; // Node's total memory |
| unsigned int memory_free; // Node's current free memory |
| unsigned int swap_free; // Node's current free swap |
| unsigned int cache_free; // Node's current free buffer/cache |
| unsigned int memory_active; // Node's memory in active use |
| unsigned int memory_inactive; // Node's memory available for reclamation |
| unsigned int memory_dirty; // Node's memory waiting to be written to disk |
| unsigned int memory_writeback; // Node's memory being written to disk |
| unsigned int memory_VMallocUsed; // Node's amount of used virtual memory |
| ProcStat_t proc_stats[MAX_LNODES_PER_NODE]; // Per logical node processor statistics |
| unsigned int btime; // Node boot time |
| }; |
| #endif |
| |
| |
| struct set_def |
| { |
| ConfigType type; // type of group being set |
| char group[MAX_KEY_NAME]; // if type==ConfigType_Process then group's name. |
| char key[MAX_KEY_NAME]; // key name of the item being set |
| char valueData; // variable length string data |
| }; |
| |
| |
| struct spare_def |
| { |
| int down_pnid; // down node physical node id |
| int spare_pnid; // spare node physical node id |
| }; |
| |
| struct sync_def |
| { |
| SyncType type; // Coordination type |
| int pnid; // My Physical Node id |
| int syncnid; // TM's Logical Node driving the sync |
| int tmleader; // TM Leader's Logical Node id |
| SyncState state; // My current TM sync state |
| int count; // # of requests in data |
| int length; // data buffer length |
| char data[MAX_SYNC_DATA]; // Length/Data pairs to by replicated across cluster |
| }; |
| |
| struct up_def |
| { |
| int pnid; // Physical node id |
| }; |
| |
| struct uniqstr_def |
| { |
| int nid; |
| int id; |
| char valueData; // variable length string data |
| }; |
| |
| // Define a constant giving the "header" size of the internal_msg_def below |
| #define MSG_HDR_SIZE ( sizeof (InternalType) + sizeof (int) ) |
| |
| struct internal_msg_def |
| { |
| InternalType type; |
| int replSize; |
| union |
| { |
| struct clone_def clone; |
| struct device_def device; |
| struct down_def down; |
| struct dump_def dump; |
| struct exit_def exit; |
| struct exit_ns_def exit_ns; |
| struct event_def event; |
| ioData_t iodata; |
| struct kill_def kill; |
| struct nameserver_add_def nameserver_add; |
| struct nameserver_delete_def nameserver_delete; |
| struct node_add_def node_add; |
| struct node_added_def node_added; |
| struct node_delete_def node_delete; |
| struct node_deleted_def node_deleted; |
| struct node_name_def node_name; |
| struct notify_def notify; |
| struct process_def process; |
| struct process_init_def processInit; |
| struct open_def open; |
| struct set_def set; |
| struct stdin_req_def stdin_req; |
| struct sync_def sync; |
| struct up_def up; |
| struct spare_def activate_spare; |
| struct uniqstr_def uniqstr; |
| struct shutdown_def shutdown; |
| #ifdef EXCHANGE_CPU_SCHEDULING_DATA |
| struct scheddata_def scheddata; |
| #endif |
| char buffer[MAX_SYNC_SIZE-MSG_HDR_SIZE]; // Limit entire buffer to MAX_SYNC_SIZE |
| } u; |
| } __attribute__((__may_alias__)); |
| |
| typedef struct nodeId_s |
| { |
| char nodeName[MPI_MAX_PROCESSOR_NAME]; |
| char commPort[MPI_MAX_PORT_NAME]; |
| char syncPort[MPI_MAX_PORT_NAME]; |
| int pnid; |
| int creatorPNid; |
| int creatorShellPid; |
| Verifier_t creatorShellVerifier; |
| bool creator; // NEW monitor sets to true to tell creator it is the CREATOR |
| bool ping; // Monitor sets to true to tell remote monitor |
| // it is just checking that it can communicate with it. |
| // Used during allgather reconnect |
| int nsPid; // NS pid |
| int nsPNid; // NS better |
| } nodeId_t; |
| |
| typedef struct nodeStatus_s |
| { |
| STATE state; |
| int status; |
| } nodeStatus_t; |
| |
| typedef struct cluster_state_def |
| { |
| char node_state; |
| IntNodeState internalState; // internal state of a node |
| SyncState tmSyncState; // Node's current tm sync process state |
| ShutdownLevel sdLevel; // Node's current shutdown level |
| int change_nid; |
| unsigned long long seq_num; |
| upNodes_t nodeMask; // Set of nodes currently "up" |
| #ifdef NAMESERVER_PROCESS |
| int monConnCount; // monitor connections |
| #else |
| int monProcCount; // number of processes |
| #endif |
| } cluster_state_def_t; |
| |
| typedef struct msgInfo |
| { |
| int msg_count; // Number if messages to replicate |
| int msg_offset; // Current offset into the msg buffer |
| } msgInfo_t; |
| |
| struct sync_buffer_def |
| { |
| cluster_state_def_t nodeInfo; |
| msgInfo_t msgInfo; |
| char msg[MAX_SYNC_SIZE]; |
| }; |
| |
| typedef struct ptpMsgInfo |
| { |
| int pnid; // Current offset into the msg buffer |
| int size; // Number if messages to replicate |
| } ptpMsgInfo_t; |
| |
| #endif |