From d3c073bb985110fd4119c2894ebdc8827d86b0b1 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Fri, 22 Mar 2019 22:13:16 +0000 Subject: [PATCH] Speed up zchunk index operations Signed-off-by: Jonathan Dieter --- src/lib/dl/dl.c | 54 ++++++++++++++++++------------------ src/lib/dl/range.c | 2 +- src/lib/index/index_create.c | 12 ++++---- src/lib/zck_private.h | 5 +++- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/lib/dl/dl.c b/src/lib/dl/dl.c index e5e1e57..7e5707c 100644 --- a/src/lib/dl/dl.c +++ b/src/lib/dl/dl.c @@ -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; diff --git a/src/lib/dl/range.c b/src/lib/dl/range.c index 2e82824..e102fa9 100644 --- a/src/lib/dl/range.c +++ b/src/lib/dl/range.c @@ -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; } diff --git a/src/lib/index/index_create.c b/src/lib/index/index_create.c index b5a372e..8cbc316 100644 --- a/src/lib/index/index_create.c +++ b/src/lib/index/index_create.c @@ -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); } diff --git a/src/lib/zck_private.h b/src/lib/zck_private.h index 92b4bca..9445ecb 100644 --- a/src/lib/zck_private.h +++ b/src/lib/zck_private.h @@ -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) -- 2.30.2