This patch series attempts to avoid making an assumption regarding error codes returned by block_writer_add(). Changes since v4: - update commit message. - add documentation comment. Meet Soni (3): reftable: propagate specific error codes in block_writer_add() reftable: adapt writer_add_record() to propagate block_writer_add() errors reftable: adapt write_object_record() to propagate block_writer_add() errors reftable/block.c | 13 ++++++------ reftable/block.h | 2 +- reftable/record.c | 53 +++++++++++++++++++++-------------------------- reftable/writer.c | 34 +++++++++++++++++++++--------- 4 files changed, 56 insertions(+), 46 deletions(-) Range-diff against v4: 1: 6ab35d569c = 1: 6ab35d569c reftable: propagate specific error codes in block_writer_add() 2: 7f0bdc27e1 ! 2: 873a991a2c reftable: adapt writer_add_record() to propagate block_writer_add() errors @@ Metadata ## Commit message ## reftable: adapt writer_add_record() to propagate block_writer_add() errors - Previously, writer_add_record() would flush the current block and - retry appending the record whenever block_writer_add() returned any - nonzero error. This forced an assumption that every failure meant - the block was full, even when errors such as memory allocation or I/O - failures occurred. + Previously, writer_add_record() would flush the current block and retry + appending the record whenever block_writer_add() returned any nonzero + error. This forced an assumption that every failure meant the block was + full, even when errors such as memory allocation or I/O failures occurred. - Update the writer_add_record() to inspect the error code returned by - block_writer_add() and only flush and reinitialize the writer when the - error is REFTABLE_ENTRY_TOO_BIG_ERROR. For any other error, immediately - propagate it. + Update the writer_add_record() to inspect the error code returned by + block_writer_add() and only flush and reinitialize the writer when the + error is REFTABLE_ENTRY_TOO_BIG_ERROR. For any other error, immediately + propagate it. Signed-off-by: Meet Soni <meetsoni3017@xxxxxxxxx> 3: 480ac27797 ! 3: 1e2f7ff83f reftable: adapt write_object_record() to propagate block_writer_add() errors @@ Metadata ## Commit message ## reftable: adapt write_object_record() to propagate block_writer_add() errors - Previously, write_object_record() would flush the current block and - retry appending the record whenever block_writer_add() returned any - nonzero error. This forced an assumption that every failure meant the - block was full, even when errors such as memory allocation or I/O - failures occurred. + Previously, write_object_record() would flush the current block and retry + appending the record whenever block_writer_add() returned any nonzero + error. This forced an assumption that every failure meant the block was + full, even when errors such as memory allocation or I/O failures occurred. - Update the write_object_record() to inspect the error code returned by - block_writer_add() and only flush and reinitialize the writer when the - error is REFTABLE_ENTRY_TOO_BIG_ERROR. For any other error, immediately - propagate it. + Update the write_object_record() to inspect the error code returned by + block_writer_add() and flush and reinitialize the writer iff the + error is REFTABLE_ENTRY_TOO_BIG_ERROR. For any other error, immediately + propagate it. - All call sites now handle various error codes returned by - block_writer_add(). + If the flush and reinitialization still fail with + REFTABLE_ENTRY_TOO_BIG_ERROR, reset the record's offset length to zero + before a final attempt. + + All call sites now handle various error codes returned by + block_writer_add(). Signed-off-by: Meet Soni <meetsoni3017@xxxxxxxxx> @@ reftable/writer.c: static void write_object_record(void *void_arg, void *key) arg->err = writer_flush_block(arg->w); if (arg->err < 0) goto done; +@@ reftable/writer.c: static void write_object_record(void *void_arg, void *key) + if (arg->err < 0) + goto done; + ++ /* ++ * If this still fails then we may need to reset record's offset ++ * length to reduce the data size to be written. ++ */ + arg->err = block_writer_add(arg->w->block_writer, &rec); + if (arg->err == 0) + goto done; + ++ if (arg->err != REFTABLE_ENTRY_TOO_BIG_ERROR) ++ goto done; ++ + rec.u.obj.offset_len = 0; + arg->err = block_writer_add(arg->w->block_writer, &rec); + -- 2.34.1