2010-09-29 06:13:05 +04:00
/*
ctdb statistics code
Copyright ( C ) Ronnie Sahlberg 2010
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , see < http : //www.gnu.org/licenses/>.
*/
2015-10-26 08:50:46 +03:00
# include "replace.h"
# include "system/network.h"
# include "system/time.h"
# include <talloc.h>
# include <tevent.h>
# include "lib/util/debug.h"
# include "lib/util/samba_util.h"
# include "ctdb_private.h"
# include "ctdb_logging.h"
2010-09-29 06:13:05 +04:00
2015-10-26 08:50:09 +03:00
static void ctdb_statistics_update ( struct tevent_context * ev ,
struct tevent_timer * te ,
2010-09-29 06:13:05 +04:00
struct timeval t , void * p )
{
struct ctdb_context * ctdb = talloc_get_type ( p , struct ctdb_context ) ;
memmove ( & ctdb - > statistics_history [ 1 ] , & ctdb - > statistics_history [ 0 ] , ( MAX_STAT_HISTORY - 1 ) * sizeof ( struct ctdb_statistics ) ) ;
memcpy ( & ctdb - > statistics_history [ 0 ] , & ctdb - > statistics_current , sizeof ( struct ctdb_statistics ) ) ;
ctdb - > statistics_history [ 0 ] . statistics_current_time = timeval_current ( ) ;
bzero ( & ctdb - > statistics_current , sizeof ( struct ctdb_statistics ) ) ;
ctdb - > statistics_current . statistics_start_time = timeval_current ( ) ;
2015-10-26 08:50:09 +03:00
tevent_add_timer ( ctdb - > ev , ctdb ,
timeval_current_ofs ( ctdb - > tunable . stat_history_interval , 0 ) ,
ctdb_statistics_update , ctdb ) ;
2010-09-29 06:13:05 +04:00
}
int ctdb_statistics_init ( struct ctdb_context * ctdb )
{
bzero ( & ctdb - > statistics , sizeof ( struct ctdb_statistics ) ) ;
2010-11-15 08:30:44 +03:00
ctdb - > statistics . statistics_start_time = timeval_current ( ) ;
2010-09-29 06:13:05 +04:00
bzero ( & ctdb - > statistics_current , sizeof ( struct ctdb_statistics ) ) ;
ctdb - > statistics_current . statistics_start_time = timeval_current ( ) ;
bzero ( ctdb - > statistics_history , sizeof ( ctdb - > statistics_history ) ) ;
2015-10-26 08:50:09 +03:00
tevent_add_timer ( ctdb - > ev , ctdb ,
timeval_current_ofs ( ctdb - > tunable . stat_history_interval , 0 ) ,
ctdb_statistics_update , ctdb ) ;
2010-09-29 06:13:05 +04:00
return 0 ;
}
int32_t ctdb_control_get_stat_history ( struct ctdb_context * ctdb ,
2015-10-29 08:42:05 +03:00
struct ctdb_req_control_old * c ,
2010-09-29 06:13:05 +04:00
TDB_DATA * outdata )
{
int len ;
2011-11-11 07:06:21 +04:00
struct ctdb_statistics_wire * s ;
2010-09-29 06:13:05 +04:00
len = offsetof ( struct ctdb_statistics_wire , stats ) + MAX_STAT_HISTORY * sizeof ( struct ctdb_statistics ) ;
2011-11-11 07:06:21 +04:00
s = talloc_size ( outdata , len ) ;
if ( s = = NULL ) {
2010-09-29 06:13:05 +04:00
DEBUG ( DEBUG_ERR , ( __location__ " Failed to allocate statistics history structure \n " ) ) ;
return - 1 ;
}
2011-11-11 07:06:21 +04:00
s - > num = MAX_STAT_HISTORY ;
memcpy ( & s - > stats [ 0 ] , & ctdb - > statistics_history [ 0 ] , sizeof ( ctdb - > statistics_history ) ) ;
2010-09-29 06:13:05 +04:00
outdata - > dsize = len ;
2011-11-11 07:06:21 +04:00
outdata - > dptr = ( uint8_t * ) s ;
2010-09-29 06:13:05 +04:00
return 0 ;
}