windows-nt/Source/XPSP1/NT/base/cluster/service/mm/jrgp.h
2020-09-26 16:20:57 +08:00

266 lines
9 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _JRGP_H_
#define _JRGP_H_
#ifdef __TANDEM
#pragma columns 79
#pragma page "jrgp.h - T9050 - external declarations for Regroup Module"
#endif
/* @@@ START COPYRIGHT @@@
** Tandem Confidential: Need to Know only
** Copyright (c) 1995, Tandem Computers Incorporated
** Protected as an unpublished work.
** All Rights Reserved.
**
** The computer program listings, specifications, and documentation
** herein are the property of Tandem Computers Incorporated and shall
** not be reproduced, copied, disclosed, or used in whole or in part
** for any reason without the prior express written permission of
** Tandem Computers Incorporated.
**
** @@@ END COPYRIGHT @@@
**/
/*---------------------------------------------------------------------------
* This file (jrgp.h) contains all the type and function declarations exported
* by Regroup.
*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <jrgpos.h>
/* The following literals define the various events that may impinge
* upon the regroup algorithm main state.
*/
enum
{
RGP_EVT_POWERFAIL = 1,
RGP_EVT_NODE_UNREACHABLE = 2,
RGP_EVT_PHASE1_CLEANUP_DONE = 3,
RGP_EVT_PHASE2_CLEANUP_DONE = 4,
RGP_EVT_LATEPOLLPACKET = 5,
RGP_EVT_CLOCK_TICK = 6,
RGP_EVT_RECEIVED_PACKET = 7,
RGP_EVT_BANISH_NODE = 8,
RGP_EVT_IGNORE_MASK = 9
};
/* Detailed description of event codes:
* -----------------------------------
*
* RGP_EVT_POWERFAIL
*
* After a power failure, regroup must start or be restarted.
* This event can also be used when a power fail shout packet
* indicating a power failure is received from another node,
* even though our own node hasn't detected a power failure.
*
* RGP_EVT_NODE_UNREACHABLE
*
* When all paths to a node are down, the message system reports
* this event.
*
* RGP_EVT_PHASE1_CLEANUP_DONE,
* RGP_EVT_PHASE2_CLEANUP_DONE
*
* Regroup provides two phases for the message system or cluster manager
* to clean up messages on all nodes. The first phase of cleanup begins
* after regroup reports one or more node failures. The second phase
* begins when a node learns that all nodes have completed phase 1
* clean up.
*
* The message system or cluster manager on each node must inform
* regroup when the local cleanup for each phase is complete using
* the following events.
*
* The NSK message system uses phase 1 to cancel all incoming (server)
* messages and phase 2 to terminate all outgoing (requester) messages.
*
*
* The remaining events are for internal use by the Regroup algorithm.
* ------------------------------------------------------------------
*
* RGP_EVT_LATEPOLLPACKET
*
* When a node is late with its IamAlive messages, regroup must start a
* new round of regrouping.
*
* RGP_EVT_CLOCK_TICK
*
* Once regroup is active, it needs to get clock ticks at periodic
* intervals.
*
* RGP_EVT_RECEIVED_PACKET
*
* When a regroup packet arrives, it must be processed.
*
* RGP_EVT_BANISH_NODE
*
* When regroup is restarted with the reason RGP_EVT_BANISH_NODE,
* each node participating in this regroup event shall install the
* causing node into its Banished mask.
*
* RGP_EVT_IGNORE_MASK
*
* When regroup's ignore mask has changed, the reason code is set
* to RGP_EVT_IGNORE_MASK. This will allow UnpackIgnoreScreen routine
* to process causingnode and reason fields in a special way.
* If the reason is less than RGP_EVT_IGNORE_MASK, ignore mask is
* considered to be empty.
*/
/************************************************************************
* rgp_info_t (used to get and set regroup parameters)
* ---------------------------------------------------
* This structure is used to get the current regroup parameters in order to
* pass them to a new node being brought up. The structure can also be
* used to modify regroup timing parameters before a cluster is formed
* (that is, more than one node is booted).
*
* ___________________________________________________________
* wd0 | version |
* |___________________________________________________________|
* wd1 | seqnum |
* |___________________________________________________________|
* wd2 | a_tick | imalive_ticks |
* |_____________________________|_____________________________|
* wd3 | check_ticks | min_stage1_ticks |
* |_____________________________|_____________________________|
* wd4 | cluster | unused |
* |_____________________________|_____________________________|
*
*
* version - version# of this data structure
* seqnum - sequence number for coordinating regroup
* incidents between nodes
* a_tick - regroup clockperiod. in milliseconds.
* iamalive_ticks - # of regroup clock ticks between IamAlive
* messages
* check_ticks - # of imalive ticks by which at least 1 imalive must arrive
* min_stage1_ticks - precomputed to be (imalive_ticks*check_ticks)
* cluster - current cluster membership mask
*/
#ifdef __TANDEM
#pragma fieldalign shared8 rgpinfo
#endif /* __TANDEM */
typedef struct rgpinfo
{
uint32 version;
uint32 seqnum;
uint16 a_tick; /* in ms.== clockPeriod */
uint16 iamalive_ticks; /* number of ticks between imalive sends == sendHBRate */
uint16 check_ticks; /* number of imalive ticks before at least 1 imalive == rcvHBRate */
uint16 Min_Stage1_ticks; /* precomputed to be imalive_ticks*check_ticks */
cluster_t cluster;
} rgpinfo_t;
typedef struct rgpinfo *rgpinfo_p;
/*---------------------------------------------------------------------------*/
/* Routines exported by the Regroup Module
* ---------------------------------------
*
* These routine names are in upper case to enable them to be called from
* routines written in the PTAL language which is case insensitive and
* converts all symbols to upper case.
*/
_priv _resident extern int
RGP_ESTIMATE_MEMORY(void);
#define rgp_estimate_memory RGP_ESTIMATE_MEMORY
_priv _resident extern void
RGP_INIT(node_t this_node,
unsigned int num_nodes,
void *rgp_buffer,
int rgp_buflen,
rgp_msgsys_p rgp_msgsys_p);
#define rgp_init RGP_INIT
_priv _resident extern void
RGP_CLEANUP(void);
#define rgp_cleanup RGP_CLEANUP
_priv _resident extern uint32
RGP_SEQUENCE_NUMBER(void);
#define rgp_sequence_number RGP_SEQUENCE_NUMBER
_priv _resident extern int
RGP_GETRGPINFO(rgpinfo_t *rgpinfo);
#define rgp_getrgpinfo RGP_GETRGPINFO
_priv _resident extern int
RGP_SETRGPINFO(rgpinfo_t *rgpinfo);
#define rgp_setrgpinfo RGP_SETRGPINFO
_priv _resident extern void
RGP_START(void (*nodedown_callback)(cluster_t failed_nodes),
int (*select_cluster)(cluster_t cluster_choices[],
int num_clusters));
#define rgp_start RGP_START
_priv _resident extern int
RGP_ADD_NODE(node_t node);
#define rgp_add_node RGP_ADD_NODE
_priv _resident extern int
RGP_MONITOR_NODE(node_t node);
#define rgp_monitor_node RGP_MONITOR_NODE
_priv _resident extern int
RGP_REMOVE_NODE(node_t node);
#define rgp_remove_node RGP_REMOVE_NODE
_priv _resident extern int
RGP_IS_PERTURBED(void);
#define rgp_is_perturbed RGP_IS_PERTURBED
_priv _resident extern void
RGP_PERIODIC_CHECK(void);
#define rgp_periodic_check RGP_PERIODIC_CHECK
_priv _resident extern void
RGP_RECEIVED_PACKET(node_t node, void *packet, int packetlen);
#define rgp_received_packet RGP_RECEIVED_PACKET
_priv _resident extern void
RGP_EVENT_HANDLER_EX(int event, node_t causingnode, void* arg);
#define RGP_EVENT_HANDLER(_event, _causingnode) RGP_EVENT_HANDLER_EX(_event, _causingnode, NULL)
#define rgp_event_handler RGP_EVENT_HANDLER
/*---------------------------------------------------------------------------*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#if 0
History of changes to this file:
-------------------------------------------------------------------------
1995, December 13 F40:KSK0610 /*F40:KSK06102.1*/
This file is part of the portable Regroup Module used in the NonStop
Kernel (NSK) and Loosely Coupled UNIX (LCU) operating systems. There
are 10 files in the module - jrgp.h, jrgpos.h, wrgp.h, wrgpos.h,
srgpif.c, srgpos.c, srgpsm.c, srgputl.c, srgpcli.c and srgpsvr.c.
The last two are simulation files to test the Regroup Module on a
UNIX workstation in user mode with processes simulating processor nodes
and UDP datagrams used to send unacknowledged datagrams.
This file was first submitted for release into NSK on 12/13/95.
------------------------------------------------------------------------------
#endif /* 0 - change descriptions */
#endif /* _JRGP_H_ defined */