Handle interrupted sampling from within libpcp PDU transfers

This situation can arise if pcp-htop screen is resized right
at the same time sampling from pmcd(1) is happening.  Have a
couple more goes at it before giving up entirely; once there
is no data available though we cannot proceed into accessing
the sample result data structure (segv will result) so a new
short-circuit guard is added there also.
This commit is contained in:
Nathan Scott 2021-10-05 13:20:13 +11:00
parent f75a8bc3a1
commit 8ac8542b6e
2 changed files with 6 additions and 2 deletions

View File

@ -164,7 +164,10 @@ bool PCPMetric_fetch(struct timeval* timestamp) {
pmFreeResult(pcp->result); pmFreeResult(pcp->result);
pcp->result = NULL; pcp->result = NULL;
} }
int sts = pmFetch(pcp->totalMetrics, pcp->fetch, &pcp->result); int sts, count = 0;
do {
sts = pmFetch(pcp->totalMetrics, pcp->fetch, &pcp->result);
} while (sts == PM_ERR_IPC && ++count < 3);
if (sts < 0) { if (sts < 0) {
if (pmDebugOptions.appl0) if (pmDebugOptions.appl0)
fprintf(stderr, "Error: cannot fetch metric values: %s\n", fprintf(stderr, "Error: cannot fetch metric values: %s\n",

View File

@ -680,7 +680,8 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
PCPMetric_enable(PCP_PROC_SMAPS_SWAPPSS, smaps_flag && enabled); PCPMetric_enable(PCP_PROC_SMAPS_SWAPPSS, smaps_flag && enabled);
struct timeval timestamp; struct timeval timestamp;
PCPMetric_fetch(&timestamp); if (PCPMetric_fetch(&timestamp) != true)
return;
double sample = this->timestamp; double sample = this->timestamp;
this->timestamp = pmtimevalToReal(&timestamp); this->timestamp = pmtimevalToReal(&timestamp);