diff --git a/src/libpcp_pmda/src/dynamic.c b/src/libpcp_pmda/src/dynamic.c index 3d6e73d..daf3603 100644 --- a/src/libpcp_pmda/src/dynamic.c +++ b/src/libpcp_pmda/src/dynamic.c @@ -81,6 +81,9 @@ pmdaDynamicPMNS(const char *prefix, free(dynamic); return; } + + //fprintf(stderr, "Adding %s at location %d\n", prefix, dynamic_count); + dynamic[dynamic_count].prefix = prefix; dynamic[dynamic_count].prefixlen = strlen(prefix); dynamic[dynamic_count].nclusters = nclusters; @@ -103,7 +106,8 @@ pmdaDynamicLookupName(pmdaExt *pmda, const char *name) int i; for (i = 0; i < dynamic_count; i++) { - if (strncmp(name, dynamic[i].prefix, dynamic[i].prefixlen) == 0) { + if(strncmp(name, dynamic[i].prefix, dynamic[i].prefixlen) == 0) { + //fprintf(stderr, "pmdaDynamicLookupName found %s in %d\n", name, i); if (dynamic[i].pmnsupdate(pmda, &dynamic[i].pmns)) pmdaDynamicMetricTable(pmda); return dynamic[i].pmns; @@ -112,18 +116,55 @@ pmdaDynamicLookupName(pmdaExt *pmda, const char *name) return NULL; } +/* + * Verify if a given pmid should be handled by this dynamic instance. + * Assumes pmnsupdate has been called so dynamic[index].pmns can't be NULL + */ + +int +pmdaDynamicCheckPMID( pmID pmid, int index ) +{ + + int numfound=0; + char **nameset; + + pmdaNameSpace *tree = dynamic[index].pmns; + //__pmDumpNameNode(stderr, tree->root, 1); + numfound = pmdaTreeName(tree, pmid, &nameset); + + int domain = pmid_domain(pmid); + int cluster = pmid_cluster(pmid); + int item = pmid_item(pmid); + + fprintf(stderr, "Check: %d.%d.%d In: %d Result: %d\n", domain, cluster, item, index, numfound); + + /* Don't need the names, just seeing if its there */ + + if( numfound > 0 ){ + free(nameset); + return numfound; + } + + return 0; + +} + pmdaNameSpace * pmdaDynamicLookupPMID(pmdaExt *pmda, pmID pmid) { - int i, j, cluster; + int i, j, cluster, sts; for (i = 0; i < dynamic_count; i++) { cluster = dynamic_pmid_cluster(i, pmid); for (j = 0; j < dynamic[i].nclusters; j++) { if (cluster == dynamic[i].clusters[j]) { - if (dynamic[i].pmnsupdate(pmda, &dynamic[i].pmns)) - pmdaDynamicMetricTable(pmda); - return dynamic[i].pmns; + /* Need to do this in all cases to be able to search the pmns */ + sts = dynamic[i].pmnsupdate(pmda, &dynamic[i].pmns); + if( pmdaDynamicCheckPMID( pmid, i ) ){ + if(sts) + pmdaDynamicMetricTable(pmda); + return dynamic[i].pmns; + } } } } @@ -139,7 +180,11 @@ pmdaDynamicLookupText(pmID pmid, int type, char **buf, pmdaExt *pmda) int cluster = dynamic_pmid_cluster(i, pmid); for (j = 0; j < dynamic[i].nclusters; j++) if (cluster == dynamic[i].clusters[j]) - return dynamic[i].textupdate(pmda, pmid, type, buf); + /* Need to do this in all cases to be able to search the pmns */ + dynamic[i].pmnsupdate(pmda, &dynamic[i].pmns); + if( pmdaDynamicCheckPMID( pmid, i ) ){ + return dynamic[i].textupdate(pmda, pmid, type, buf); + } } return -ENOENT; } @@ -150,19 +195,25 @@ pmdaDynamicLookupText(pmID pmid, int type, char **buf, pmdaExt *pmda) * which needs to be filled in. All a bit obscure, really. */ static pmdaMetric * -dynamic_metric_table(int index, pmdaMetric *offset) +dynamic_metric_table(int index, pmdaMetric *offset, pmdaExt *pmda) { struct dynamic *dp = &dynamic[index]; int m, tree_count = dp->extratrees; + int sts=0; for (m = 0; m < dp->nmetrics; m++) { pmdaMetric *mp = &dp->metrics[m]; int cluster = dynamic_pmid_cluster(index, mp->m_desc.pmid); int c, gid; - for (c = 0; c < dp->nclusters; c++) - if (dp->clusters[c] == cluster) - break; + for (c = 0; c < dp->nclusters; c++){ + if (dp->clusters[c] == cluster){ + /* Need to do this in all cases to be able to search the pmns */ + sts = dp->pmnsupdate(pmda, &dp->pmns); + if( pmdaDynamicCheckPMID( mp->m_desc.pmid, index ) ) + break; + } + } if (c < dp->nclusters) for (gid = 0; gid < tree_count; gid++) dp->mtabupdate(mp, offset++, gid + 1); @@ -209,7 +260,7 @@ fallback: memcpy(mtab, fixed, total * sizeof(pmdaMetric)); offset = mtab + total; for (i = 0; i < dynamic_count; i++) - offset = dynamic_metric_table(i, offset); + offset = dynamic_metric_table(i, offset, pmda); if (pmda->e_metrics != fixed) free(pmda->e_metrics); pmdaRehash(pmda, mtab, resize);