summaryrefslogtreecommitdiff
path: root/0014-add-retry-for-read-write.patch
diff options
context:
space:
mode:
Diffstat (limited to '0014-add-retry-for-read-write.patch')
-rw-r--r--0014-add-retry-for-read-write.patch360
1 files changed, 360 insertions, 0 deletions
diff --git a/0014-add-retry-for-read-write.patch b/0014-add-retry-for-read-write.patch
new file mode 100644
index 0000000..c51a570
--- /dev/null
+++ b/0014-add-retry-for-read-write.patch
@@ -0,0 +1,360 @@
+From 734fca150e1c5da2814a55e0315bde8e828e6e8a Mon Sep 17 00:00:00 2001
+From: zhangxiaoyu <zhangxiaoyu58@huawei.com>
+Date: Fri, 17 Feb 2023 16:07:53 +0800
+Subject: [PATCH 14/53] add retry for read/write
+
+Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
+---
+ src/cmd/isulad-shim/common.c | 6 +++---
+ src/cmd/isulad-shim/process.c | 2 +-
+ src/cmd/isulad/main.c | 4 ++--
+ src/daemon/common/selinux_label.c | 2 +-
+ src/daemon/entry/connect/grpc/grpc_containers_service.cc | 9 ++++++---
+ src/daemon/entry/cri/sysctl_tools.c | 2 +-
+ src/daemon/executor/container_cb/execution.c | 4 ++--
+ .../modules/container/container_gc/containers_gc.c | 3 ++-
+ src/daemon/modules/events_sender/event_sender.c | 2 +-
+ src/daemon/modules/image/oci/storage/storage.c | 4 +++-
+ src/daemon/modules/log/log_gather.c | 6 +++---
+ src/daemon/modules/plugin/plugin.c | 2 +-
+ src/daemon/modules/runtime/isula/isula_rt_ops.c | 4 ++--
+ src/daemon/modules/service/io_handler.c | 2 +-
+ src/daemon/modules/service/service_container.c | 2 +-
+ src/utils/cutils/utils.c | 2 +-
+ src/utils/cutils/utils_aes.c | 2 +-
+ src/utils/cutils/utils_file.c | 2 +-
+ src/utils/tar/util_archive.c | 4 ++--
+ src/utils/tar/util_gzip.c | 2 +-
+ 20 files changed, 36 insertions(+), 30 deletions(-)
+
+diff --git a/src/cmd/isulad-shim/common.c b/src/cmd/isulad-shim/common.c
+index bb8464bb..0c345187 100644
+--- a/src/cmd/isulad-shim/common.c
++++ b/src/cmd/isulad-shim/common.c
+@@ -196,7 +196,7 @@ int generate_random_str(char *id, size_t len)
+ }
+ for (i = 0; i < len; i++) {
+ int nret;
+- if (read(fd, &num, sizeof(int)) < 0) {
++ if (read_nointr(fd, &num, sizeof(int)) < 0) {
+ close(fd);
+ return SHIM_ERR;
+ }
+@@ -232,8 +232,8 @@ void write_message(int fd, const char *level, const char *fmt, ...)
+ va_end(arg_list);
+
+ snprintf(msg, MAX_MESSAGE_LEN - 1, "{\"level\": \"%s\", \"msg\": \"%s\"}\n", level, buf);
+- nwrite = write(fd, msg, strlen(msg));
+- if (nwrite != strlen(msg)) {
++ nwrite = write_nointr_in_total(fd, msg, strlen(msg));
++ if (nwrite < 0 || (size_t)nwrite != strlen(msg)) {
+ return;
+ }
+ }
+diff --git a/src/cmd/isulad-shim/process.c b/src/cmd/isulad-shim/process.c
+index 8a0aa142..02ce3c85 100644
+--- a/src/cmd/isulad-shim/process.c
++++ b/src/cmd/isulad-shim/process.c
+@@ -283,7 +283,7 @@ static void *do_io_copy(void *data)
+ break;
+ }
+
+- int r_count = read(ioc->fd_from, buf, DEFAULT_IO_COPY_BUF);
++ int r_count = util_read_nointr(ioc->fd_from, buf, DEFAULT_IO_COPY_BUF);
+ if (r_count == -1) {
+ if (errno == EAGAIN || errno == EINTR) {
+ continue;
+diff --git a/src/cmd/isulad/main.c b/src/cmd/isulad/main.c
+index b17657c5..a75fb189 100644
+--- a/src/cmd/isulad/main.c
++++ b/src/cmd/isulad/main.c
+@@ -482,8 +482,8 @@ int check_and_save_pid(const char *fn)
+ goto out;
+ }
+
+- len = (int)write(fd, pidbuf, strlen(pidbuf));
+- if (len < 0) {
++ len = util_write_nointr(fd, pidbuf, strlen(pidbuf));
++ if (len < 0 || len != strlen(pidbuf)) {
+ ERROR("Failed to write pid to file:%s: %s", fn, strerror(errno));
+ ret = -1;
+ }
+diff --git a/src/daemon/common/selinux_label.c b/src/daemon/common/selinux_label.c
+index 24294780..173f3acb 100644
+--- a/src/daemon/common/selinux_label.c
++++ b/src/daemon/common/selinux_label.c
+@@ -310,7 +310,7 @@ static int get_random_value(unsigned int range, unsigned int *val)
+ return -1;
+ }
+
+- if (read(fd, &num, sizeof(int)) < 0) {
++ if (util_read_nointr(fd, &num, sizeof(int)) < 0) {
+ ERROR("Failed to read urandom value\n");
+ ret = -1;
+ goto out;
+diff --git a/src/daemon/entry/connect/grpc/grpc_containers_service.cc b/src/daemon/entry/connect/grpc/grpc_containers_service.cc
+index c0210ed9..eb79223b 100644
+--- a/src/daemon/entry/connect/grpc/grpc_containers_service.cc
++++ b/src/daemon/entry/connect/grpc/grpc_containers_service.cc
+@@ -292,7 +292,8 @@ Status ContainerServiceImpl::RemoteStart(ServerContext *context,
+ break;
+ }
+ const std::string &command = request.stdin();
+- if (write(read_pipe_fd[1], (void *)(command.c_str()), command.length()) < 0) {
++ int nret = util_write_nointr_in_total(read_pipe_fd[1], command.c_str(), command.length());
++ if (nret < 0 || (size_t)nret != command.length()) {
+ ERROR("sub write over!");
+ break;
+ }
+@@ -407,7 +408,8 @@ public:
+ }
+ for (int i = 0; i < request.cmd_size(); i++) {
+ std::string command = request.cmd(i);
+- if (write(m_read_pipe_fd, (void *)(command.c_str()), command.length()) < 0) {
++ int nret = util_write_nointr_in_total(m_read_pipe_fd, command.c_str(), command.length());
++ if (nret < 0 || (size_t)nret != command.length()) {
+ ERROR("sub write over!");
+ return;
+ }
+@@ -629,7 +631,8 @@ Status ContainerServiceImpl::Attach(ServerContext *context, ServerReaderWriter<A
+ break;
+ }
+ std::string command = request.stdin();
+- if (write(pipefd[1], (void *)(command.c_str()), command.length()) < 0) {
++ int nret = util_write_nointr_in_total(pipefd[1], command.c_str(), command.length());
++ if (nret < 0 || (size_t)nret != command.length()) {
+ ERROR("sub write over!");
+ break;
+ }
+diff --git a/src/daemon/entry/cri/sysctl_tools.c b/src/daemon/entry/cri/sysctl_tools.c
+index 257ccf8f..3c558fa1 100644
+--- a/src/daemon/entry/cri/sysctl_tools.c
++++ b/src/daemon/entry/cri/sysctl_tools.c
+@@ -99,7 +99,7 @@ int set_sysctl(const char *sysctl, int new_value, char **err)
+ goto free_out;
+ }
+ rsize = util_write_nointr(fd, buff, strlen(buff));
+- if (rsize <= 0) {
++ if (rsize < 0 || (size_t)rsize != strlen(buff)) {
+ if (asprintf(err, "Write new value failed: %s", strerror(errno)) < 0) {
+ *err = util_strdup_s("Out of memory");
+ }
+diff --git a/src/daemon/executor/container_cb/execution.c b/src/daemon/executor/container_cb/execution.c
+index ed70fc14..198052d3 100644
+--- a/src/daemon/executor/container_cb/execution.c
++++ b/src/daemon/executor/container_cb/execution.c
+@@ -348,7 +348,7 @@ static int maybe_create_cpu_realtime_file(int64_t value, const char *file, const
+ return -1;
+ }
+ nwrite = util_write_nointr(fd, buf, strlen(buf));
+- if (nwrite < 0 || nwrite != strlen(buf)) {
++ if (nwrite < 0 || (size_t)nwrite != strlen(buf)) {
+ ERROR("Failed to write %s to %s: %s", buf, fpath, strerror(errno));
+ isulad_set_error_message("Failed to write '%s' to '%s': %s", buf, fpath, strerror(errno));
+ return -1;
+@@ -451,7 +451,7 @@ static int container_start_prepare(container_t *cont, const container_start_requ
+
+ // init cgroup path for cpu_rt_runtime and cpu_rt_period
+ // we should do this in start container, not create container
+- // because, in scenarios:
++ // because, in scenarios:
+ // 1. enable cpu-rt of isulad;
+ // 2. then run container with --cpu-rt-runtime
+ // 3. then reboot machine;
+diff --git a/src/daemon/modules/container/container_gc/containers_gc.c b/src/daemon/modules/container/container_gc/containers_gc.c
+index 8c858a96..9feb6d3c 100644
+--- a/src/daemon/modules/container/container_gc/containers_gc.c
++++ b/src/daemon/modules/container/container_gc/containers_gc.c
+@@ -88,7 +88,8 @@ static int save_gc_config(const char *json_gc_config)
+ goto out;
+ }
+
+- if (write(fd, json_gc_config, strlen(json_gc_config)) == -1) {
++ nret = util_write_nointr(fd, json_gc_config, strlen(json_gc_config));
++ if (nret < 0 || (size_t)nret != strlen(json_gc_config)) {
+ ERROR("write %s failed: %s", filename, strerror(errno));
+ ret = -1;
+ }
+diff --git a/src/daemon/modules/events_sender/event_sender.c b/src/daemon/modules/events_sender/event_sender.c
+index 03dcbbf3..a3903f3e 100644
+--- a/src/daemon/modules/events_sender/event_sender.c
++++ b/src/daemon/modules/events_sender/event_sender.c
+@@ -58,7 +58,7 @@ static void isulad_monitor_fifo_send(const struct monitord_msg *msg)
+
+ do {
+ ret = util_write_nointr(fd, msg, sizeof(struct monitord_msg));
+- if (ret != sizeof(struct monitord_msg)) {
++ if (ret < 0 || (size_t)ret != sizeof(struct monitord_msg)) {
+ util_usleep_nointerupt(1000);
+ }
+ } while (ret != sizeof(struct monitord_msg));
+diff --git a/src/daemon/modules/image/oci/storage/storage.c b/src/daemon/modules/image/oci/storage/storage.c
+index 829ea8d0..2f4bdf5f 100644
+--- a/src/daemon/modules/image/oci/storage/storage.c
++++ b/src/daemon/modules/image/oci/storage/storage.c
+@@ -1429,6 +1429,7 @@ static int do_add_checked_layer(const char *lid, int fd, map_t *checked_layers)
+ bool default_value = true;
+ char buf[PATH_MAX] = { 0 };
+ int ret = 0;
++ int nret;
+
+ if (strlen(lid) >= PATH_MAX - 1) {
+ ERROR("Invalid layer id: %s", lid);
+@@ -1438,7 +1439,8 @@ static int do_add_checked_layer(const char *lid, int fd, map_t *checked_layers)
+ (void)memcpy(buf, lid, strlen(lid));
+ buf[strlen(lid)] = '\n';
+ // save checked layer ids into file
+- if (util_write_nointr(fd, buf, strlen(lid) + 1) < 0) {
++ nret = util_write_nointr(fd, buf, strlen(lid) + 1);
++ if (nret < 0 || (size_t)nret != strlen(lid) + 1) {
+ ERROR("Write checked layer data failed: %s", strerror(errno));
+ ret = -1;
+ goto out;
+diff --git a/src/daemon/modules/log/log_gather.c b/src/daemon/modules/log/log_gather.c
+index 49facaa2..414c9ad1 100644
+--- a/src/daemon/modules/log/log_gather.c
++++ b/src/daemon/modules/log/log_gather.c
+@@ -183,9 +183,9 @@ static int write_into_file(const void *buf, size_t g_log_size)
+ return -1;
+ }
+ }
+- ret = (int)write(g_log_fd, buf, g_log_size);
+- if (ret <= 0) {
+- return ret;
++ ret = util_write_nointr_in_total(g_log_fd, buf, g_log_size);
++ if (ret < 0 || (size_t)ret != g_log_size) {
++ return -1;
+ }
+
+ write_size += ret;
+diff --git a/src/daemon/modules/plugin/plugin.c b/src/daemon/modules/plugin/plugin.c
+index 53afeeaf..1c0af368 100644
+--- a/src/daemon/modules/plugin/plugin.c
++++ b/src/daemon/modules/plugin/plugin.c
+@@ -618,7 +618,7 @@ static int process_plugin_events(int inotify_fd, const char *plugin_dir)
+ struct inotify_event *plugin_event = NULL;
+ char buffer[8192 + 1] = { 0 };
+ int action = 0;
+- events_length = read(inotify_fd, buffer, 8192);
++ events_length = util_read_nointr(inotify_fd, buffer, 8192);
+
+ if (events_length <= 0) {
+ ERROR("Failed to wait events");
+diff --git a/src/daemon/modules/runtime/isula/isula_rt_ops.c b/src/daemon/modules/runtime/isula/isula_rt_ops.c
+index 76e3bcb7..5463bb1b 100644
+--- a/src/daemon/modules/runtime/isula/isula_rt_ops.c
++++ b/src/daemon/modules/runtime/isula/isula_rt_ops.c
+@@ -1363,8 +1363,8 @@ int rt_isula_exec_resize(const char *id, const char *runtime, const rt_exec_resi
+ goto out;
+ }
+
+- count = write(fd, data, RESIZE_DATA_SIZE);
+- if (count <= 0) {
++ count = util_write_nointr(fd, data, strlen(data));
++ if (count < 0 || (size_t)count != strlen(data)) {
+ ERROR("write exec resize data error");
+ ret = -1;
+ goto out;
+diff --git a/src/daemon/modules/service/io_handler.c b/src/daemon/modules/service/io_handler.c
+index 893733bc..98c763a4 100644
+--- a/src/daemon/modules/service/io_handler.c
++++ b/src/daemon/modules/service/io_handler.c
+@@ -340,7 +340,7 @@ static ssize_t write_to_fd(void *context, const void *data, size_t len)
+ {
+ ssize_t ret;
+ ret = util_write_nointr(*(int *)context, data, len);
+- if ((ret <= 0) || (ret != (ssize_t)len)) {
++ if (ret < 0 || (size_t)ret != len) {
+ ERROR("Failed to write: %s", strerror(errno));
+ return -1;
+ }
+diff --git a/src/daemon/modules/service/service_container.c b/src/daemon/modules/service/service_container.c
+index eeb035a0..cc777411 100644
+--- a/src/daemon/modules/service/service_container.c
++++ b/src/daemon/modules/service/service_container.c
+@@ -345,7 +345,7 @@ static int write_env_content(const char *env_path, const char **env, size_t env_
+ goto out;
+ }
+ nret = util_write_nointr(fd, env_content, strlen(env_content));
+- if (nret < 0 || nret != len - 1) {
++ if (nret < 0 || (size_t)nret != strlen(env_content)) {
+ SYSERROR("Write env file failed");
+ free(env_content);
+ ret = -1;
+diff --git a/src/utils/cutils/utils.c b/src/utils/cutils/utils.c
+index de636bcb..f99b28e4 100644
+--- a/src/utils/cutils/utils.c
++++ b/src/utils/cutils/utils.c
+@@ -1251,7 +1251,7 @@ int util_generate_random_str(char *id, size_t len)
+ }
+ for (i = 0; i < len; i++) {
+ int nret;
+- if (read(fd, &num, sizeof(int)) < 0) {
++ if (util_read_nointr(fd, &num, sizeof(int)) < 0) {
+ ERROR("Failed to read urandom value");
+ close(fd);
+ return -1;
+diff --git a/src/utils/cutils/utils_aes.c b/src/utils/cutils/utils_aes.c
+index 1e25ecd3..055a9538 100644
+--- a/src/utils/cutils/utils_aes.c
++++ b/src/utils/cutils/utils_aes.c
+@@ -77,7 +77,7 @@ int util_aes_key(const char *key_file, bool create, unsigned char *aeskey)
+ goto out;
+ }
+
+- if (read(fd, aeskey, AES_256_CFB_KEY_LEN) != AES_256_CFB_KEY_LEN) {
++ if (util_read_nointr(fd, aeskey, AES_256_CFB_KEY_LEN) != AES_256_CFB_KEY_LEN) {
+ ERROR("read key file %s failed: %s", key_file, strerror(errno));
+ ret = -1;
+ goto out;
+diff --git a/src/utils/cutils/utils_file.c b/src/utils/cutils/utils_file.c
+index cdd712a7..34c5b060 100644
+--- a/src/utils/cutils/utils_file.c
++++ b/src/utils/cutils/utils_file.c
+@@ -998,7 +998,7 @@ int util_file2str(const char *filename, char *buf, size_t len)
+ if (fd == -1) {
+ return -1;
+ }
+- num_read = (int)read(fd, buf, len - 1);
++ num_read = (int)util_read_nointr(fd, buf, len - 1);
+ if (num_read <= 0) {
+ num_read = -1;
+ } else {
+diff --git a/src/utils/tar/util_archive.c b/src/utils/tar/util_archive.c
+index 2d56d8a7..7ace2924 100644
+--- a/src/utils/tar/util_archive.c
++++ b/src/utils/tar/util_archive.c
+@@ -662,7 +662,7 @@ child_out:
+ if (ret != 0) {
+ ERROR("Wait archive_untar_handler failed with error:%s", strerror(errno));
+ fcntl(pipe_stderr[0], F_SETFL, O_NONBLOCK);
+- if (read(pipe_stderr[0], errbuf, BUFSIZ) < 0) {
++ if (util_read_nointr(pipe_stderr[0], errbuf, BUFSIZ) < 0) {
+ ERROR("read error message from child failed");
+ }
+ }
+@@ -1057,7 +1057,7 @@ child_out:
+ if (ret != 0) {
+ ERROR("tar failed");
+ fcntl(pipe_for_read[0], F_SETFL, O_NONBLOCK);
+- if (read(pipe_for_read[0], errbuf, BUFSIZ) < 0) {
++ if (util_read_nointr(pipe_for_read[0], errbuf, BUFSIZ) < 0) {
+ ERROR("read error message from child failed");
+ }
+ }
+diff --git a/src/utils/tar/util_gzip.c b/src/utils/tar/util_gzip.c
+index 5c34d719..2f4750be 100644
+--- a/src/utils/tar/util_gzip.c
++++ b/src/utils/tar/util_gzip.c
+@@ -212,7 +212,7 @@ int gzip(const char *filename, size_t len)
+ return -1;
+ }
+
+- size_read = read(pipefd[0], buffer, BUFSIZ);
++ size_read = util_read_nointr(pipefd[0], buffer, BUFSIZ);
+ close(pipefd[0]);
+
+ if (size_read) {
+--
+2.25.1
+