#define ENV_RTG_PORT "RMR_RTG_SVC" // the port we'll listen on for rtg connections (deprecated; see RTG_SVC and CTL_PORT)
#define ENV_RTG_ADDR "RMR_RTG_SVC" // the address we will connect to for route manager updates
#define ENV_SEED_RT "RMR_SEED_RT" // where we expect to find the name of the seed route table
+#define ENV_STASH_RT "RMR_STASH_RT" // location for the last Route Table received from the generator we snarfed and saved
#define ENV_SEED_MEMAP "RMR_SEED_MEMAP" // where we expect to find the name of the seed route table
#define ENV_RTG_RAW "RMR_RTG_ISRAW" // if > 0 we expect route table gen messages as raw (not sent from an RMr application)
#define ENV_VERBOSE_FILE "RMR_VCTL_FILE" // file where vlevel may be managed for some (non-time critical) functions
#define ENV_CTL_PORT "RMR_CTL_PORT" // route collector will listen here for control messages (4561 default)
#define ENV_RTREQ_FREA "RMR_RTREQ_FREQ" // frequency we will request route table updates when we want one (1-300 inclusive)
+
+#define ENV_AM_NAME "ALARM_MGR_SERVICE_NAME" // alarm manager env vars that we need
+#define ENV_AM_PORT "ALARM_MGR_SERVICE_PORT"
+
#define NO_FLAGS 0 // no flags to pass to a function
#define FL_NOTHREAD 0x01 // do not start an additional thread (must be 'user land' to support rtg
// internal flags, must be > than UFLAG_MASK
//#define IFL_....
+ // context flags
#define CFL_MTC_ENABLED 0x01 // multi-threaded call is enabled
#define CFL_NO_RTACK 0x02 // no route table ack needed when end received
-
- // context flags
-#define CTXFL_WARN 0x01 // ok to warn on stderr for some things that shouldn't happen
+#define CFL_WARN 0x04 // ok to warn on stderr for some things that shouldn't happen
+#define CFL_FULLRT 0x08 // set when we have received an initial full route table (prevent updates before one arrives)
// msg buffer flags
#define MFL_ZEROCOPY 0x01 // the message is an allocated zero copy message and can be sent.
#define HFL_SUBID 0x02 // subscription ID is populated
#define HFL_CALL_MSG 0x04 // msg sent via blocking call
+/*
+ Alarm action constants describe the type (e.g. dropping messages) and whether or not
+ this is a "raise" or "clear" action. Raise/clear is determined by the least significant
+ bit; 1 == raise.
+*/
+#define ALARM_RAISE 0x01
+#define ALARM_CLEAR 0x00
+#define ALARM_KIND(a) (a&ALARM_MASK)
+#define ALARM_DROPS 0x02
+#define ALARM_MASK 0xfffe
+
/*
Message header; interpreted by the other side, but never seen by
the user application.
The route table.
*/
typedef struct {
+ int error; // set if there was a problem building the table
void* hash; // hash table for msg type and meid.
void* ephash; // hash for endpoint references
int updates; // counter of update records received
int mupdates; // counter of meid update records received
int ref_count; // num threads currently using
- pthread_mutex_t* gate; // lock allowing update to ref counter
} route_table_t;
/*
#define RING_NONE 0 // no options
#define RING_RLOCK 0x01 // create/destroy the read lock on the ring
#define RING_WLOCK 0x02 // create/destroy the write lockk on the ring
+#define RING_FRLOCK 0x04 // read locking with no wait if locked option
+
+ // flag values
+#define RING_FL_FLOCK 0x01 // fast read lock (don't wait if locked when reading)
typedef struct ring {
uint16_t head; // index of the head of the ring (insert point)
uint16_t nelements; // number of elements in the ring
void** data; // the ring data (pointers to blobs of stuff)
int pfd; // event fd for the ring for epoll
+ int flags; // RING_FL_* constants
pthread_mutex_t* rgate; // read lock if used
pthread_mutex_t* wgate; // write lock if used
} ring_t;
static int ie_test( void* r, int i_factor, long inserts );
+// --- internal alarm generation ---------------------
+static void uta_alarm( void* vctx, int kind, int prob_id, char* info );
+static void uta_alarm_send( void* vctx, rmr_mbuf_t* msg );
+
// ----- route table generic static things ---------
static inline uint64_t build_rt_key( int32_t sub_id, int32_t mtype );
static void collect_things( void* st, void* entry, char const* name, void* thing, void* vthing_list );