Skip to content

Commit 5809004

Browse files
committed
Merge branch 'ps/reftable-fixes' into ps/reftable-fixes-and-optims
* ps/reftable-fixes: reftable/block: reuse buffer to compute record keys reftable/block: introduce macro to initialize `struct block_iter` reftable/merged: reuse buffer to compute record keys reftable/stack: fix use of unseeded randomness reftable/stack: fix stale lock when dying reftable/stack: reuse buffers when reloading stack reftable/stack: perform auto-compaction with transactional interface reftable/stack: verify that `reftable_stack_add()` uses auto-compaction reftable: handle interrupted writes reftable: handle interrupted reads reftable: wrap EXPECT macros in do/while
2 parents 624eb90 + c0cadb0 commit 5809004

File tree

12 files changed

+213
-114
lines changed

12 files changed

+213
-114
lines changed

reftable/block.c

Lines changed: 9 additions & 14 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,11 +386,8 @@ 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;
392-
struct block_iter next = {
393-
.last_key = STRBUF_INIT,
394-
};
390+
struct block_iter next = BLOCK_ITER_INIT;
395391

396392
int i = binsearch(br->restart_count, &restart_key_less, &args);
397393
if (args.error) {
@@ -416,8 +412,8 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
416412
if (err < 0)
417413
goto done;
418414

419-
reftable_record_key(&rec, &key);
420-
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) {
421417
err = 0;
422418
goto done;
423419
}
@@ -426,8 +422,7 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
426422
}
427423

428424
done:
429-
strbuf_release(&key);
430-
strbuf_release(&next.last_key);
425+
block_iter_close(&next);
431426
reftable_record_release(&rec);
432427

433428
return err;

reftable/block.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,14 @@ struct block_iter {
8484

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

90+
#define BLOCK_ITER_INIT { \
91+
.last_key = STRBUF_INIT, \
92+
.key = STRBUF_INIT, \
93+
}
94+
8995
/* initializes a block reader. */
9096
int block_reader_init(struct block_reader *br, struct reftable_block *bl,
9197
uint32_t header_off, uint32_t table_block_size,

reftable/block_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static void test_block_read_write(void)
3232
int i = 0;
3333
int n;
3434
struct block_reader br = { 0 };
35-
struct block_iter it = { .last_key = STRBUF_INIT };
35+
struct block_iter it = BLOCK_ITER_INIT;
3636
int j = 0;
3737
struct strbuf want = STRBUF_INIT;
3838

@@ -87,7 +87,7 @@ static void test_block_read_write(void)
8787
block_iter_close(&it);
8888

8989
for (i = 0; i < N; i++) {
90-
struct block_iter it = { .last_key = STRBUF_INIT };
90+
struct block_iter it = BLOCK_ITER_INIT;
9191
strbuf_reset(&want);
9292
strbuf_addstr(&want, names[i]);
9393

reftable/blocksource.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ static int file_read_block(void *v, struct reftable_block *dest, uint64_t off,
109109
struct file_block_source *b = v;
110110
assert(off + size <= b->size);
111111
dest->data = reftable_malloc(size);
112-
if (pread(b->fd, dest->data, size, off) != size)
112+
if (pread_in_full(b->fd, dest->data, size, off) != size)
113113
return -1;
114114
dest->len = size;
115115
return size;

reftable/iter.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ struct indexed_table_ref_iter {
5353
int is_finished;
5454
};
5555

56-
#define INDEXED_TABLE_REF_ITER_INIT \
57-
{ \
58-
.cur = { .last_key = STRBUF_INIT }, .oid = STRBUF_INIT, \
59-
}
56+
#define INDEXED_TABLE_REF_ITER_INIT { \
57+
.cur = BLOCK_ITER_INIT, \
58+
.oid = STRBUF_INIT, \
59+
}
6060

6161
void iterator_from_indexed_table_ref_iter(struct reftable_iterator *it,
6262
struct indexed_table_ref_iter *itr);

reftable/merged.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ static void merged_iter_close(void *p)
5252
reftable_iterator_destroy(&mi->stack[i]);
5353
}
5454
reftable_free(mi->stack);
55+
strbuf_release(&mi->key);
56+
strbuf_release(&mi->entry_key);
5557
}
5658

5759
static int merged_iter_advance_nonnull_subiter(struct merged_iter *mi,
@@ -85,7 +87,6 @@ static int merged_iter_advance_subiter(struct merged_iter *mi, size_t idx)
8587
static int merged_iter_next_entry(struct merged_iter *mi,
8688
struct reftable_record *rec)
8789
{
88-
struct strbuf entry_key = STRBUF_INIT;
8990
struct pq_entry entry = { 0 };
9091
int err = 0;
9192

@@ -105,33 +106,31 @@ static int merged_iter_next_entry(struct merged_iter *mi,
105106
such a deployment, the loop below must be changed to collect all
106107
entries for the same key, and return new the newest one.
107108
*/
108-
reftable_record_key(&entry.rec, &entry_key);
109+
reftable_record_key(&entry.rec, &mi->entry_key);
109110
while (!merged_iter_pqueue_is_empty(mi->pq)) {
110111
struct pq_entry top = merged_iter_pqueue_top(mi->pq);
111-
struct strbuf k = STRBUF_INIT;
112-
int err = 0, cmp = 0;
112+
int cmp = 0;
113113

114-
reftable_record_key(&top.rec, &k);
114+
reftable_record_key(&top.rec, &mi->key);
115115

116-
cmp = strbuf_cmp(&k, &entry_key);
117-
strbuf_release(&k);
118-
119-
if (cmp > 0) {
116+
cmp = strbuf_cmp(&mi->key, &mi->entry_key);
117+
if (cmp > 0)
120118
break;
121-
}
122119

123120
merged_iter_pqueue_remove(&mi->pq);
124121
err = merged_iter_advance_subiter(mi, top.index);
125-
if (err < 0) {
126-
return err;
127-
}
122+
if (err < 0)
123+
goto done;
128124
reftable_record_release(&top.rec);
129125
}
130126

131127
reftable_record_copy_from(rec, &entry.rec, hash_size(mi->hash_id));
128+
129+
done:
132130
reftable_record_release(&entry.rec);
133-
strbuf_release(&entry_key);
134-
return 0;
131+
strbuf_release(&mi->entry_key);
132+
strbuf_release(&mi->key);
133+
return err;
135134
}
136135

137136
static int merged_iter_next(struct merged_iter *mi, struct reftable_record *rec)
@@ -248,6 +247,8 @@ static int merged_table_seek_record(struct reftable_merged_table *mt,
248247
.typ = reftable_record_type(rec),
249248
.hash_id = mt->hash_id,
250249
.suppress_deletions = mt->suppress_deletions,
250+
.key = STRBUF_INIT,
251+
.entry_key = STRBUF_INIT,
251252
};
252253
int n = 0;
253254
int err = 0;

reftable/merged.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ struct merged_iter {
3131
uint8_t typ;
3232
int suppress_deletions;
3333
struct merged_iter_pqueue pq;
34+
struct strbuf key;
35+
struct strbuf entry_key;
3436
};
3537

3638
void merged_table_release(struct reftable_merged_table *mt);

reftable/reader.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,9 @@ struct table_iter {
224224
struct block_iter bi;
225225
int is_finished;
226226
};
227-
#define TABLE_ITER_INIT \
228-
{ \
229-
.bi = {.last_key = STRBUF_INIT } \
230-
}
227+
#define TABLE_ITER_INIT { \
228+
.bi = BLOCK_ITER_INIT \
229+
}
231230

232231
static void table_iter_copy_from(struct table_iter *dest,
233232
struct table_iter *src)

reftable/readwrite_test.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ static void test_log_buffer_size(void)
141141
*/
142142
uint8_t hash1[GIT_SHA1_RAWSZ], hash2[GIT_SHA1_RAWSZ];
143143
for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
144-
hash1[i] = (uint8_t)(rand() % 256);
145-
hash2[i] = (uint8_t)(rand() % 256);
144+
hash1[i] = (uint8_t)(git_rand() % 256);
145+
hash2[i] = (uint8_t)(git_rand() % 256);
146146
}
147147
log.value.update.old_hash = hash1;
148148
log.value.update.new_hash = hash2;
@@ -320,7 +320,7 @@ static void test_log_zlib_corruption(void)
320320
};
321321

322322
for (i = 0; i < sizeof(message) - 1; i++)
323-
message[i] = (uint8_t)(rand() % 64 + ' ');
323+
message[i] = (uint8_t)(git_rand() % 64 + ' ');
324324

325325
reftable_writer_set_limits(w, 1, 1);
326326

0 commit comments

Comments
 (0)