PERFORCE change 81218 for review
Victor Cruceru
soc-victor at FreeBSD.org
Sat Jul 30 23:11:15 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=81218
Change 81218 by soc-victor at soc-victor_82.76.158.176 on 2005/07/30 23:11:09
Added the SNMP instrumentation for hrDiskStorageTable (the very first version).
Updated the hrDeviceTable accordingly. Also fixed a bug in devd Unix socket
read part of hrDeviceTable code (zero length read means the devd process
is dead). hrDiskStorageTable's instrumentation needs many improvements.
Affected files ...
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/Makefile#14 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c#6 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c#1 add
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c#12 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h#16 edit
Differences ...
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/Makefile#14 (text+ko) ====
@@ -33,11 +33,12 @@
hostres_storage_tbl.c hostres_fs_tbl.c \
hostres_swrun_tbl.c hostres_swrunperf_tbl.c \
hostres_device_tbl.c \
- hostres_processor_tbl.c
+ hostres_processor_tbl.c \
+ hostres_diskstorage_tbl.c
WARNS?= 6
#Not having NDEBUG defined will enable assertions and a lot of output on stderr
-CFLAGS+= -DNDEBUG
+#CFLAGS+= -DNDEBUG
XSYM= host hrStorageOther hrStorageRam hrStorageVirtualMemory \
hrStorageFixedDisk hrStorageRemovableDisk hrStorageFloppyDisk \
hrStorageCompactDisc hrStorageRamDisk hrStorageFlashMemory \
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c#6 (text+ko) ====
@@ -42,9 +42,15 @@
#include <unistd.h>
#include <errno.h>
-/*just a prototype*/
+/*some prototypes*/
int hr_device_collector(struct devinfo_dev *dev, void *arg);
+void
+hrDeviceTblEntry_delete_v( struct hrDeviceTblEntry* entry );
+
+struct hrDeviceTblEntry *
+hrDeviceTblEntry_find_by_index(int32_t idx);
+
static
struct hrDeviceTblEntry*
hrDeviceTblEntry_create( const struct devinfo_dev *dev_p) {
@@ -126,7 +132,7 @@
}
-static
+
void
hrDeviceTblEntry_delete_v( struct hrDeviceTblEntry* entry ) {
struct deviceNameMapEntry *map;
@@ -158,7 +164,7 @@
return (NULL);
}
-static
+
struct hrDeviceTblEntry *
hrDeviceTblEntry_find_by_index(int32_t idx) {
@@ -316,8 +322,9 @@
/*mark each entry as missing*/
- TAILQ_FOREACH(entry, &hrState_g.hr_device_tbl, link)
+ TAILQ_FOREACH(entry, &hrState_g.hr_device_tbl, link) {
entry->flags &= ~HR_DEVICE_FOUND;
+ }
hrDevice_OS_get_devices_v();
@@ -327,7 +334,7 @@
entry = TAILQ_FIRST(&hrState_g.hr_device_tbl);
while (entry != NULL) {
entry_tmp = TAILQ_NEXT(entry, link);
- if (!(entry->flags & HR_DEVICE_FOUND))
+ if (!(entry->flags & HR_DEVICE_FOUND) && !(entry->flags & HR_DEVICE_IMMUTABLE) )
hrDeviceTblEntry_delete_v(entry);
entry = entry_tmp;
}
@@ -340,7 +347,10 @@
devinfo_free();
hrState_g.dev_root = NULL;
-
+ /*
+ * Force a refresh for the hrDiskStorageTable
+ */
+ refresh_DiskStorage_tbl_v();
HR_DPRINTF((stderr, "%s: refresh DONE\n ",__func__));
}
@@ -390,7 +400,18 @@
}
} else if (read_len == 0) {
- syslog(LOG_ERR,"zero bytes read from devd pipe....");
+ syslog(LOG_ERR,"zero bytes read from devd pipe....closing socket! ");
+ if (close(hrState_g.devd_sock) < 0 ){
+ syslog(LOG_ERR,"Failed to close the devd socket: %m");
+ }
+ hrState_g.devd_sock = -1;
+ if (hrState_g.devd_fd != NULL) {
+ fd_deselect(hrState_g.devd_fd);
+ hrState_g.devd_fd = NULL;
+ }
+ syslog(LOG_ERR,"Closing devd_fd, revert to devinfo polling");
+
+
} else {
switch(buf[0]){
case '+':
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c#12 (text+ko) ====
@@ -120,17 +120,23 @@
hrState_g.ccpu = 0;
TAILQ_INIT(&hrState_g.hr_processor_tbl);
+ /*data structure initialization for hrDiskStorageTable*/
+ TAILQ_INIT(&hrState_g.hr_disk_storage_tbl);
+ hrState_g.disk_list = NULL;
+ hrState_g.disk_list_len = 0;
+
hrState_g.hr_storage_tick = 0;
hrState_g.hr_fs_tick = 0;
hrState_g.hr_swrun_tick = 0;
hrState_g.hr_device_tick = 0;
hrState_g.hr_processor_tick = 0;
+ hrState_g.hr_disk_storage_tick = 0;
hrState_g.hrStorage_tbl_age = 0;
hrState_g.hrFS_tbl_age = 0;
hrState_g.hrSWRun_tbl_age = 0;
hrState_g.hrDevice_tbl_age = 0;
-
+ hrState_g.hrDiskStorage_age = 0;
init_hrStorage_tbl_v();
init_hrFS_tbl_v();
@@ -139,16 +145,7 @@
init_hrDevice_tbl_v();
init_hrProcessor_tbl_v();
- /*
- * Start the cpu stats collector
- * The semantics of timer_start parameters is in "SNMP ticks";
- * we have 100 "SNMP ticks" per second, thus we are trying below
- * to get MAX_CPU_SAMPLES per minute
- */
-
- hrState_g.cpus_load_timer =
- timer_start(100, 100*60/MAX_CPU_SAMPLES, get_cpus_samples, NULL, mod);
-
+ init_hrDiskStorage_tbl_v();
if ((hrState_g.devd_sock = create_devd_socket()) < 0) {
@@ -213,20 +210,22 @@
fini_hrStorage_tbl_v();
fini_hrFS_tbl_v();
fini_hrSWRun_tbl_v();
+ fini_hrProcessor_tbl_v();
+ fini_DiskStorage_tbl_v();
fini_hrDevice_tbl_v();
- fini_hrProcessor_tbl_v();
hrState_g.hr_storage_tick = 0;
hrState_g.hr_fs_tick = 0;
hrState_g.hr_swrun_tick = 0;
hrState_g.hr_device_tick = 0;
hrState_g.hr_processor_tick = 0;
+ hrState_g.hr_disk_storage_tick = 0;
hrState_g.hrStorage_tbl_age = 0;
hrState_g.hrFS_tbl_age = 0;
hrState_g.hrSWRun_tbl_age = 0;
hrState_g.hrDevice_tbl_age = 0;
-
+ hrState_g.hrDiskStorage_age = 0;
hrState_g.dev_root = NULL;
@@ -322,6 +321,17 @@
syslog(LOG_ERR, "fd_select failed on devd socket: %m");
}
}
+
+ /*
+ * Start the cpu stats collector
+ * The semantics of timer_start parameters is in "SNMP ticks";
+ * we have 100 "SNMP ticks" per second, thus we are trying below
+ * to get MAX_CPU_SAMPLES per minute
+ */
+
+ hrState_g.cpus_load_timer =
+ timer_start(100, 100*60/MAX_CPU_SAMPLES, get_cpus_samples, NULL, hostres_module);
+
HR_DPRINTF((stderr, "[%s] done.\n ", __func__));
}
@@ -369,14 +379,6 @@
}
-int op_hrDiskStorageTable(struct snmp_context *ctx __unused,
- struct snmp_value *value __unused,
- u_int sub __unused,
- u_int iidx __unused,
- enum snmp_op curr_op __unused)
-{
- return (SNMP_ERR_NOSUCHNAME);
-}
int op_hrPartitionTable(struct snmp_context *ctx __unused,
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h#16 (text+ko) ====
@@ -216,14 +216,45 @@
u_char cpu_no; /*which cpu, counted from 0*/
pid_t idle_pid; /*the PID of idle process for this CPU */
double samples[MAX_CPU_SAMPLES]; /*the samples from the last
- minutes, as required by MIB*/
+ minute, as required by MIB*/
uint32_t cur_sample_idx; /*current sample to fill in next time,
must be < MAX_CPU_SAMPLES*/
};
TAILQ_HEAD(processor_tbl, hrProcessorTblEntry);
+enum hrDiskStrorageAccess {
+ DS_READ_WRITE = 1,
+ DS_READ_ONLY = 2
+};
+enum hrDiskStrorageMedia {
+ DSM_OTHER = 1,
+ DSM_UNKNOWN = 2,
+ DSM_HARDDISK = 3,
+ DSM_FLOPPYDISK = 4,
+ DSM_OPTICALDISKROM= 5,
+ DSM_OPTICALDISKWORM= 6,
+ DSM_OPTICALDISKRW= 7,
+ DSM_RAMDISK = 8
+};
+
+struct hrDiskStorageTblEntry {
+ int32_t index;
+ int32_t access; /*enum hrDiskStrorageAccess */
+ int32_t media; /*enum hrDiskStrorageMedia*/
+ int32_t removable; /*enum snmpTCTruthValue*/
+ int32_t capacity;
+ TAILQ_ENTRY(hrDiskStorageTblEntry) link;
+ /*next items are not from the SNMP mib table, only to be used internally*/
+#define HR_DISKSTORAGE_FOUND 0x001
+ uint32_t flags;
+ uint64_t r_tick;
+
+};
+
+TAILQ_HEAD(disk_storage_tbl, hrDiskStorageTblEntry);
+
enum DeviceStatus {
DS_UNKNOWN = 1,
DR_RUNNING = 2,
@@ -245,7 +276,8 @@
int32_t status; /* one item from enum DeviceStatus, see above */
uint32_t errors;
-#define HR_DEVICE_FOUND 0x001
+#define HR_DEVICE_FOUND 0x001
+#define HR_DEVICE_IMMUTABLE 0x002 /* not dectected by libdevice, so don't try to refresh it*/
/*next 3 are not from the SNMP mib table, only to be used internally*/
uint32_t flags;
u_char name[32+1];
@@ -360,6 +392,16 @@
uint64_t hr_processor_tick; /*last (agent) tick when hrProcessorTable was updated */
void* cpus_load_timer; /*periodic time used to get cpu laod stats*/
+
+ /*
+ * next items are used for hrDiskStorageTable
+ */
+ struct
+ disk_storage_tbl hr_disk_storage_tbl; /*the head of the list with hrDiskStorageTable's entries */
+ uint64_t hr_disk_storage_tick;
+ time_t hrDiskStorage_age;
+ char* disk_list; /*returned by sysctl("kern.disks")*/
+ size_t disk_list_len;
};
@@ -446,12 +488,12 @@
hrSWRunTblEntry_find_by_index(int32_t idx);
/*
- * Init the things for both of hrSWRunTable an hrSWRunPerfTable
+ * Init the things for both of hrSWRunTable and hrSWRunPerfTable
*/
void init_hrSWRun_tbl_v(void);
/*
- * Finalization routine for both of hrSWRunTable an hrSWRunPerfTable
+ * Finalization routine for both of hrSWRunTable and hrSWRunPerfTable
* It destroys the lists and frees any allocated heap memory
*/
void fini_hrSWRun_tbl_v(void);
@@ -533,5 +575,28 @@
* Each CPU is "visited" MAX_CPU_SAMPLES times per one minute
*/
void get_cpus_samples(void*);
+
+/*
+ * Init the things for both of hrDiskStorageTable
+ */
+void init_hrDiskStorage_tbl_v(void);
+
+/*
+ * Finalization routine for hrDiskStorageTable
+ * It destroys the lists and frees any allocated heap memory
+ */
+void fini_DiskStorage_tbl_v(void);
+
+/*
+ * Next macro represents the number of seconds
+ * between two consecutive queries to the OS for getting the new data
+ */
+#define HR_DISKSTORAGE_TBL_REFRESH 3
+/*
+ * Refresh routine for hrDiskStorageTable
+ * Usable for polling the system for any changes.
+ */
+void refresh_DiskStorage_tbl_v(void);
+
#endif /*__HOSTRES_SNMP_H_INCLUDED__ */
More information about the p4-projects
mailing list