zpool: flush output before sleeping

Several zpool commands (status, list, iostat) have modes that present
some information, sleep a while, present the current state, sleep, etc.
Some of those had ways to invoke them that when piped would appear to do
nothing for a while, because non-terminals are block-buffered, not
line-buffered, by default.  Fix this by forcing a flush before sleeping.

In particular, all of these buffered:
- zpool status <pool> <interval>
- zpool iostat -y<m> <pool> <interval>
- zpool list <pool> <interval>

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <robn@despairlabs.com>
Closes #15593
This commit is contained in:
Rob N 2023-12-06 06:53:14 +11:00 committed by GitHub
parent c7b6119268
commit 5f2700eee5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -5950,6 +5950,7 @@ zpool_do_iostat(int argc, char **argv)
print_iostat_header(&cb);
if (skip) {
(void) fflush(stdout);
(void) fsleep(interval);
continue;
}
@ -5980,18 +5981,13 @@ zpool_do_iostat(int argc, char **argv)
}
/*
* Flush the output so that redirection to a file isn't buffered
* indefinitely.
*/
(void) fflush(stdout);
if (interval == 0)
break;
if (count != 0 && --count == 0)
break;
(void) fflush(stdout);
(void) fsleep(interval);
}
@ -6514,6 +6510,8 @@ zpool_do_list(int argc, char **argv)
break;
pool_list_free(list);
(void) fflush(stdout);
(void) fsleep(interval);
}
@ -9094,6 +9092,7 @@ zpool_do_status(int argc, char **argv)
if (count != 0 && --count == 0)
break;
(void) fflush(stdout);
(void) fsleep(interval);
}