Skip to content

Commit c0cadb0

Browse files
pks-tgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent a8305bc commit c0cadb0

File tree

2 files changed

+10
-11
lines changed

2 files changed

+10
-11
lines changed

reftable/block.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -323,30 +323,28 @@ int block_iter_next(struct block_iter *it, struct reftable_record *rec)
323323
.len = it->br->block_len - it->next_off,
324324
};
325325
struct string_view start = in;
326-
struct strbuf key = STRBUF_INIT;
327326
uint8_t extra = 0;
328327
int n = 0;
329328

330329
if (it->next_off >= it->br->block_len)
331330
return 1;
332331

333-
n = reftable_decode_key(&key, &extra, it->last_key, in);
332+
n = reftable_decode_key(&it->key, &extra, it->last_key, in);
334333
if (n < 0)
335334
return -1;
336335

337-
if (!key.len)
336+
if (!it->key.len)
338337
return REFTABLE_FORMAT_ERROR;
339338

340339
string_view_consume(&in, n);
341-
n = reftable_record_decode(rec, key, extra, in, it->br->hash_size);
340+
n = reftable_record_decode(rec, it->key, extra, in, it->br->hash_size);
342341
if (n < 0)
343342
return -1;
344343
string_view_consume(&in, n);
345344

346345
strbuf_reset(&it->last_key);
347-
strbuf_addbuf(&it->last_key, &key);
346+
strbuf_addbuf(&it->last_key, &it->key);
348347
it->next_off += start.len - in.len;
349-
strbuf_release(&key);
350348
return 0;
351349
}
352350

@@ -377,6 +375,7 @@ int block_iter_seek(struct block_iter *it, struct strbuf *want)
377375
void block_iter_close(struct block_iter *it)
378376
{
379377
strbuf_release(&it->last_key);
378+
strbuf_release(&it->key);
380379
}
381380

382381
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,
387386
.r = br,
388387
};
389388
struct reftable_record rec = reftable_new_record(block_reader_type(br));
390-
struct strbuf key = STRBUF_INIT;
391389
int err = 0;
392390
struct block_iter next = BLOCK_ITER_INIT;
393391

@@ -414,8 +412,8 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
414412
if (err < 0)
415413
goto done;
416414

417-
reftable_record_key(&rec, &key);
418-
if (err > 0 || strbuf_cmp(&key, want) >= 0) {
415+
reftable_record_key(&rec, &it->key);
416+
if (err > 0 || strbuf_cmp(&it->key, want) >= 0) {
419417
err = 0;
420418
goto done;
421419
}
@@ -424,8 +422,7 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
424422
}
425423

426424
done:
427-
strbuf_release(&key);
428-
strbuf_release(&next.last_key);
425+
block_iter_close(&next);
429426
reftable_record_release(&rec);
430427

431428
return err;

reftable/block.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ struct block_iter {
8484

8585
/* key for last entry we read. */
8686
struct strbuf last_key;
87+
struct strbuf key;
8788
};
8889

8990
#define BLOCK_ITER_INIT { \
9091
.last_key = STRBUF_INIT, \
92+
.key = STRBUF_INIT, \
9193
}
9294

9395
/* initializes a block reader. */

0 commit comments

Comments
 (0)