File pacemaker-crmd-update-throttle-CPUs-hot-plugged.patch of Package pacemaker.14737

commit da00177e186dc7b7e63fecb7e0d461003eda2eea
Author: Ken Gaillot <kgaillot@redhat.com>
Date:   Fri Apr 28 14:56:12 2017 -0500

    Fix: crmd,libcrmcommon: update throttle when CPUs are hot-plugged
    
    Previously, the number of CPU cores was determined the first time it was
    needed, and remembered permanently after that. That becomes inaccurate when
    cores are hot-plugged in and out of a virtual machine. Now, the number of cores
    is parsed each time it is needed (using the new libcrmcommon function).

Index: pacemaker/crmd/throttle.c
===================================================================
--- pacemaker.orig/crmd/throttle.c
+++ pacemaker/crmd/throttle.c
@@ -57,40 +57,6 @@ static float throttle_load_target = 0.0;
 static GHashTable *throttle_records = NULL;
 static mainloop_timer_t *throttle_timer = NULL;
 
-static int
-throttle_num_cores(void)
-{
-    static int cores = 0;
-    char buffer[256];
-    FILE *stream = NULL;
-    const char *cpufile = "/proc/cpuinfo";
-
-    if(cores) {
-        return cores;
-    }
-    stream = fopen(cpufile, "r");
-    if(stream == NULL) {
-        int rc = errno;
-        crm_warn("Couldn't read %s, assuming a single processor: %s (%d)", cpufile, pcmk_strerror(rc), rc);
-        return 1;
-    }
-
-    while (fgets(buffer, sizeof(buffer), stream)) {
-        if(strstr(buffer, "processor") == buffer) {
-            cores++;
-        }
-    }
-
-    fclose(stream);
-
-    if(cores == 0) {
-        crm_warn("No processors found in %s, assuming 1", cpufile);
-        return 1;
-    }
-
-    return cores;
-}
-
 /*
  * \internal
  * \brief Return name of /proc file containing the CIB deamon's load statistics
@@ -259,7 +225,6 @@ throttle_load_avg(float *load)
         *load = strtof(buffer, NULL);
         if(nl) { nl[0] = 0; }
 
-        crm_debug("Current load is %f (full: %s)", *load, buffer);
         fclose(stream);
         return TRUE;
     }
@@ -327,7 +292,7 @@ throttle_handle_load(float load, const c
 static enum throttle_state_e
 throttle_mode(void)
 {
-    int cores;
+    unsigned int cores;
     float load;
     float thresholds[4];
     enum throttle_state_e mode = throttle_none;
@@ -336,7 +301,7 @@ throttle_mode(void)
     return throttle_none;
 #endif
 
-    cores = throttle_num_cores();
+    cores = crm_procfs_num_cores();
     if(throttle_cib_load(&load)) {
         float cib_max_cpu = 0.95;
 
@@ -373,6 +338,7 @@ throttle_mode(void)
     }
 
     if(throttle_load_avg(&load)) {
+        crm_debug("Current load is %f across %u core(s)", load, cores);
         mode |= throttle_handle_load(load, "CPU load", cores);
     }
 
@@ -449,7 +415,7 @@ throttle_update_job_max(const char *pref
 {
     int max = 0;
 
-    throttle_job_max = 2 * throttle_num_cores();
+    throttle_job_max = 2 * crm_procfs_num_cores();
 
     if(preference) {
         /* Global preference from the CIB */
openSUSE Build Service is sponsored by