markactivity.c (4056B)
1 /************************************************************************* 2 * This file is part of Crosroads 1.23, a load balancer and fail over 3 * utility for TCP. Copyright (c) Karel Kubat, distributed under GPL. 4 * Visit http://crossroads.e-tunity.com for information. 5 *************************************************************************/ 6 #include "crossroads.h" 7 8 void mark_activity (unsigned long long nbytes, double nsec, 9 Backendavail newstate) { 10 unsigned long long llval; 11 double dlval; 12 unsigned multiplier; 13 int i; 14 15 /* If we had a signal somewhere, don't update the values. 16 * If we don't have a back end yet, don't update the values. */ 17 if (interrupted || current_backend == -1) 18 return; 19 20 /* Update values. */ 21 lock_reporter(); 22 23 /* Handle the decays of all other back ends */ 24 for (i = 0; i < activeservice->nbackend; i++) { 25 if (i != current_backend && activeservice->backend[i].decay) { 26 if (activeservice->dispatchover) { 27 servicereport->backendstate[i].avg_nbytes *= 28 (100 - activeservice->backend[i].decay); 29 servicereport->backendstate[i].avg_nbytes /= 100; 30 servicereport->backendstate[i].avg_nsec *= 31 (100 - activeservice->backend[i].decay); 32 servicereport->backendstate[i].avg_nsec /= 100; 33 } else { 34 servicereport->backendstate[i].nbytes *= 35 (100 - activeservice->backend[i].decay); 36 servicereport->backendstate[i].nbytes /= 100; 37 servicereport->backendstate[i].nsec *= 38 (100 - activeservice->backend[i].decay); 39 servicereport->backendstate[i].nsec /= 100; 40 } 41 } 42 } 43 44 /* Update average seconds and bytes. */ 45 if (activeservice->dispatchover) { 46 multiplier = activeservice->dispatchover - 1; 47 if (servicereport->backendstate[current_backend].totuses < multiplier) 48 multiplier = servicereport->backendstate[current_backend].totuses; 49 50 dlval = servicereport->backendstate[current_backend].avg_nsec; 51 dlval *= multiplier; 52 dlval += nsec; 53 dlval /= (multiplier + 1); 54 servicereport->backendstate[current_backend].avg_nsec = dlval; 55 56 llval = servicereport->backendstate[current_backend].avg_nbytes; 57 llval *= multiplier; 58 llval += nbytes; 59 llval /= (multiplier + 1); 60 servicereport->backendstate[current_backend].avg_nbytes = llval; 61 } 62 63 /* Update total secs / bytes. */ 64 servicereport->backendstate[current_backend].nsec += nsec; 65 servicereport->backendstate[current_backend].nbytes += nbytes; 66 if (newstate == st_unavailable) 67 servicereport->backendstate[current_backend].failures++; 68 69 /* Set the state, unless it's already marked for wakeup or brought down. 70 * Do this only for 'final' states, not for intermediate. */ 71 if (newstate != st_intermediate) { 72 if (servicereport->backendstate[current_backend].avail != st_waking && 73 servicereport->backendstate[current_backend].avail != st_down) 74 servicereport->backendstate[current_backend].avail = newstate; 75 servicereport->backendstate[current_backend].totuses++; 76 } 77 78 /* Don't update servicereport beyond this point! */ 79 unlock_reporter(); 80 81 /* Give some feedback (though not during intermediate updates) */ 82 if (newstate != st_intermediate && program_stage != stage_retrying) 83 msg ("Service %s: updated stats for backend %d (%s): " 84 "hits=%lu, " 85 "fails=%lu, secs=%g, avgsecs=%g, " 86 "bytes=%llu, avgbytes=%lu, state=%s", 87 activeservice->name, 88 current_backend, activeservice->backend[current_backend].name, 89 servicereport->backendstate[current_backend].totuses, 90 servicereport->backendstate[current_backend].failures, 91 servicereport->backendstate[current_backend].nsec, 92 servicereport->backendstate[current_backend].avg_nsec, 93 servicereport->backendstate[current_backend].nbytes, 94 servicereport->backendstate[current_backend].avg_nbytes, 95 state_to_string 96 (servicereport->backendstate[current_backend].avail)); 97 98 /* Run the onfailure hook if one is specified. */ 99 if (newstate == st_unavailable) 100 sysrun (activeservice->backend[current_backend].onfail); 101 }