util/disk_cache: add a write helper
authorGrazvydas Ignotas <notasas@gmail.com>
Wed, 15 Mar 2017 23:09:32 +0000 (01:09 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 21 Mar 2017 00:51:03 +0000 (11:51 +1100)
Simplifies the write code a bit and handles EINTR.

V2: (Timothy Arceri) Drop EINTR handling. To do it
    properly we would need a retry limit but it's
    probably best to just avoid trying to write if
    we hit EINTR and try again next time we see
    the program.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/util/disk_cache.c

index 2478a1a41707b3ccfcf71b2ca0602717ae44dbd1..dd3cadb15a981e1c08e5f823f30aa655b00914a2 100644 (file)
@@ -681,6 +681,21 @@ disk_cache_remove(struct disk_cache *cache, const cache_key key)
       p_atomic_add(cache->size, - (uint64_t)sb.st_size);
 }
 
+static ssize_t
+write_all(int fd, const void *buf, size_t count)
+{
+   const char *out = buf;
+   ssize_t written;
+   size_t done;
+
+   for (done = 0; done < count; done += written) {
+      written = write(fd, out + done, count - done);
+      if (written == -1)
+         return -1;
+   }
+   return done;
+}
+
 /* From the zlib docs:
  *    "If the memory is available, buffers sizes on the order of 128K or 256K
  *    bytes should be used."
@@ -730,13 +745,10 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
          size_t have = BUFSIZE - strm.avail_out;
          compressed_size += have;
 
-         size_t written = 0;
-         for (size_t len = 0; len < have; len += written) {
-            written = write(dest, out + len, have - len);
-            if (written == -1) {
-               (void)deflateEnd(&strm);
-               return 0;
-            }
+         ssize_t written = write_all(dest, out, have);
+         if (written == -1) {
+            (void)deflateEnd(&strm);
+            return 0;
          }
       } while (strm.avail_out == 0);
 
@@ -791,7 +803,6 @@ cache_put(void *job, int thread_index)
 
    int fd = -1, fd_final = -1, err, ret;
    unsigned i = 0;
-   size_t len;
    char *filename = NULL, *filename_tmp = NULL;
    struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) job;
 
@@ -860,12 +871,10 @@ cache_put(void *job, int thread_index)
    cf_data.uncompressed_size = dc_job->size;
 
    size_t cf_data_size = sizeof(cf_data);
-   for (len = 0; len < cf_data_size; len += ret) {
-      ret = write(fd, ((uint8_t *) &cf_data) + len, cf_data_size - len);
-      if (ret == -1) {
-         unlink(filename_tmp);
-         goto done;
-      }
+   ret = write_all(fd, &cf_data, cf_data_size);
+   if (ret == -1) {
+      unlink(filename_tmp);
+      goto done;
    }
 
    /* Now, finally, write out the contents to the temporary file, then