X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=snmp%2Flustre-snmp.c;h=10d841d56d714aae557f0c8dc27e8ac6cb54b8b1;hp=0de2c4dda122a37d321e6483cc86fbcca3751769;hb=62e93ef9a29341091c49d66a1535ea243ea950be;hpb=c6bc5eb7d073d5a7b7d0934d92bfd8eab15fc825 diff --git a/snmp/lustre-snmp.c b/snmp/lustre-snmp.c index 0de2c4d..10d841d 100644 --- a/snmp/lustre-snmp.c +++ b/snmp/lustre-snmp.c @@ -1,23 +1,41 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START * - * Copyright (c) 2005 Cluster File Systems, Inc. - * Author: PJ Kirner + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of Lustre, http://www.lustre.org. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * Lustre 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 + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * snmp/lustre-snmp.c + * + * Author: PJ Kirner */ #include @@ -27,6 +45,10 @@ #include #include "lustre-snmp.h" +#include + +#define LNET_CHECK_INTERVAL 500 + /* * clusterFileSystems_variables_oid: * this is the top level oid that we want to register under. This @@ -88,6 +110,7 @@ struct variable7 clusterFileSystems_variables[] = { { 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 } }, @@ -116,7 +139,7 @@ struct variable7 clusterFileSystems_variables[] = { /* logicalObjectVolume 2.1.7 */ { LOVNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,7,1 } }, - /* logicalObjectVolume.osdTable.lovTable 2.1.2.2.1 */ + /* logicalObjectVolume.osdTable.lovTable 2.1.7.2.1 */ { LOVUUID , ASN_OCTET_STR , RONLY , var_lovTable, 6, { 2,1,7,2,1,2 } }, { LOVCOMMONNAME , ASN_OCTET_STR , RONLY , var_lovTable, 6, { 2,1,7,2,1,3 } }, { LOVNUMOBD , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,4 } }, @@ -139,6 +162,18 @@ struct variable7 clusterFileSystems_variables[] = { { LDLMUNUSEDLOCKCOUNT , ASN_UNSIGNED , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,4 } }, { LDLMRESOURCECOUNT , ASN_UNSIGNED , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,5 } }, + /* lnetInformation 2.1.9 */ + { LNETMSGSALLOC, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,1 } }, + { LNETMSGSMAX, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,2 } }, + { LNETERRORS, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,3 } }, + { LNETSENDCOUNT, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,4 } }, + { LNETRECVCOUNT, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,5 } }, + { LNETROUTECOUNT, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,6 } }, + { LNETDROPCOUNT, ASN_UNSIGNED, RONLY, var_lnetInformation, 4, { 2,1,9,7 } }, + { LNETSENDBYTES, ASN_COUNTER64, RONLY, var_lnetInformation, 4, { 2,1,9,8 } }, + { LNETRECVBYTES, ASN_COUNTER64, RONLY, var_lnetInformation, 4, { 2,1,9,9 } }, + { LNETROUTEBYTES, ASN_COUNTER64, RONLY, var_lnetInformation, 4, { 2,1,9,10 } }, + { LNETDROPBYTES, ASN_COUNTER64, RONLY, var_lnetInformation, 4, { 2,1,9,11 } }, }; /***************************************************************************** @@ -154,13 +189,14 @@ struct variable7 clusterFileSystems_variables[] = { void init_lustresnmp(void) { - /* register ourselves with the agent to handle our mib tree */ - REGISTER_MIB("clusterFileSystems", clusterFileSystems_variables, variable7, - clusterFileSystems_variables_oid); - - initilize_trap_handler(); + /* register ourselves with the agent to handle our mib tree */ + REGISTER_MIB("clusterFileSystems", + clusterFileSystems_variables, variable7, + clusterFileSystems_variables_oid); + + initialize_trap_handler(); - DEBUGMSGTL(("lsnmpd", "%s %s \n", __FUNCTION__, "Initialization Done")); + DEBUGMSGTL(("lsnmpd", "%s %s\n", __func__, "Initialization Done")); } /***************************************************************************** @@ -176,13 +212,14 @@ void init_lustresnmp(void) { void deinit_lustresnmp(void) { - /* deregister ourselves with the agent */ - unregister_mib(clusterFileSystems_variables_oid, - sizeof(clusterFileSystems_variables_oid)/sizeof(clusterFileSystems_variables_oid)); - - terminate_trap_handler(); - - DEBUGMSGTL(("lsnmpd", "%s %s \n", __FUNCTION__, "Termination Done")); + /* deregister ourselves with the agent */ + unregister_mib(clusterFileSystems_variables_oid, + sizeof(clusterFileSystems_variables_oid)/ + sizeof(clusterFileSystems_variables_oid)); + + terminate_trap_handler(); + + DEBUGMSGTL(("lsnmpd", "%s %s\n", __func__, "Termination Done")); } /***************************************************************************** @@ -203,7 +240,7 @@ var_clusterFileSystems(struct variable *vp, static long long_ret; static u_long ulong_ret; static unsigned char string[SPRINT_MAX_LEN]; - char file_path[MAX_PATH_SIZE]; + glob_t path; uint32_t num; char *dir_list; @@ -218,24 +255,36 @@ var_clusterFileSystems(struct variable *vp, switch(vp->magic) { case SYSVERSION: - sprintf(file_path, "%s%s", LUSTRE_PATH,"version"); - if( SUCCESS != read_string(file_path, string,sizeof(string))) + if (cfs_get_param_paths(&path, "version") != 0) return NULL; - *var_len = strlen(string); + if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){ + cfs_free_param_data(&path); + return NULL; + } + cfs_free_param_data(&path); + *var_len = strlen((char *)string); return (unsigned char *) string; case SYSKERNELVERSION: - sprintf(file_path, "%s%s", LUSTRE_PATH,"kernel_version"); - if( SUCCESS != read_string(file_path, string,sizeof(string))) + if (cfs_get_param_paths(&path, "kernel_version") != 0) + return NULL; + if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){ + cfs_free_param_data(&path); return NULL; - *var_len = strlen(string); + } + cfs_free_param_data(&path); + *var_len = strlen((char *)string); return (unsigned char *) string; case SYSHEALTHCHECK: - sprintf(file_path, "%s%s", LUSTRE_PATH,FILENAME_SYSHEALTHCHECK); - if( SUCCESS != read_string(file_path, string,sizeof(string))) + if (cfs_get_param_paths(&path, "health_check") != 0) return NULL; - *var_len = strlen(string); + if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){ + cfs_free_param_data(&path); + return NULL; + } + cfs_free_param_data(&path); + *var_len = strlen((char*)string); return (unsigned char *) string; case SYSSTATUS: @@ -246,57 +295,92 @@ var_clusterFileSystems(struct variable *vp, return NULL; case OSDNUMBER: - if( 0 == (dir_list = get_file_list(OSD_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "obdfilter") != 0) + return NULL; + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",OSD_PATH,num)); + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case OSCNUMBER: - if( 0 == (dir_list = get_file_list(OSC_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "osc") != 0) return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",OSC_PATH,num)); + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); + return NULL; + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case MDDNUMBER: - if( 0 == (dir_list = get_file_list(MDS_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "mds") != 0) + return NULL; + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",MDS_PATH,num)); + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case MDCNUMBER: - if( 0 == (dir_list = get_file_list(MDC_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "mdc") != 0) return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",MDC_PATH,num)); + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); + return NULL; + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case CLIMOUNTNUMBER: - if( 0 == (dir_list = get_file_list(CLIENT_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "llite") != 0) + return NULL; + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",CLIENT_PATH,num)); + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case LOVNUMBER: - if( 0 == (dir_list = get_file_list(LOV_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "lov") != 0) return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",LOV_PATH,num)); + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); + return NULL; + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; case LDLMNUMBER: - if( 0 == (dir_list = get_file_list(LDLM_PATH, DIR_TYPE, &num))) + if (cfs_get_param_paths(&path, "ldlm/namespaces") != 0) + return NULL; + if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){ + cfs_free_param_data(&path); return NULL; - DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",LDLM_PATH,num)); + } + DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num)); + cfs_free_param_data(&path); ulong_ret = num; free(dir_list); return (unsigned char *) &ulong_ret; @@ -331,8 +415,16 @@ var_osdTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - OSD_PATH,osd_table); + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "obdfilter") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; } struct oid_table osc_table[] = @@ -359,8 +451,16 @@ var_oscTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - OSC_PATH,osc_table); + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "osc") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; } struct oid_table mds_table[] = @@ -386,8 +486,16 @@ var_mdsTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - MDS_PATH,mds_table); + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "mds") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; } struct oid_table mdc_table[] = @@ -415,10 +523,17 @@ var_mdcTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - MDC_PATH,mdc_table); -} + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "mdc") != 0) + return NULL; + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; +} struct oid_table cli_table[] = { @@ -444,10 +559,17 @@ var_cliTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - CLIENT_PATH,cli_table); -} + unsigned char *table; + glob_t path; + if (cfs_get_param_paths(&path, "llite") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; +} struct oid_table lov_table[] = { @@ -479,8 +601,16 @@ var_lovTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - LOV_PATH,lov_table); + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "lov") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; } struct oid_table ldlm_table[] = @@ -505,8 +635,139 @@ var_ldlmTable(struct variable *vp, size_t *var_len, WriteMethod **write_method) { - return var_genericTable(vp,name,length,exact,var_len,write_method, - LDLM_PATH,ldlm_table); + unsigned char *table; + glob_t path; + + if (cfs_get_param_paths(&path, "ldlm/namespaces") != 0) + return NULL; + + table = var_genericTable(vp,name,length,exact,var_len,write_method, + path.gl_pathv[0],osd_table); + cfs_free_param_data(&path); + return table; +} + +/***************************************************************************** + * Function: var_lnetInformation + * + ****************************************************************************/ +unsigned char * +var_lnetInformation(struct variable *vp, + oid *name, + size_t *length, + int exact, + size_t *var_len, + WriteMethod **write_method) +{ + /* variables we may use later */ + static unsigned char string[SPRINT_MAX_LEN]; + static unsigned int i[7]; + static unsigned long long ull[4]; + static unsigned long next_update; + static counter64 c64; + static unsigned int c32; + struct timeval current_tv; + unsigned long current; + glob_t file_path; + + /* Update at most every LNET_STATS_INTERVAL milliseconds */ + gettimeofday(¤t_tv, NULL); + current = current_tv.tv_sec * 1000000 + current_tv.tv_usec; + if (current >= next_update) { + if (cfs_get_param_paths(&file_path, "stats") != 0) + return NULL; + if (read_string(file_path.gl_pathv[0], (char *) string, sizeof(string)) + != SUCCESS) { + cfs_free_param_data(&file_path); + return NULL; + } + cfs_free_param_data(&file_path); + + sscanf((char *) string, + "%u %u %u %u %u %u %u %llu %llu %llu %llu", + &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], + &ull[0], &ull[1], &ull[2], &ull[3]); + + next_update = current + (LNET_CHECK_INTERVAL * 1000); + } + + if (header_generic(vp, name, length, exact, var_len, write_method) + == MATCH_FAILED) + return NULL; + + switch (vp->magic) { + case LNETMSGSALLOC: + *var_len = sizeof(c32); + c32 = i[0]; + return (unsigned char *) &c32; + case LNETMSGSMAX: + *var_len = sizeof(c32); + c32 = i[1]; + return (unsigned char *) &c32; + case LNETERRORS: + *var_len = sizeof(c32); + c32 = i[2]; + return (unsigned char *) &c32; + case LNETSENDCOUNT: + *var_len = sizeof(c32); + c32 = i[3]; + return (unsigned char *) &c32; + case LNETRECVCOUNT: + *var_len = sizeof(c32); + c32 = i[4]; + return (unsigned char *) &c32; + case LNETROUTECOUNT: + *var_len = sizeof(c32); + c32 = i[5]; + return (unsigned char *) &c32; + case LNETDROPCOUNT: + *var_len = sizeof(c32); + c32 = i[6]; + return (unsigned char *) &c32; + case LNETSENDBYTES: + convert_ull(&c64, ull[0], var_len); + return (unsigned char *) &c64; + case LNETRECVBYTES: + convert_ull(&c64, ull[1], var_len); + return (unsigned char *) &c64; + case LNETROUTEBYTES: + convert_ull(&c64, ull[2], var_len); + return (unsigned char *) &c64; + case LNETDROPBYTES: + convert_ull(&c64, ull[3], var_len); + return (unsigned char *) &c64; + default: + return NULL; + } +} + +/***************************************************************************** + * 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; } @@ -524,8 +785,7 @@ write_sysStatus(int action, size_t name_len) { static long *long_ret; - int size; - int pid, new_value; + int new_value; @@ -550,7 +810,6 @@ write_sysStatus(int action, case RESERVE2: - size = var_val_len; long_ret = (long *) var_val; @@ -598,4 +857,3 @@ write_sysStatus(int action, } return SNMP_ERR_NOERROR; } -