Fix 'merge' from pipe. read in a loop to workaround pipe starvation
authorChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 13 May 2010 13:47:01 +0000 (15:47 +0200)
committeropensvc <opensvc@opensvc.com>
Thu, 13 May 2010 13:47:01 +0000 (15:47 +0200)
dds.c

diff --git a/dds.c b/dds.c
index eda6fda..e78e5b7 100644 (file)
--- a/dds.c
+++ b/dds.c
@@ -93,7 +93,7 @@ struct disk_exception {
 size_t chunk_size_bytes;
 int fdin, fdout, fdcow;
 char * buf;
-int showchunks, verbose, extract, merge;
+int verbose, extract, merge;
 
 static int init_buffer () {
        buf = malloc(MAX_SNAP_CHUNK_SIZE);
@@ -183,13 +183,9 @@ int write_disk_header () {
                perror("seek cow to header chunk");
                return 1;
        }
-        len = 0;
-        while (len >= 0 && len != chunk_size_bytes) {
-               len += read(fdcow, buf, chunk_size_bytes - len);
-       }
+       len = read(fdcow, buf, chunk_size_bytes);
        if (len != chunk_size_bytes) {
                perror("read cow header");
-                printf("len = %i\n", len);
                return 1;
        }
        len = write(fdout, buf, chunk_size_bytes);
@@ -207,13 +203,9 @@ static int write_exception (struct disk_exception * e) {
                perror("seek source to data chunk");
                return 1;
        }
-        len = 0;
-        while (len >= 0 && len != chunk_size_bytes) {
-               len += read(fdin, buf, chunk_size_bytes - len);
-       }
+       len = read(fdin, buf, chunk_size_bytes);
        if (len != chunk_size_bytes) {
                perror("read cow header");
-                printf("len = %i\n", len);
                return 1;
        }
        len = write(fdout, buf, chunk_size_bytes);
@@ -221,7 +213,7 @@ static int write_exception (struct disk_exception * e) {
                perror("write cow header");
                return 1;
        }
-       if (showchunks)
+       if (verbose)
                printf("  %-16llu  %-16llu\n", e->old_chunk, e->new_chunk);
        return 0;
 }
@@ -242,10 +234,7 @@ static int seek_to_exception_table (const int n) {
 static int load_exception (struct disk_exception * e) {
        size_t len;
 
-       len = 0;
-        while (len >=0 && len != chunk_size_bytes) {
-               len += read(fdcow, buf, chunk_size_bytes - len);
-       }
+       len = read(fdcow, buf, chunk_size_bytes);
        if (len != chunk_size_bytes) {
                perror("read cow data chunk to load");
                return 1;
@@ -259,7 +248,7 @@ static int load_exception (struct disk_exception * e) {
                perror("write cow exceptions");
                return 1;
        }
-       if (showchunks)
+       if (verbose)
                printf("  %-16llu  %-16llu\n", e->old_chunk, e->new_chunk);
        return 0;
 }
@@ -286,7 +275,7 @@ int load_exceptions () {
        uint64_t n, exception_count = 0;
        char * exception_chunk_buf;
 
-       if (showchunks) {
+       if (verbose) {
                printf("Exception table:\n");
                printf("  chunk number      chunk number\n");
                printf("  on source         on dest\n");
@@ -336,7 +325,7 @@ int write_exceptions () {
        uint64_t n, exception_count = 0;
        char * exception_chunk_buf;
 
-       if (showchunks) {
+       if (verbose) {
                printf("Exception table:\n");
                printf("  chunk number      chunk number\n");
                printf("  on source         on dest\n");
@@ -434,7 +423,6 @@ void usage (char * prog) {
        printf(" -d, --dest       file to copy the data to (default stdout)\n");
        printf(" -h, --help       this message\n");
        printf(" -v, --verbose    display more information\n");
-       printf(" -C, --showchunks display chunk remappings\n");
        return;
 }
 
@@ -493,7 +481,6 @@ int main (int argc, char * const * argv) {
        char * cow = NULL;
 
        verbose = 0;
-       showchunks = 0;
        extract = 0;
        merge = 0;
 
@@ -507,7 +494,6 @@ int main (int argc, char * const * argv) {
                        {"help", 0, 0, 'h'},
                        {"source", 1, 0, 's'},
                        {"verbose", 0, 0, 'v'},
-                       {"showchunks", 0, 0, 'C'},
                        {0, 0, 0, 0},
                };
                c = getopt_long(argc, argv, "c:d:hms:vx",
@@ -519,9 +505,6 @@ int main (int argc, char * const * argv) {
                case 'c':
                        cow = strdup(optarg);
                        break;
-               case 'C':
-                       showchunks = 1;
-                       break;
                case 'd':
                        dest = strdup(optarg);
                        break;
@@ -550,8 +533,8 @@ int main (int argc, char * const * argv) {
        /*
         * sanity checks
         */
-       if (extract && (verbose || showchunks) && !dest) {
-               fprintf(stderr, "extract verbose and showchunks modes needs --dest "
+       if (extract && verbose && !dest) {
+               fprintf(stderr, "extract verbose mode needs --dest "
                                "(stdout usage conflict)\n");
                return 1;
        }