Mercurial > nomad > experimental
changeset 1303:52a373257894 draft
objstore/posix: use copy_file_range for COW
Instead of looping page-at-a-time in userspace, use the copy_file_range
syscall to speed up COW.
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Thu, 01 Feb 2024 11:49:46 -0500 |
parents | b14fd508b72a |
children | b3e0798761b7 |
files | src/objstore/posix/obj.c |
diffstat | 1 files changed, 9 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/objstore/posix/obj.c Mon Dec 19 19:55:24 2022 -0500 +++ b/src/objstore/posix/obj.c Thu Feb 01 11:49:46 2024 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> + * Copyright (c) 2018-2020,2024 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -257,8 +257,9 @@ const uint64_t full_size = sizeof(struct posix_ver_header) + p2roundup(old->attrs.size, BLOCK_SIZE); int src_fd, dst_fd; - off_t off; - int ret; + off_t srcoff = 0; + off_t dstoff = 0; + ssize_t ret; src_fd = open_ver(old->obj, &old->clock, false, false); if (src_fd < 0) @@ -272,17 +273,11 @@ VERIFY0(full_size % BLOCK_SIZE); - for (off = 0; off < full_size; off += BLOCK_SIZE) { - uint8_t buf[BLOCK_SIZE]; - - ret = xpread(src_fd, buf, sizeof(buf), off); - if (ret) - goto err_close2; - - ret = xpwrite(dst_fd, buf, sizeof(buf), off); - if (ret) - goto err_close2; - } + ret = copy_file_range(src_fd, &srcoff, + dst_fd, &dstoff, + full_size, 0); + if (ret != full_size) + goto err_close2; xclose(dst_fd); xclose(src_fd);