--- ../lustre-1.6.2/snmp/Lustre-MIB.txt 2008-01-17 09:04:04.000000000 +0100 +++ ./snmp/Lustre-MIB.txt 2008-01-22 10:28:54.000000000 +0100 @@ -439,6 +439,13 @@ mddFreeFiles OBJECT-TYPE "The number of unused files on a Meta Data Device." ::= { mddEntry 7 } +mdsNbSampledReq OBJECT-TYPE + SYNTAX Counter64 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of sampled requests ." + ::= { metaDataServers 3 } --============================================================================ -- diff -upr ../lustre-1.6.2/snmp/lustre-snmp.c ./snmp/lustre-snmp.c --- ../lustre-1.6.2/snmp/lustre-snmp.c 2005-07-14 23:00:40.000000000 +0200 +++ ./snmp/lustre-snmp.c 2008-01-22 10:30:26.000000000 +0100 @@ -88,6 +88,7 @@ struct variable7 clusterFileSystems_vari { MDDFREECAPACITY , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,5 } }, { MDDFILES , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,6 } }, { MDDFREEFILES , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,7 } }, + { MDSNBSAMPLEDREQ , ASN_COUNTER64 , RONLY , var_mdsNbSampledReq, 4, { 2,1,4,3 } }, /* metaDataClients 2.1.5 */ { MDCNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,5,1 } }, @@ -511,6 +512,36 @@ var_ldlmTable(struct variable *vp, /***************************************************************************** + * Function: var_mdsNbSampledReq + * + ****************************************************************************/ +unsigned char * +var_mdsNbSampledReq(struct variable *vp, + oid *name, + size_t *length, + int exact, + size_t *var_len, + WriteMethod **write_method) +{ + unsigned long long nb_sample=0,min=0,max=0,sum=0,sum_square=0; + static counter64 c64; + + if (header_generic(vp,name,length,exact,var_len,write_method) + == MATCH_FAILED ) + return NULL; + + if( mds_stats_values(STR_REQ_WAITIME,&nb_sample,&min,&max,&sum,&sum_square) == ERROR) return NULL; + + c64.low = (u_long) (0x0FFFFFFFF & nb_sample); + nb_sample >>= 32; + c64.high = (u_long) (0x0FFFFFFFF & nb_sample); + + *var_len = sizeof(c64); + return (unsigned char *) &c64; +} + + +/***************************************************************************** * Function: write_sysStatus * ****************************************************************************/ diff -upr ../lustre-1.6.2/snmp/lustre-snmp.h ./snmp/lustre-snmp.h --- ../lustre-1.6.2/snmp/lustre-snmp.h 2005-07-14 23:00:40.000000000 +0200 +++ ./snmp/lustre-snmp.h 2008-01-22 10:30:49.000000000 +0100 @@ -40,6 +40,7 @@ FindVarMethod var_mdcTable; FindVarMethod var_cliTable; FindVarMethod var_ldlmTable; FindVarMethod var_lovTable; +FindVarMethod var_mdsNbSampledReq; WriteMethod write_sysStatus; #endif /* LUSTRE_SNMP_H */ diff -upr ../lustre-1.6.2/snmp/lustre-snmp-util.c ./snmp/lustre-snmp-util.c --- ../lustre-1.6.2/snmp/lustre-snmp-util.c 2005-07-14 23:00:40.000000000 +0200 +++ ./snmp/lustre-snmp-util.c 2008-01-22 10:39:57.000000000 +0100 @@ -39,6 +39,7 @@ #include #include #include +#include #include "lustre-snmp-util.h" /********************************************************************* @@ -650,3 +651,99 @@ cleanup_and_exit: return ret_val; }; +/************************************************************************** + * Function: stats_values + * + * Description: Setup nb_sample, min, max, sum and sum_square stats values + for name_value from filepath. + * + * Input: filepath, name_value, + * pointer to nb_sample, min, max, sum, sum_square + * + * Output: SUCCESS or ERROR on failure + * + **************************************************************************/ +int stats_values(char * filepath,char * name_value, unsigned long long * nb_sample, unsigned long long * min, unsigned long long * max, unsigned long long * sum, unsigned long long * sum_square) +{ + FILE * statfile; + char line[MAX_LINE_SIZE]; + int nbReadValues = 0; + + if( (statfile=fopen(filepath,"r")) == NULL) { + report("stats_value() failed to open %s",filepath); + return ERROR; + } +/*find the good line for name_value*/ + do { + if( fgets(line,MAX_LINE_SIZE,statfile) == NULL ) { + report("stats_values() failed to find %s values in %s stat_file",name_value,statfile); + goto error_out; + } + } while ( strstr(line,name_value) == NULL ); +/*get stats*/ + if((nbReadValues=sscanf(line,"%*s %llu %*s %*s %llu %llu %llu %llu",nb_sample,min,max,sum,sum_square)) == 5) { + goto success_out; + } else if( nbReadValues == 1 && *nb_sample == 0) { + *min = *max = *sum = *sum_square = 0; + goto success_out; + } else { + report("stats_values() failed to read stats_values for %s value in %s stat_file",name_value,statfile); + goto error_out; + } + +success_out : + fclose(statfile); + return SUCCESS; +error_out : + fclose(statfile); + return ERROR; +} + +/************************************************************************** + * Function: mds_stats_values + * + * Description: Setup nb_sample, min, max, sum and sum_square stats values + for mds stats name_value . + * + * Input: name_value, + * pointer to nb_sample, min, max, sum, sum_square + * + * Output: SUCCESS or ERROR on failure + * + **************************************************************************/ +extern int mds_stats_values(char * name_value, unsigned long long * nb_sample, unsigned long long * min, unsigned long long * max, unsigned long long * sum, unsigned long long * sum_square) +{ + unsigned long long tmp_nb_sample=0,tmp_min=0,tmp_max=0,tmp_sum=0,tmp_sum_square=0; +/*we parse the three MDS stat files and sum values*/ + if( stats_values(FILEPATH_MDS_SERVER_STATS,name_value,&tmp_nb_sample,&tmp_min,&tmp_max,&tmp_sum,&tmp_sum_square) == ERROR ) { + return ERROR; + } else { + *nb_sample=tmp_nb_sample; + *min=tmp_min; + *max=tmp_max; + *sum=tmp_sum; + *sum_square=tmp_sum_square; + } + + if( stats_values(FILEPATH_MDS_SERVER_READPAGE_STATS,name_value,&tmp_nb_sample,&tmp_min,&tmp_max,&tmp_sum,&tmp_sum_square) == ERROR ) { + return ERROR; + } else { + *nb_sample += tmp_nb_sample; + *min += tmp_min; + *max += tmp_max; + *sum += tmp_sum; + *sum_square += tmp_sum_square; + } + + if( stats_values(FILEPATH_MDS_SERVER_SETATTR_STATS,name_value,&tmp_nb_sample,&tmp_min,&tmp_max,&tmp_sum,&tmp_sum_square) == ERROR ) { + return ERROR; + } else { + *nb_sample += tmp_nb_sample; + *min += tmp_min; + *max += tmp_max; + *sum += tmp_sum; + *sum_square += tmp_sum_square; + } + + return SUCCESS; +} diff -upr ../lustre-1.6.2/snmp/lustre-snmp-util.h ./snmp/lustre-snmp-util.h --- ../lustre-1.6.2/snmp/lustre-snmp-util.h 2005-07-14 23:00:40.000000000 +0200 +++ ./snmp/lustre-snmp-util.h 2008-01-22 10:32:33.000000000 +0100 @@ -56,6 +56,7 @@ #define MDDFREECAPACITY 54 #define MDDFILES 55 #define MDDFREEFILES 56 +#define MDSNBSAMPLEDREQ 57 #define MDCNUMBER 60 #define MDCUUID 61 @@ -104,6 +105,9 @@ #define CLIENT_PATH LUSTRE_PATH "llite/" #define LOV_PATH LUSTRE_PATH "lov/" #define LDLM_PATH LUSTRE_PATH "ldlm/namespaces/" +#define FILEPATH_MDS_SERVER_STATS LUSTRE_PATH "mdt/MDS/mds/stats" +#define FILEPATH_MDS_SERVER_READPAGE_STATS LUSTRE_PATH "mdt/MDS/mds_readpage/stats" +#define FILEPATH_MDS_SERVER_SETATTR_STATS LUSTRE_PATH "mdt/MDS/mds_setattr/stats" /* Common procfs file entries that are refrenced in mulitple locations*/ #define FILENAME_SYSHEALTHCHECK "health_check" @@ -116,6 +120,7 @@ #define FILENAME_KBYTES_FREE "kbytesfree" #define FILENAME_FILES_TOTAL "filestotal" #define FILENAME_FILES_FREE "filesfree" +#define STR_REQ_WAITIME "req_waittime" /* strings which the file /var/lustre/sysStatus can hold */ #define STR_ONLINE "online" @@ -194,4 +199,7 @@ unsigned char * const char *path, struct oid_table *ptable); +int stats_values(char * filepath,char * name_value, unsigned long long * nb_sample, unsigned long long * min, unsigned long long * max, unsigned long long * sum, unsigned long long * sum_square); +extern int mds_stats_values(char * name_value, unsigned long long * nb_sample, unsigned long long * min, unsigned long long * max, unsigned long long * sum, unsigned long long * sum_square); + #endif /* LUSTRE_SNMP_UTIL_H */