On Mon, 07 May 2018 11:44:59 -0500 Mark wrote: MF> The HOST-RESOURCES-MIB::hrSWInstalled support for FreeBSD pkg MF> stops working after so many queries and requires an snmpd MF> process restart. I have been observing this for quite some time MF> and have only recently started to debug it. The code in MF> question is at: MF> MF> agent/mibgroup/host/data_access/swinst_pkginfo.c MF> MF> When debugging I see it throw either: MF> MF> snmp_log( LOG_ERR, "SWInst: error initializing pkgng db\n" ); MF> MF> or MF> MF> snmp_log( LOG_ERR, "SWInst: error opening pkgng db\n" ); MF> MF> neither of which should be true as nothing on the system MF> changes. After seeing one of these for a few times there are no MF> further messages [...]
Can you run with "-Dswinst:load:arch --logTimestamp=yes", and then run "grep -i swinst" on the log file and send it? MF> Could anyone provide any possible insight or ideas on what MF> could be the issue here? I have compared the code with that MF> used internally in FreeBSD pkg tool and it's nearly identical. MF> The only thing that I felt was missing was declaring a readonly MF> lock on the database but even adding that into the snmp code MF> had no effect... There are quite a few places that don't clean up properly before returning, but that should only affect error paths. You can also try this patch to see if you get more useful debug info: diff --git a/agent/mibgroup/host/data_access/swinst_pkginfo.c b/agent/mibgroup/host/data_access/swinst_pkginfo.c index 861d79f0f..de2abf19b 100644 --- a/agent/mibgroup/host/data_access/swinst_pkginfo.c +++ b/agent/mibgroup/host/data_access/swinst_pkginfo.c @@ -118,12 +118,15 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) { snmp_log( LOG_ERR, "SWInst: error opening pkgng db\n" ); + pkg_shutdown(); return 1; } if (pkg_status(NULL) == PKG_STATUS_ACTIVE) { pkgng = 1; } else { + pkgdb_close(db); + pkg_shutdown(); snmp_log( LOG_INFO, "SWInst: not a pkgng system\n" ); } @@ -131,9 +134,12 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) if (pkgng) { if ((it = pkgdb_query(db, NULL, MATCH_ALL)) == NULL) { snmp_log( LOG_ERR, "SWInst: error querying pkgng db\n" ); + pkgdb_close(db); + pkg_shutdown(); return 1; } + DEBUGMSGTL(("swinst:load:arch"," pkgdb available\n")); while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC) == EPKG_OK) { pkg_snprintf(pkgname, sizeof(pkgname), "%n-%v", pkg, pkg); pkg_snprintf(pkgdate, sizeof(pkgdate), "%t", pkg); @@ -162,13 +168,18 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) } else { #endif /* HAVE_LIBPKG */ if ( !pkg_directory[0] ) { + NETSNMP_LOGONCE(LOG_ERR, "SWInst: no pkg_directory available\n"); return 1; /* Can't report installed packages if there isn't a list of them! */ } + DEBUGMSGTL(("swinst:load:arch"," pkgdb available\n")); d = opendir( pkg_directory ); - if (!d) + if (!d) { + snmp_log( LOG_ERR, "SWInst: error querying pkg_directory %s\n", + pkg_directory ); return 1; + } while ((dp = readdir(d)) != NULL) { if ( '.' == dp->d_name[0] ) ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders