-/* -*- 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 <pjkirner@clusterfs.com>
+ * 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 <pjkirner@clusterfs.com>
*/
#include <net-snmp/net-snmp-config.h>
#include <pthread.h>
#include "lustre-snmp.h"
+#define LNET_CHECK_INTERVAL 500
+
/*
* clusterFileSystems_variables_oid:
* this is the top level oid that we want to register under. This
{ 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 } },
/* 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 } },
{ 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 } },
};
/*****************************************************************************
case SYSVERSION:
sprintf(file_path, "%s%s", LUSTRE_PATH,"version");
- if( SUCCESS != read_string(file_path, string,sizeof(string)))
+ if( SUCCESS != read_string(file_path, (char *)string,sizeof(string)))
return NULL;
- *var_len = strlen(string);
+ *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( SUCCESS != read_string(file_path, (char *)string,sizeof(string)))
return NULL;
- *var_len = strlen(string);
+ *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( SUCCESS != read_string(file_path, (char *)string,sizeof(string)))
return NULL;
- *var_len = strlen(string);
+ *var_len = strlen((char*)string);
return (unsigned char *) string;
case SYSSTATUS:
LDLM_PATH,ldlm_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;
+ char file_path[MAX_PATH_SIZE];
+
+ /* 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) {
+ sprintf(file_path, "%s%s", LNET_PATH, "stats");
+ if (read_string(file_path, (char *) string, sizeof(string))
+ != SUCCESS)
+ return NULL;
+
+ 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;
+}
+
/*****************************************************************************
* Function: write_sysStatus
size_t name_len)
{
static long *long_ret;
- int size;
- int pid, new_value;
+ int new_value;
case RESERVE2:
- size = var_val_len;
long_ret = (long *) var_val;
}
return SNMP_ERR_NOERROR;
}
-