Abstract: This version of the sender will perform verification on response
messages received back from the receiver.
- It is expected that the response messages are created with the
+ It is expected that the response messages are created with the
functions in the test_support module so that they can easily be
vetted here.
int stats_freq = 100;
int successful = 0; // set to true after we have a successful send
char wbuf[DATA_SIZE];
- char me[128]; // who I am to vet rts was actually from me
+ char me[256]; // who I am to vet rts was actually from me
char trace[1024];
long timeout = 0;
long rep_timeout = 0; // report/stats timeout
exit( 1 );
}
} else {
- fprintf( stderr, "<VSNDR> abort: epoll not supported, can't listen for messages\n" );
+ fprintf( stderr, "<VSNDR> abort: epoll not supported, can't listen for messages\n" );
}
sbuf = rmr_alloc_msg( mrc, MSG_SIZE ); // alloc first send buffer; subsequent buffers allcoated on send
sbuf = rmr_send_msg( mrc, sbuf ); // retry send until it's good (simple test; real programmes should do better)
}
if( sbuf->state == RMR_OK ) {
+ if( successful == 0 ) {
+ fail_count = 0; // reset on first good message out
+ }
successful = 1; // indicates only that we sent one successful message, not the current state
} else {
- if( successful ) {
- fail_count++; // count failures after first successful message
- }
- if( fail_count > 10 ) {
- fprintf( stderr, "too many failures\n" );
+ fail_count++; // count failures after first successful message
+ if( ! successful && fail_count > 10 ) {
+ fprintf( stderr, "[FAIL] too many send failures\n" );
exit( 1 );
}
}
default:
if( successful ) {
fail_count++; // count failures after first successful message
+ } else {
+ fail_count++;
+ if( fail_count > 10 ) {
+ fprintf( stderr, "<VSEND> giving up\n" );
+ exit( 1 );
+ }
}
// some error (not connected likely), don't count this
//sleep( 1 );
errno = 0;
rbuf = rmr_rcv_msg( mrc, rbuf );
if( rbuf && rbuf->state == RMR_OK ) {
- if( rmr_payload_size( rbuf ) > HDR_SIZE+DATA_SIZE ) { // verify that response has a larger payload than we should have sent
+ if( rmr_payload_size( rbuf ) >= HDR_SIZE+DATA_SIZE ) { // vet message
rts_ok += validate_msg( rbuf->payload, rbuf->len );
- } else {
+ } else {
+ fprintf( stderr, "<VSNDR> received short response: >%d expected, got %d\n", HDR_SIZE+DATA_SIZE, rmr_payload_size( rbuf ) );
short_count++;
}
+
rcvd_count++;
}
}
}
}
- timeout = time( NULL ) + 2; // allow 2 seconds for the pipe to drain from the receiver
+ timeout = time( NULL ) + 20; // allow 20 seconds for the pipe to drain from the receiver
while( time( NULL ) < timeout ) {
if( rcv_fd >= 0 ) {
while( (nready = epoll_wait( ep_fd, events, 1, 100 )) > 0 ) {
rbuf = rmr_rcv_msg( mrc, rbuf );
if( rbuf && rbuf->state == RMR_OK ) {
rcvd_count++;
- if( rmr_payload_size( rbuf ) > HDR_SIZE+DATA_SIZE ) { // verify that response has a larger payload than we should have sent
+ if( rmr_payload_size( rbuf ) >= HDR_SIZE+DATA_SIZE ) { // vet message
rts_ok += validate_msg( rbuf->payload, rbuf->len );
}
- timeout = time( NULL ) + 2;
+ timeout = time( NULL ) + 10;
}
}
}
}
}
- if( rcvd_count != rts_ok || count != nmsgs ) { // we might not receive all back if receiver didn't retry, so that is NOT a failure here
+ if( (rcvd_count != rts_ok) || (count != nmsgs) ) { // we might not receive all back if receiver didn't retry, so that is NOT a failure here
+ fprintf( stderr, "<VSNDR> recvd=%d rts_ok=%d short=%d count=%d nmsg=%d\n", rcvd_count, rts_ok, short_count, count, nmsgs );
pass = 0;
}