[Tarantool-patches] [PATCH 1/2] Copy DSO module before load instead of symlink-ing

Kirill Yukhin kyukhin at tarantool.org
Wed May 27 12:17:13 MSK 2020


Hello,

On 26 май 18:16, Cyrill Gorcunov wrote:
> On Mon, May 25, 2020 at 04:13:54PM +0300, Kirill Yukhin wrote:
> > +
> > +	off_t pos, left;
> > +	for (left = st.st_size, pos = 0; left > 0;) {
> > +		off_t ret = eio_sendfile_sync(dest_fd, source_fd, pos,
> > +					      st.st_size);
> > +		if (ret < 0) {
> > +			diag_set(SystemError, "failed to copy DSO %s to %s",
> > +				 path, load_name);
> > +			close(source_fd);
> > +			close(dest_fd);
> > +			goto error;
> > +		}
> > +		pos += ret;
> > +		left -= ret;
> > +	}
> > +	close(source_fd);
> > +	close(dest_fd);
> 
> Kirill, we don't need the for() cycle here, the eio_sendfile_sync
> will handle the cycle by self (inside implementation).

Ah, sure, thanks! Iterative patch in the bottom.
Branch force-pushed.

We should probably update coio_do_copyfile() as well.
This is where I've copy-and-pasted from.

--
Regards, Kirill Yukhin

diff --git a/src/box/func.c b/src/box/func.c
index e0c45a4..a8697d3 100644
--- a/src/box/func.c
+++ b/src/box/func.c
@@ -308,22 +308,14 @@ module_load(const char *package, const char *package_end)
 		goto error;
 	}
 
-	off_t pos, left;
-	for (left = st.st_size, pos = 0; left > 0;) {
-		off_t ret = eio_sendfile_sync(dest_fd, source_fd, pos,
-					      st.st_size);
-		if (ret < 0) {
-			diag_set(SystemError, "failed to copy DSO %s to %s",
-				 path, load_name);
-			close(source_fd);
-			close(dest_fd);
-			goto error;
-		}
-		pos += ret;
-		left -= ret;
-	}
+	off_t ret = eio_sendfile_sync(dest_fd, source_fd, 0, st.st_size);
 	close(source_fd);
 	close(dest_fd);
+	if (ret != st.st_size) {
+		diag_set(SystemError, "failed to copy DSO %s to %s",
+			 path, load_name);
+		goto error;
+	}
 
 	module->handle = dlopen(load_name, RTLD_NOW | RTLD_LOCAL);
 	if (unlink(load_name) != 0)


More information about the Tarantool-patches mailing list