reftable/block: reuse buffer to compute record keys
When iterating over entries in the block iterator we compute the key of each of the entries and write it into a buffer. We do not reuse the buffer though and thus re-allocate it on every iteration, which is wasteful. Refactor the code to reuse the buffer. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
a8305bc6d8
commit
c0cadb0576
|
@ -323,30 +323,28 @@ int block_iter_next(struct block_iter *it, struct reftable_record *rec)
|
||||||
.len = it->br->block_len - it->next_off,
|
.len = it->br->block_len - it->next_off,
|
||||||
};
|
};
|
||||||
struct string_view start = in;
|
struct string_view start = in;
|
||||||
struct strbuf key = STRBUF_INIT;
|
|
||||||
uint8_t extra = 0;
|
uint8_t extra = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
if (it->next_off >= it->br->block_len)
|
if (it->next_off >= it->br->block_len)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
n = reftable_decode_key(&key, &extra, it->last_key, in);
|
n = reftable_decode_key(&it->key, &extra, it->last_key, in);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!key.len)
|
if (!it->key.len)
|
||||||
return REFTABLE_FORMAT_ERROR;
|
return REFTABLE_FORMAT_ERROR;
|
||||||
|
|
||||||
string_view_consume(&in, n);
|
string_view_consume(&in, n);
|
||||||
n = reftable_record_decode(rec, key, extra, in, it->br->hash_size);
|
n = reftable_record_decode(rec, it->key, extra, in, it->br->hash_size);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return -1;
|
return -1;
|
||||||
string_view_consume(&in, n);
|
string_view_consume(&in, n);
|
||||||
|
|
||||||
strbuf_reset(&it->last_key);
|
strbuf_reset(&it->last_key);
|
||||||
strbuf_addbuf(&it->last_key, &key);
|
strbuf_addbuf(&it->last_key, &it->key);
|
||||||
it->next_off += start.len - in.len;
|
it->next_off += start.len - in.len;
|
||||||
strbuf_release(&key);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,6 +375,7 @@ int block_iter_seek(struct block_iter *it, struct strbuf *want)
|
||||||
void block_iter_close(struct block_iter *it)
|
void block_iter_close(struct block_iter *it)
|
||||||
{
|
{
|
||||||
strbuf_release(&it->last_key);
|
strbuf_release(&it->last_key);
|
||||||
|
strbuf_release(&it->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
int block_reader_seek(struct block_reader *br, struct block_iter *it,
|
int block_reader_seek(struct block_reader *br, struct block_iter *it,
|
||||||
|
@ -387,7 +386,6 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
|
||||||
.r = br,
|
.r = br,
|
||||||
};
|
};
|
||||||
struct reftable_record rec = reftable_new_record(block_reader_type(br));
|
struct reftable_record rec = reftable_new_record(block_reader_type(br));
|
||||||
struct strbuf key = STRBUF_INIT;
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct block_iter next = BLOCK_ITER_INIT;
|
struct block_iter next = BLOCK_ITER_INIT;
|
||||||
|
|
||||||
|
@ -414,8 +412,8 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
reftable_record_key(&rec, &key);
|
reftable_record_key(&rec, &it->key);
|
||||||
if (err > 0 || strbuf_cmp(&key, want) >= 0) {
|
if (err > 0 || strbuf_cmp(&it->key, want) >= 0) {
|
||||||
err = 0;
|
err = 0;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -424,8 +422,7 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
strbuf_release(&key);
|
block_iter_close(&next);
|
||||||
strbuf_release(&next.last_key);
|
|
||||||
reftable_record_release(&rec);
|
reftable_record_release(&rec);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -84,10 +84,12 @@ struct block_iter {
|
||||||
|
|
||||||
/* key for last entry we read. */
|
/* key for last entry we read. */
|
||||||
struct strbuf last_key;
|
struct strbuf last_key;
|
||||||
|
struct strbuf key;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BLOCK_ITER_INIT { \
|
#define BLOCK_ITER_INIT { \
|
||||||
.last_key = STRBUF_INIT, \
|
.last_key = STRBUF_INIT, \
|
||||||
|
.key = STRBUF_INIT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initializes a block reader. */
|
/* initializes a block reader. */
|
||||||
|
|
Loading…
Reference in New Issue