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

Reply via email to