Speed up zchunk index operations
authorJonathan Dieter <jdieter@gmail.com>
Fri, 22 Mar 2019 22:13:16 +0000 (22:13 +0000)
committerJonathan Dieter <jdieter@gmail.com>
Fri, 22 Mar 2019 22:13:16 +0000 (22:13 +0000)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/dl/dl.c
src/lib/dl/range.c
src/lib/index/index_create.c
src/lib/zck_private.h

index e5e1e5702c92b0d66964531bd6fecf7675367179..7e5707c49835f3aac20e7fe9d754d0a71341615d 100644 (file)
@@ -191,34 +191,34 @@ int dl_write_range(zckDL *dl, const char *at, size_t length) {
         if(dl->tgt_check && !set_chunk_valid(dl))
             return false;
 
-        for(zckChunk *chk = dl->range->index.first; chk; chk = chk->next) {
-            if(dl->dl_chunk_data == chk->start) {
-                int count = 0;
-                for(zckChunk *tgt_chk = dl->zck->index.first; tgt_chk;
-                    tgt_chk = tgt_chk->next, count++) {
-                    if(tgt_chk->valid == 1)
-                        continue;
-                    if(chk->comp_length == tgt_chk->comp_length &&
-                       memcmp(chk->digest, tgt_chk->digest,
-                              chk->digest_size) == 0) {
-                        dl->tgt_check = tgt_chk;
-                        dl->tgt_number = count;
-                        if(!hash_init(dl->zck, &(dl->zck->check_chunk_hash),
-                                      &(dl->zck->chunk_hash_type)))
-                            return 0;
-                        dl->write_in_chunk = chk->comp_length;
-                        if(!seek_data(dl->zck,
-                                      dl->zck->data_offset + tgt_chk->start,
-                                      SEEK_SET))
-                            return 0;
-                        chk = NULL;
-                        tgt_chk = NULL;
-                        break;
-                    }
-                }
-            }
-            if(!chk)
+        if(dl->range->index.current == NULL)
+            dl->range->index.current = dl->range->index.first;
+        for(zckChunk *chk = dl->range->index.current; chk; chk = chk->next) {
+            if(dl->dl_chunk_data != chk->start)
+                continue;
+
+            int count = 0;
+            zckChunk *tgt_chk = chk->src;
+            if(tgt_chk->valid == 1)
+                continue;
+            if(chk->comp_length == tgt_chk->comp_length &&
+               memcmp(chk->digest, tgt_chk->digest,
+                      chk->digest_size) == 0) {
+                dl->tgt_check = tgt_chk;
+                dl->tgt_number = count;
+                if(!hash_init(dl->zck, &(dl->zck->check_chunk_hash),
+                              &(dl->zck->chunk_hash_type)))
+                    return 0;
+                dl->write_in_chunk = chk->comp_length;
+                if(!seek_data(dl->zck,
+                              dl->zck->data_offset + tgt_chk->start,
+                              SEEK_SET))
+                    return 0;
+                dl->range->index.current = chk->next;
+                chk = NULL;
+                tgt_chk = NULL;
                 break;
+            }
         }
     }
     int wb2 = 0;
index 2e82824c288a0841d62e596ba2d60fb47111d99c..e102fa9c40bbbacc6972ab318bb46587fb2d029b 100644 (file)
@@ -54,7 +54,7 @@ static zckRangeItem *range_insert_new(zckCtx *zck, zckRangeItem *prev,
     }
     if(add_index)
         if(!index_new_chunk(zck, &(info->index), idx->digest, idx->digest_size,
-                                end-start+1, end-start+1, false)) {
+                            end-start+1, end-start+1, idx, false)) {
             free(new);
             return NULL;
         }
index b5a372ee183a90c31ceb2f44478c6aacadc18f03..8cbc316ade79c23aee12c08cec7226fd83292ca5 100644 (file)
@@ -60,11 +60,9 @@ static bool finish_chunk(zckIndex *index, zckChunk *item, char *digest,
     if(index->first == NULL) {
         index->first = item;
     } else {
-        zckChunk *tmp = index->first;
-        while(tmp->next)
-            tmp = tmp->next;
-        tmp->next = item;
+        index->last->next = item;
     }
+    index->last = item;
     index->count += 1;
     index->length += item->comp_length;
     return true;
@@ -122,8 +120,9 @@ bool index_create(zckCtx *zck) {
     return true;
 }
 
-bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest, int digest_size,
-                    size_t comp_size, size_t orig_size, bool finished) {
+bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest,
+                     int digest_size, size_t comp_size, size_t orig_size,
+                     zckChunk *src, bool finished) {
     VALIDATE_BOOL(zck);
 
     if(index == NULL) {
@@ -138,6 +137,7 @@ bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest, int digest_size
     index->digest_size = digest_size;
     chk->comp_length = comp_size;
     chk->length = orig_size;
+    chk->src = src;
     return finish_chunk(index, chk, digest, finished, zck);
 }
 
index 92b4bcaafb1f964a7031b7efe9673ce49854fa2f..9445ecb60b6159de53aa058062ba9be2c18fc0fa 100644 (file)
@@ -159,6 +159,7 @@ typedef struct zckChunk {
     size_t comp_length;
     size_t length;
     struct zckChunk *next;
+    struct zckChunk *src;
     zckCtx *zck;
     UT_hash_handle hh;
 } zckChunk;
@@ -170,6 +171,8 @@ typedef struct zckIndex {
     int hash_type;
     size_t digest_size;
     zckChunk *first;
+    zckChunk *last;
+    zckChunk *current;
     zckChunk *ht;
 } zckIndex;
 
@@ -340,7 +343,7 @@ bool index_read(zckCtx *zck, char *data, size_t size, size_t max_length)
 bool index_create(zckCtx *zck)
     __attribute__ ((warn_unused_result));
 bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest, int digest_size,
-                     size_t comp_size, size_t orig_size, bool valid)
+                     size_t comp_size, size_t orig_size, zckChunk *src, bool valid)
     __attribute__ ((warn_unused_result));
 bool index_add_to_chunk(zckCtx *zck, char *data, size_t comp_size,
                         size_t orig_size)