Git fork

Merge branch 'ps/reftable-read-block-perffix'

Performance regression in not-yet-released code has been corrected.

* ps/reftable-read-block-perffix:
reftable: fix perf regression when reading blocks of unwanted type

+19 -17
+6 -1
reftable/block.c
··· 227 int reftable_block_init(struct reftable_block *block, 228 struct reftable_block_source *source, 229 uint32_t offset, uint32_t header_size, 230 - uint32_t table_block_size, uint32_t hash_size) 231 { 232 uint32_t guess_block_size = table_block_size ? 233 table_block_size : DEFAULT_BLOCK_SIZE; ··· 245 block_type = block->block_data.data[header_size]; 246 if (!reftable_is_block_type(block_type)) { 247 err = REFTABLE_FORMAT_ERROR; 248 goto done; 249 } 250
··· 227 int reftable_block_init(struct reftable_block *block, 228 struct reftable_block_source *source, 229 uint32_t offset, uint32_t header_size, 230 + uint32_t table_block_size, uint32_t hash_size, 231 + uint8_t want_type) 232 { 233 uint32_t guess_block_size = table_block_size ? 234 table_block_size : DEFAULT_BLOCK_SIZE; ··· 246 block_type = block->block_data.data[header_size]; 247 if (!reftable_is_block_type(block_type)) { 248 err = REFTABLE_FORMAT_ERROR; 249 + goto done; 250 + } 251 + if (want_type != REFTABLE_BLOCK_TYPE_ANY && block_type != want_type) { 252 + err = 1; 253 goto done; 254 } 255
+2 -1
reftable/reftable-block.h
··· 56 int reftable_block_init(struct reftable_block *b, 57 struct reftable_block_source *source, 58 uint32_t offset, uint32_t header_size, 59 - uint32_t table_block_size, uint32_t hash_size); 60 61 /* Release resources allocated by the block. */ 62 void reftable_block_release(struct reftable_block *b);
··· 56 int reftable_block_init(struct reftable_block *b, 57 struct reftable_block_source *source, 58 uint32_t offset, uint32_t header_size, 59 + uint32_t table_block_size, uint32_t hash_size, 60 + uint8_t want_type); 61 62 /* Release resources allocated by the block. */ 63 void reftable_block_release(struct reftable_block *b);
+1 -10
reftable/table.c
··· 173 return 1; 174 175 err = reftable_block_init(block, &t->source, next_off, header_off, 176 - t->block_size, hash_size(t->hash_id)); 177 - if (err < 0) 178 - goto done; 179 - 180 - if (want_typ != REFTABLE_BLOCK_TYPE_ANY && block->block_type != want_typ) { 181 - err = 1; 182 - goto done; 183 - } 184 - 185 - done: 186 if (err) 187 reftable_block_release(block); 188 return err;
··· 173 return 1; 174 175 err = reftable_block_init(block, &t->source, next_off, header_off, 176 + t->block_size, hash_size(t->hash_id), want_typ); 177 if (err) 178 reftable_block_release(block); 179 return err;
+10 -5
t/unit-tests/t-reftable-block.c
··· 64 block_writer_release(&bw); 65 66 block_source_from_buf(&source ,&block_data); 67 - reftable_block_init(&block, &source, 0, header_off, block_size, REFTABLE_HASH_SIZE_SHA1); 68 69 block_iter_init(&it, &block); 70 ··· 153 block_writer_release(&bw); 154 155 block_source_from_buf(&source, &block_data); 156 - reftable_block_init(&block, &source, 0, header_off, block_size, REFTABLE_HASH_SIZE_SHA1); 157 158 block_iter_init(&it, &block); 159 ··· 245 block_writer_release(&bw); 246 247 block_source_from_buf(&source, &block_data); 248 - reftable_block_init(&block, &source, 0, header_off, block_size, REFTABLE_HASH_SIZE_SHA1); 249 250 block_iter_init(&it, &block); 251 ··· 329 block_writer_release(&bw); 330 331 block_source_from_buf(&source, &block_data); 332 - reftable_block_init(&block, &source, 0, header_off, block_size, REFTABLE_HASH_SIZE_SHA1); 333 334 block_iter_init(&it, &block); 335 ··· 411 check_int(err, >, 0); 412 413 block_source_from_buf(&source, &data); 414 - reftable_block_init(&block, &source, 0, 0, data.len, REFTABLE_HASH_SIZE_SHA1); 415 416 err = reftable_block_init_iterator(&block, &it); 417 check_int(err, ==, 0);
··· 64 block_writer_release(&bw); 65 66 block_source_from_buf(&source ,&block_data); 67 + reftable_block_init(&block, &source, 0, header_off, block_size, 68 + REFTABLE_HASH_SIZE_SHA1, REFTABLE_BLOCK_TYPE_REF); 69 70 block_iter_init(&it, &block); 71 ··· 154 block_writer_release(&bw); 155 156 block_source_from_buf(&source, &block_data); 157 + reftable_block_init(&block, &source, 0, header_off, block_size, 158 + REFTABLE_HASH_SIZE_SHA1, REFTABLE_BLOCK_TYPE_LOG); 159 160 block_iter_init(&it, &block); 161 ··· 247 block_writer_release(&bw); 248 249 block_source_from_buf(&source, &block_data); 250 + reftable_block_init(&block, &source, 0, header_off, block_size, 251 + REFTABLE_HASH_SIZE_SHA1, REFTABLE_BLOCK_TYPE_OBJ); 252 253 block_iter_init(&it, &block); 254 ··· 332 block_writer_release(&bw); 333 334 block_source_from_buf(&source, &block_data); 335 + reftable_block_init(&block, &source, 0, header_off, block_size, 336 + REFTABLE_HASH_SIZE_SHA1, REFTABLE_BLOCK_TYPE_INDEX); 337 338 block_iter_init(&it, &block); 339 ··· 415 check_int(err, >, 0); 416 417 block_source_from_buf(&source, &data); 418 + reftable_block_init(&block, &source, 0, 0, data.len, 419 + REFTABLE_HASH_SIZE_SHA1, REFTABLE_BLOCK_TYPE_REF); 420 421 err = reftable_block_init_iterator(&block, &it); 422 check_int(err, ==, 0);