Merge "Add ability to track send counts for an endpoint"
[ric-plt/lib/rmr.git] / src / rmr / common / src / rt_generic_static.c
index d51a44c..d65acdf 100644 (file)
@@ -60,7 +60,8 @@ typedef struct thing_list {
 // ---- debugging/testing -------------------------------------------------------------------------
 
 /*
-       Dump stats for an endpoint in the RT.
+       Dump some stats for an endpoint in the RT. This is generally called to
+       verify endpoints after a table load/change.
 */
 static void ep_stats( void* st, void* entry, char const* name, void* thing, void* vcounter ) {
        int*    counter;
@@ -74,7 +75,34 @@ static void ep_stats( void* st, void* entry, char const* name, void* thing, void
                (*counter)++;
        }
 
-       fprintf( stderr, "[DBUG] endpoint: %s open=%d\n", ep->name, ep->open );
+       fprintf( stderr, "[DBUG] RMR sends: target=%s open=%d\n", ep->name, ep->open );
+}
+
+/*
+       Dump counts for an endpoint in the RT. The vid parm is assumed to point to
+       the 'source' information and is added to each message.
+*/
+static void ep_counts( void* st, void* entry, char const* name, void* thing, void* vid ) {
+       endpoint_t* ep;
+       char*   id;
+
+       if( (ep = (endpoint_t *) thing) == NULL ) {
+               return;
+       }
+
+       if( (id = (char *) vid) == NULL ) {
+               id = "missing";
+       }
+
+       fprintf( stderr, "[INFO] RMR sends: ts=%lld src=%s target=%s open=%d succ=%lld fail=%lld (hard=%lld soft=%lld)\n", 
+               (long long) time( NULL ), 
+               id, 
+               ep->name, 
+               ep->open, 
+               ep->scounts[EPSC_GOOD], 
+               ep->scounts[EPSC_FAIL] + ep->scounts[EPSC_TRANS], 
+               ep->scounts[EPSC_FAIL], 
+               ep->scounts[EPSC_TRANS]   );
 }
 
 /*
@@ -124,6 +152,19 @@ static void  rt_stats( route_table_t* rt ) {
        free( counter );
 }
 
+/*
+       Given a route table, cause endpoint counters to be written to stderr. The id
+       parm is written as the "source" in the output.
+*/
+static void  rt_epcounts( route_table_t* rt, char* id ) {
+       if( rt == NULL ) {
+               fprintf( stderr, "[INFO] RMR endpoint: no counts: empty table\n" );
+               return;
+       }
+
+       rmr_sym_foreach_class( rt->hash, 1, ep_counts, id );            // run endpoints in the active table
+}
+
 
 // ------------------------------------------------------------------------------------------------
 /*
@@ -173,13 +214,14 @@ static char* ensure_nlterm( char* buf ) {
                }
        } else {
                if( buf[len-1] != '\n' ) {
-                       fprintf( stderr, "[WARN] rmr buf_check: input buffer was not newline terminated (file missing final \\n?)\n" );
+                       fprintf( stderr, "[WRN] rmr buf_check: input buffer was not newline terminated (file missing final \\n?)\n" );
                        if( (nb = (char *) malloc( sizeof( char ) * (len + 2) )) != NULL ) {
                                memcpy( nb, buf, len );
                                *(nb+len) = '\n';                       // insert \n and nil into the two extra bytes we allocated
                                *(nb+len+1) = 0;
-                               free( buf );
                        }       
+
+                       free( buf );
                }
        }
 
@@ -200,7 +242,7 @@ static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups
        }
 
        if( (rte = (rtable_ent_t *) malloc( sizeof( *rte ) )) == NULL ) {
-               fprintf( stderr, "rmr_add_rte: malloc failed for entry\n" );
+               fprintf( stderr, "[ERR] rmr_add_rte: malloc failed for entry\n" );
                return NULL;
        }
        memset( rte, 0, sizeof( *rte ) );
@@ -225,7 +267,7 @@ static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups
 
        rmr_sym_map( rt->hash, key, rte );                                                      // add to hash using numeric mtype as key
 
-       if( DEBUG ) fprintf( stderr, "[DBUG] route table entry created: k=%lx groups=%d\n", key, nrrgroups );
+       if( DEBUG ) fprintf( stderr, "[DBUG] route table entry created: k=%llx groups=%d\n", (long long) key, nrrgroups );
        return rte;
 }
 
@@ -541,8 +583,8 @@ static void read_static_rt( uta_ctx_t* ctx, int vlevel ) {
                if( (eor = strchr( rec, '\n' )) != NULL ) {
                        *eor = 0;
                } else {
-                       fprintf( stderr, "[WARN] rmr read_static: seed route table had malformed records (missing newline): %s\n", fname );
-                       fprintf( stderr, "[WARN] rmr read_static: seed route table not used: %s\n", fname );
+                       fprintf( stderr, "[WRN] rmr read_static: seed route table had malformed records (missing newline): %s\n", fname );
+                       fprintf( stderr, "[WRN] rmr read_static: seed route table not used: %s\n", fname );
                        free( fbuf );
                        return;
                }
@@ -847,14 +889,14 @@ static endpoint_t* rt_ensure_ep( route_table_t* rt, char const* ep_name ) {
        endpoint_t*     ep;
 
        if( !rt || !ep_name || ! *ep_name ) {
-               fprintf( stderr, "[WARN] rmr: rt_ensure:  internal mishap, something undefined rt=%p ep_name=%p\n", rt, ep_name );
+               fprintf( stderr, "[WRN] rmr: rt_ensure:  internal mishap, something undefined rt=%p ep_name=%p\n", rt, ep_name );
                errno = EINVAL;
                return NULL;
        }
 
        if( (ep = uta_get_ep( rt, ep_name )) == NULL ) {                                        // not there yet, make
                if( (ep = (endpoint_t *) malloc( sizeof( *ep ) )) == NULL ) {
-                       fprintf( stderr, "[WARN] rmr: rt_ensure:  malloc failed for endpoint creation: %s\n", ep_name );
+                       fprintf( stderr, "[WRN] rmr: rt_ensure:  malloc failed for endpoint creation: %s\n", ep_name );
                        errno = ENOMEM;
                        return NULL;
                }
@@ -863,6 +905,7 @@ static endpoint_t* rt_ensure_ep( route_table_t* rt, char const* ep_name ) {
                ep->addr = uta_h2ip( ep_name );
                ep->name = strdup( ep_name );
                pthread_mutex_init( &ep->gate, NULL );          // init with default attrs
+               memset( &ep->scounts[0], 0, sizeof( ep->scounts ) );
 
                rmr_sym_put( rt->hash, ep_name, 1, ep );
        }