From: Florian G. <re...@us...> - 2007-12-08 21:25:29
|
Update of /cvsroot/perfparse/_perfparse/modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13206/modules Modified Files: libstorage.c storage_mysql.c Log Message: Rework periodic cleanup within storage module (perfparsed) Index: libstorage.c =================================================================== RCS file: /cvsroot/perfparse/_perfparse/modules/libstorage.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** libstorage.c 24 Aug 2006 11:31:59 -0000 1.2 --- libstorage.c 8 Dec 2007 21:25:30 -0000 1.3 *************** *** 3,8 **** * libstorage.c - Parse Nagios data and store in relational database. * ! * Copyright (c) 2004 Yves Mettier (yme...@li...) ! * * $Id$ * --- 3,9 ---- * libstorage.c - Parse Nagios data and store in relational database. * ! * Copyright (c) 2004-2007 Yves Mettier (yme...@li...) ! * Florian Gleixner ! * * $Id$ * *************** *** 36,40 **** * \brief Register a storage module * ! * The function storage_new hast to be called if a storage module * shall be initialized. * --- 37,41 ---- * \brief Register a storage module * ! * The function storage_new has to be called if a storage module * shall be initialized. * Index: storage_mysql.c =================================================================== RCS file: /cvsroot/perfparse/_perfparse/modules/storage_mysql.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** storage_mysql.c 6 Jun 2007 13:08:31 -0000 1.14 --- storage_mysql.c 8 Dec 2007 21:25:30 -0000 1.15 *************** *** 66,69 **** --- 66,73 ---- void storage_mysql_print_statistics(storage_module_t *, FILE*); void storage_mysql_print_usage(storage_module_t *this, FILE*fd, const char*id); + void storage_mysql_periodic_cleanup(storage_module_t *); + + void purge_all_metricid_data(int); + void purge_all_serviceid_data(int); static int validate_host(storage_module_t*this, const char *); *************** *** 105,108 **** --- 109,113 ---- sm->print_statistics = storage_mysql_print_statistics; sm->print_usage = storage_mysql_print_usage; + sm->periodic_cleanup = storage_mysql_periodic_cleanup; sm->enabled = 1; sm->params = malloc(sizeof(mysql_user_params_t)); *************** *** 126,132 **** /* Open MySQL */ now_connect(TRUE); ! #ifdef DEBUG ! printf("MySQL: %s\n", query_char("SELECT VERSION()")); ! #endif /* Setup binary trees */ --- 131,135 ---- /* Open MySQL */ now_connect(TRUE); ! pp_log(__FILE__,__LINE__,LOG_DEBUG,"MySQL version: %s\n", query_char("SELECT VERSION()")); /* Setup binary trees */ *************** *** 276,283 **** int storage_mysql_set_registry(storage_module_t *this, const char*hostname, const char*key, const char*value, time_t tm) { ! #ifdef DEBUG_REGISTRY ! printf("MY(set_registry) %ld '%s/%s' = '%s'\n", tm,hostname,key,value); ! #endif ! setRegistry(hostname, key, value, tm); --- 279,283 ---- int storage_mysql_set_registry(storage_module_t *this, const char*hostname, const char*key, const char*value, time_t tm) { ! pp_log(__FILE__,__LINE__,LOG_DEBUG,"setRegistry: %ld '%s/%s' = '%s'\n", tm,hostname,key,value); setRegistry(hostname, key, value, tm); *************** *** 356,359 **** --- 356,425 ---- } + void storage_mysql_periodic_cleanup(storage_module_t*this) { + /* delete all data of objects that are marked as deleted */ + GSList *tmplist2,*tmplist=NULL; + int *p=NULL; + + // connect again to mysql since this is a forked process + now_connect(TRUE); + pp_log(__FILE__,__LINE__,LOG_DEBUG,"MySQL version: %s\n", query_char("SELECT VERSION()")); + + // find metric ids to delete completely + g_string_printf(s_SQL, "SELECT metric_id from perfdata_service_metric where is_deleted=1"); + query(s_SQL->str); + + while ((result_row = mysql_fetch_row(query_result))) { + p = (int *)malloc(sizeof(int)); + *p = iData(0); + pp_log(__FILE__,__LINE__,LOG_DEBUG,"metric_id %d is marked for deletion\n",iData(0)); + tmplist=g_slist_append(tmplist,p); + } + + tmplist2=tmplist; + while(tmplist2) { + purge_all_metricid_data(*(int *)tmplist2->data); + tmplist2=g_slist_next(tmplist2); + } + + g_slist_free(tmplist); + tmplist2=tmplist=NULL; + + // find service ids to delete completely + g_string_printf(s_SQL, "SELECT service_id from perfdata_service where is_deleted=1"); + query(s_SQL->str); + + while ((result_row = mysql_fetch_row(query_result))) { + p = (int *)malloc(sizeof(int)); + *p = iData(0); + pp_log(__FILE__,__LINE__,LOG_DEBUG,"service_id %d is marked for deletion\n",iData(0)); + tmplist=g_slist_append(tmplist,p); + } + + tmplist2=tmplist; + while(tmplist2) { + purge_all_serviceid_data(*(int *)tmplist2->data); + tmplist2=g_slist_next(tmplist2); + } + + g_slist_free(tmplist); + tmplist2=tmplist=NULL; + + + /* walk through all services and metrics and purge old data */ + + // raw data + typedef struct struct_sid_policyinfo { + int iServiceId; + int iHostId; + char sPolicyName[21]; + int iPolicySeconds; + int iRawDelPolicy} sid_policyinfo; + + g_string_printf(s_SQL,"SELECT service_id,host_id,policy_name,delete_policy_seconds,raw_delete_policy_individual FROM perfdata_service s LEFT JOIN perfdata_delete_policy d ON s.raw_delete_policy_id=d.policy_id"); + + pp_log(__FILE__,__LINE__,LOG_DEBUG,"Closing mysql connection\n"); + mysql_close(&db_mysql); + } + /******************************************************** * *************** *** 362,365 **** --- 428,443 ---- *******************************************************/ + void purge_all_metricid_data(int iMid) { + pp_log(__FILE__,__LINE__,LOG_INFO,"Deleting all data from metric id %d\n",iMid); + g_string_printf(s_SQL,"DELETE from perfdata_service_bin WHERE metric_id=%d",iMid); + query_no_return(s_SQL->str); + } + + void purge_all_serviceid_data(int iSid) { + pp_log(__FILE__,__LINE__,LOG_INFO,"Deleting all data from service id %d\n",iSid); + g_string_printf(s_SQL,"DELETE from perfdata_service_raw WHERE service_id=%d",iSid); + query_no_return(s_SQL->str); + } + /******************************************************** |