crossroads

Git mirror of https://crossroads.e-tunity.com/
git clone git://git.finwo.net/app/crossroads
Log | Files | Refs

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 }