Skip to content

Commit 156d79c

Browse files
pks-tgitster
authored andcommitted
reftable/block: store block pointer in the block iterator
The block iterator requires access to a bunch of data from the underlying `reftable_block` that it is iterating over. This data is stored by copying over relevant data into a separate set of variables. This has multiple downsides: - We require more storage space than necessary. This is more of a theoretical issue as we shouldn't ever have many blocks. - We have to perform more bookkeeping, and the variable names are inconsistent across the two data structures. This can lead to some confusion. - The lifetime of the block iterator is tied to the block anyway, but we hide that a bit by only storing pointers pointing into the block. There isn't really any good reason why we rip out parts of the block instead of storing a pointer to the block itself. Refactor the code to do so. Despite being simpler, it also allows us to decouple the lifetime of the block iterator from seeking in a subsequent commit. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 655e18d commit 156d79c

File tree

2 files changed

+9
-17
lines changed

2 files changed

+9
-17
lines changed

reftable/block.c

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -381,13 +381,11 @@ static uint32_t block_restart_offset(const struct reftable_block *b, size_t idx)
381381
return reftable_get_be24(b->block_data.data + b->restart_off + 3 * idx);
382382
}
383383

384-
void block_iter_seek_start(struct block_iter *it, const struct reftable_block *b)
384+
void block_iter_seek_start(struct block_iter *it, const struct reftable_block *block)
385385
{
386-
it->block = b->block_data.data;
387-
it->block_len = b->restart_off;
388-
it->hash_size = b->hash_size;
386+
it->block = block;
389387
reftable_buf_reset(&it->last_key);
390-
it->next_off = b->header_off + 4;
388+
it->next_off = block->header_off + 4;
391389
}
392390

393391
struct restart_needle_less_args {
@@ -435,14 +433,14 @@ static int restart_needle_less(size_t idx, void *_args)
435433
int block_iter_next(struct block_iter *it, struct reftable_record *rec)
436434
{
437435
struct string_view in = {
438-
.buf = (unsigned char *) it->block + it->next_off,
439-
.len = it->block_len - it->next_off,
436+
.buf = (unsigned char *) it->block->block_data.data + it->next_off,
437+
.len = it->block->restart_off - it->next_off,
440438
};
441439
struct string_view start = in;
442440
uint8_t extra = 0;
443441
int n = 0;
444442

445-
if (it->next_off >= it->block_len)
443+
if (it->next_off >= it->block->restart_off)
446444
return 1;
447445

448446
n = reftable_decode_key(&it->last_key, &extra, in);
@@ -452,7 +450,7 @@ int block_iter_next(struct block_iter *it, struct reftable_record *rec)
452450
return REFTABLE_FORMAT_ERROR;
453451

454452
string_view_consume(&in, n);
455-
n = reftable_record_decode(rec, it->last_key, extra, in, it->hash_size,
453+
n = reftable_record_decode(rec, it->last_key, extra, in, it->block->hash_size,
456454
&it->scratch);
457455
if (n < 0)
458456
return -1;
@@ -467,8 +465,6 @@ void block_iter_reset(struct block_iter *it)
467465
reftable_buf_reset(&it->last_key);
468466
it->next_off = 0;
469467
it->block = NULL;
470-
it->block_len = 0;
471-
it->hash_size = 0;
472468
}
473469

474470
void block_iter_close(struct block_iter *it)
@@ -528,9 +524,7 @@ int block_iter_seek_key(struct block_iter *it, const struct reftable_block *bloc
528524
it->next_off = block_restart_offset(block, i - 1);
529525
else
530526
it->next_off = block->header_off + 4;
531-
it->block = block->block_data.data;
532-
it->block_len = block->restart_off;
533-
it->hash_size = block->hash_size;
527+
it->block = block;
534528

535529
err = reftable_record_init(&rec, reftable_block_type(block));
536530
if (err < 0)

reftable/block.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ void block_writer_release(struct block_writer *bw);
6767
struct block_iter {
6868
/* offset within the block of the next entry to read. */
6969
uint32_t next_off;
70-
const unsigned char *block;
71-
size_t block_len;
72-
uint32_t hash_size;
70+
const struct reftable_block *block;
7371

7472
/* key for last entry we read. */
7573
struct reftable_buf last_key;

0 commit comments

Comments
 (0)