libzfs: calculate receive times with sub-second precision
Provide two digits of precision when reporting send/receive times. Tiny snapshots may take significantly less than a second and rounding up to a full second can introduce a significant error. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Closes #13047
This commit is contained in:
parent
5c0061345b
commit
67de71e644
|
@ -4168,7 +4168,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||||
avl_tree_t *stream_avl, char **top_zfs,
|
avl_tree_t *stream_avl, char **top_zfs,
|
||||||
const char *finalsnap, nvlist_t *cmdprops)
|
const char *finalsnap, nvlist_t *cmdprops)
|
||||||
{
|
{
|
||||||
time_t begin_time;
|
struct timespec begin_time;
|
||||||
int ioctl_err, ioctl_errno, err;
|
int ioctl_err, ioctl_errno, err;
|
||||||
char *cp;
|
char *cp;
|
||||||
struct drr_begin *drrb = &drr->drr_u.drr_begin;
|
struct drr_begin *drrb = &drr->drr_u.drr_begin;
|
||||||
|
@ -4202,7 +4202,10 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||||
uint8_t *wkeydata = NULL;
|
uint8_t *wkeydata = NULL;
|
||||||
uint_t wkeylen = 0;
|
uint_t wkeylen = 0;
|
||||||
|
|
||||||
begin_time = time(NULL);
|
#ifndef CLOCK_MONOTONIC_RAW
|
||||||
|
#define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC
|
||||||
|
#endif
|
||||||
|
clock_gettime(CLOCK_MONOTONIC_RAW, &begin_time);
|
||||||
bzero(origin, MAXNAMELEN);
|
bzero(origin, MAXNAMELEN);
|
||||||
bzero(tmp_keylocation, MAXNAMELEN);
|
bzero(tmp_keylocation, MAXNAMELEN);
|
||||||
|
|
||||||
|
@ -4987,14 +4990,23 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||||
char buf1[64];
|
char buf1[64];
|
||||||
char buf2[64];
|
char buf2[64];
|
||||||
uint64_t bytes = read_bytes;
|
uint64_t bytes = read_bytes;
|
||||||
time_t delta = time(NULL) - begin_time;
|
struct timespec delta;
|
||||||
if (delta == 0)
|
clock_gettime(CLOCK_MONOTONIC_RAW, &delta);
|
||||||
delta = 1;
|
if (begin_time.tv_nsec > delta.tv_nsec) {
|
||||||
|
delta.tv_nsec =
|
||||||
|
1000000000 + delta.tv_nsec - begin_time.tv_nsec;
|
||||||
|
delta.tv_sec -= 1;
|
||||||
|
} else
|
||||||
|
delta.tv_nsec -= begin_time.tv_nsec;
|
||||||
|
delta.tv_sec -= begin_time.tv_sec;
|
||||||
|
if (delta.tv_sec == 0 && delta.tv_nsec == 0)
|
||||||
|
delta.tv_nsec = 1;
|
||||||
|
double delta_f = delta.tv_sec + (delta.tv_nsec / 1e9);
|
||||||
zfs_nicebytes(bytes, buf1, sizeof (buf1));
|
zfs_nicebytes(bytes, buf1, sizeof (buf1));
|
||||||
zfs_nicebytes(bytes/delta, buf2, sizeof (buf1));
|
zfs_nicebytes(bytes / delta_f, buf2, sizeof (buf2));
|
||||||
|
|
||||||
(void) printf("received %s stream in %lld seconds (%s/sec)\n",
|
(void) printf("received %s stream in %.2f seconds (%s/sec)\n",
|
||||||
buf1, (longlong_t)delta, buf2);
|
buf1, delta_f, buf2);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
Loading…
Reference in New Issue