blob: 5dc64562c347596fac373ccb5bdb63af36ef810b [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// @@@ 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