Blame SOURCES/redhat-bugzilla-1973833.patch

5469b2
commit 6b907e90c74fce82d6b712493d8b362bdd1a1ec1
5469b2
Author: Nathan Scott <nathans@redhat.com>
5469b2
Date:   Tue Dec 14 08:54:14 2021 +1100
5469b2
5469b2
    pmlogconf: switch to the bulk pmLookupDescs(3) interface
5469b2
    
5469b2
    No functional change, all existing regression tests pass.
5469b2
    
5469b2
    Related to Red Hat BZ #1973833.
5469b2
5469b2
diff --git a/src/pmlogconf/pmlogconf.c b/src/pmlogconf/pmlogconf.c
5469b2
index fa1156859d..ef4fc08bbd 100644
5469b2
--- a/src/pmlogconf/pmlogconf.c
5469b2
+++ b/src/pmlogconf/pmlogconf.c
5469b2
@@ -473,13 +473,19 @@ fetch_groups(void)
5469b2
 {
5469b2
     static pmResult	*result;
5469b2
     const char		**names;
5469b2
+    pmDesc		*descs;
5469b2
     pmID		*pmids;
5469b2
-    int			i, n, sts;
5469b2
+    int			i, n, sts, count;
5469b2
 
5469b2
-    /* prepare arrays of names and identifiers for PMAPI metric lookup */
5469b2
+    /* prepare arrays of names, descriptors and IDs for PMAPI metric lookup */
5469b2
     if ((names = calloc(ngroups, sizeof(char *))) == NULL)
5469b2
 	return -ENOMEM;
5469b2
+    if ((descs = calloc(ngroups, sizeof(pmDesc))) == NULL) {
5469b2
+	free(names);
5469b2
+	return -ENOMEM;
5469b2
+    }
5469b2
     if ((pmids = calloc(ngroups, sizeof(pmID))) == NULL) {
5469b2
+	free(descs);
5469b2
 	free(names);
5469b2
 	return -ENOMEM;
5469b2
     }
5469b2
@@ -490,15 +496,16 @@ fetch_groups(void)
5469b2
 	    continue;
5469b2
 	names[n++] = (const char *)groups[i].metric;
5469b2
     }
5469b2
+    count = n;
5469b2
 
5469b2
-    if ((sts = pmLookupName(n, names, pmids)) < 0) {
5469b2
-	if (n == 1)
5469b2
+    if ((sts = pmLookupName(count, names, pmids)) < 0) {
5469b2
+	if (count == 1)
5469b2
 	    groups[0].pmid = PM_ID_NULL;
5469b2
 	else
5469b2
 	    fprintf(stderr, "%s: cannot lookup metric names: %s\n",
5469b2
 			    pmGetProgname(), pmErrStr(sts));
5469b2
     }
5469b2
-    else if ((sts = pmFetch(n, pmids, &result)) < 0) {
5469b2
+    else if ((sts = pmFetch(count, pmids, &result)) < 0) {
5469b2
 	fprintf(stderr, "%s: cannot fetch metric values: %s\n",
5469b2
 			pmGetProgname(), pmErrStr(sts));
5469b2
     }
5469b2
@@ -510,6 +517,13 @@ fetch_groups(void)
5469b2
 	    else
5469b2
 		groups[i].pmid = pmids[n++];
5469b2
 	}
5469b2
+	/* descriptor lookup, descs_hash handles failure here */
5469b2
+	(void) pmLookupDescs(count, pmids, descs);
5469b2
+
5469b2
+	/* create a hash over the descs for quick PMID lookup */
5469b2
+	if ((sts = descs_hash(count, descs)) < 0)
5469b2
+	    fprintf(stderr, "%s: cannot hash metric descs: %s\n",
5469b2
+			    pmGetProgname(), pmErrStr(sts));
5469b2
 	/* create a hash over the result for quick PMID lookup */
5469b2
 	if ((sts = values_hash(result)) < 0)
5469b2
 	    fprintf(stderr, "%s: cannot hash metric values: %s\n",
5469b2
@@ -806,14 +820,16 @@ evaluate_string_regexp(group_t *group, regex_cmp_t compare)
5469b2
     int			i, found;
5469b2
     pmValueSet		*vsp;
5469b2
     pmValue		*vp;
5469b2
+    pmDesc		*dp;
5469b2
     pmAtomValue		atom;
5469b2
     regex_t		regex;
5469b2
     int			sts, type;
5469b2
 
5469b2
-    if ((vsp = metric_values(group->pmid)) == NULL)
5469b2
+    if ((vsp = metric_values(group->pmid)) == NULL ||
5469b2
+        (dp = metric_desc(group->pmid)) == NULL)
5469b2
 	return 0;
5469b2
 
5469b2
-    type = metric_type(group->pmid);
5469b2
+    type = dp->type;
5469b2
     if (type < 0 || type > PM_TYPE_STRING) {
5469b2
 	fprintf(stderr, "%s: %s uses regular expression on non-scalar metric\n",
5469b2
 		pmGetProgname(), group->tag);
5469b2
@@ -849,11 +865,14 @@ evaluate_string_regexp(group_t *group, regex_cmp_t compare)
5469b2
 static int
5469b2
 evaluate_values(group_t *group, numeric_cmp_t ncmp, string_cmp_t scmp)
5469b2
 {
5469b2
-    int			type = metric_type(group->pmid);
5469b2
+    pmDesc		*dp;
5469b2
+
5469b2
+    if ((dp = metric_desc(group->pmid)) == NULL)
5469b2
+	return 0;
5469b2
 
5469b2
-    if (type == PM_TYPE_STRING)
5469b2
+    if (dp->type == PM_TYPE_STRING)
5469b2
 	return evaluate_string_values(group, scmp);
5469b2
-    return evaluate_number_values(group, type, ncmp);
5469b2
+    return evaluate_number_values(group, dp->type, ncmp);
5469b2
 }
5469b2
 
5469b2
 int
5469b2
diff --git a/src/pmlogconf/util.c b/src/pmlogconf/util.c
5469b2
index d44c2e529a..293eb2eca3 100644
5469b2
--- a/src/pmlogconf/util.c
5469b2
+++ b/src/pmlogconf/util.c
5469b2
@@ -1,5 +1,5 @@
5469b2
 /*
5469b2
- * Copyright (c) 2020 Red Hat.  All Rights Reserved.
5469b2
+ * Copyright (c) 2020-2021 Red Hat.  All Rights Reserved.
5469b2
  * 
5469b2
  * This program is free software; you can redistribute it and/or modify it
5469b2
  * under the terms of the GNU General Public License as published by the
5469b2
@@ -14,7 +14,7 @@
5469b2
 #include "util.h"
5469b2
 
5469b2
 static __pmHashCtl	valuesctl;	/* pointers to values in pmResult */
5469b2
-static __pmHashCtl	typesctl;	/* metric types from pmLookupDesc */
5469b2
+static __pmHashCtl	descsctl;	/* metric descs from pmLookupDesc */
5469b2
 
5469b2
 int
5469b2
 values_hash(pmResult *result)
5469b2
@@ -47,27 +47,33 @@ metric_values(pmID pmid)
5469b2
 }
5469b2
 
5469b2
 int
5469b2
-metric_type(pmID pmid)
5469b2
+descs_hash(int numpmid, pmDesc *descs)
5469b2
 {
5469b2
-    __pmHashNode	*node;
5469b2
-    pmDesc		desc;
5469b2
-    int			sts, *data;
5469b2
+    unsigned int	i;
5469b2
+    pmDesc		*dp;
5469b2
+    int			sts;
5469b2
 
5469b2
-    if (pmid == PM_IN_NULL)
5469b2
-	return PM_TYPE_UNKNOWN;
5469b2
-    if ((node = __pmHashSearch(pmid, &typesctl)) == NULL) {
5469b2
-	if ((sts = pmLookupDesc(pmid, &desc)) < 0)
5469b2
-	    return sts;
5469b2
-	if ((data = malloc(sizeof(int))) == NULL)
5469b2
-	    return sts;
5469b2
-	*data = desc.type;
5469b2
-	if ((sts = __pmHashAdd(pmid, data, &typesctl)) < 0) {
5469b2
-	    free(data);
5469b2
+    if ((sts = __pmHashPreAlloc(numpmid, &descsctl)) < 0)
5469b2
+	return sts;
5469b2
+
5469b2
+    for (i = 0; i < numpmid; i++) {
5469b2
+	dp = &descs[i];
5469b2
+	if ((sts = __pmHashAdd(dp->pmid, dp, &descsctl)) < 0)
5469b2
 	    return sts;
5469b2
-	}
5469b2
-	return *data;
5469b2
     }
5469b2
-    return *(int *)node->data;
5469b2
+    return numpmid;
5469b2
+}
5469b2
+
5469b2
+pmDesc *
5469b2
+metric_desc(pmID pmid)
5469b2
+{
5469b2
+    __pmHashNode	*node;
5469b2
+
5469b2
+    if (pmid == PM_IN_NULL)
5469b2
+	return NULL;
5469b2
+    if ((node = __pmHashSearch(pmid, &descsctl)) == NULL)
5469b2
+	return NULL;
5469b2
+    return (pmDesc *)node->data;
5469b2
 }
5469b2
 
5469b2
 int
5469b2
diff --git a/src/pmlogconf/util.h b/src/pmlogconf/util.h
5469b2
index 17d856a0d7..a11350d899 100644
5469b2
--- a/src/pmlogconf/util.h
5469b2
+++ b/src/pmlogconf/util.h
5469b2
@@ -34,7 +34,9 @@ extern void fmt(const char *, char *, size_t, int, int, fmt_t, void *);
5469b2
 
5469b2
 extern int values_hash(pmResult *);
5469b2
 extern pmValueSet *metric_values(pmID);
5469b2
-extern int metric_type(pmID);
5469b2
+
5469b2
+extern int descs_hash(int, pmDesc *);
5469b2
+extern pmDesc *metric_desc(pmID);
5469b2
 
5469b2
 typedef int (*numeric_cmp_t)(double, double);
5469b2
 extern int number_equal(double, double);