object-file: propagate files transaction errors
The "files" transaction backend may encounter errors related to managing
the temporary directory used to stage objects, but silently ignores
these errors. Instead return errors encountered in the
`odb_transaction_files_{prepare,begin,commit}()` interfaces to allow
callers to handle them as needed.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
parent
926618e78c
commit
6d017185e3
|
|
@ -499,7 +499,7 @@ struct odb_transaction_files {
|
|||
struct transaction_packfile packfile;
|
||||
};
|
||||
|
||||
static void odb_transaction_files_prepare(struct odb_transaction *base)
|
||||
static int odb_transaction_files_prepare(struct odb_transaction *base)
|
||||
{
|
||||
struct odb_transaction_files *transaction =
|
||||
container_of_or_null(base, struct odb_transaction_files, base);
|
||||
|
|
@ -511,11 +511,15 @@ static void odb_transaction_files_prepare(struct odb_transaction *base)
|
|||
* added at the time they call odb_transaction_files_begin.
|
||||
*/
|
||||
if (!transaction || transaction->objdir)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
transaction->objdir = tmp_objdir_create(base->source->odb->repo, "bulk-fsync");
|
||||
if (transaction->objdir)
|
||||
tmp_objdir_replace_primary_odb(transaction->objdir, 0);
|
||||
if (!transaction->objdir)
|
||||
return error(_("unable to create temporary object directory"));
|
||||
|
||||
tmp_objdir_replace_primary_odb(transaction->objdir, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void odb_transaction_files_fsync(struct odb_transaction *base,
|
||||
|
|
@ -1637,7 +1641,7 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void odb_transaction_files_commit(struct odb_transaction *base)
|
||||
static int odb_transaction_files_commit(struct odb_transaction *base)
|
||||
{
|
||||
struct odb_transaction_files *transaction =
|
||||
container_of(base, struct odb_transaction_files, base);
|
||||
|
|
@ -1666,14 +1670,19 @@ static void odb_transaction_files_commit(struct odb_transaction *base)
|
|||
* Make the object files visible in the primary ODB after their data is
|
||||
* fully durable.
|
||||
*/
|
||||
tmp_objdir_migrate(transaction->objdir);
|
||||
if (tmp_objdir_migrate(transaction->objdir))
|
||||
return error(_("unable to migrate temporary objects"));
|
||||
|
||||
transaction->objdir = NULL;
|
||||
}
|
||||
|
||||
flush_packfile_transaction(transaction);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
|
||||
int odb_transaction_files_begin(struct odb_source *source,
|
||||
struct odb_transaction **out)
|
||||
{
|
||||
struct odb_transaction_files *transaction;
|
||||
|
||||
|
|
@ -1681,6 +1690,7 @@ struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
|
|||
transaction->base.source = source;
|
||||
transaction->base.commit = odb_transaction_files_commit;
|
||||
transaction->base.write_object_stream = odb_transaction_files_write_object_stream;
|
||||
*out = &transaction->base;
|
||||
|
||||
return &transaction->base;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ struct odb_transaction;
|
|||
* multiple objects. odb_transaction_files_commit must be called
|
||||
* to make new objects visible.
|
||||
*/
|
||||
struct odb_transaction *odb_transaction_files_begin(struct odb_source *source);
|
||||
int odb_transaction_files_begin(struct odb_source *source,
|
||||
struct odb_transaction **out);
|
||||
|
||||
#endif /* OBJECT_FILE_H */
|
||||
|
|
|
|||
|
|
@ -182,11 +182,7 @@ static int odb_source_files_write_object_stream(struct odb_source *source,
|
|||
static int odb_source_files_begin_transaction(struct odb_source *source,
|
||||
struct odb_transaction **out)
|
||||
{
|
||||
struct odb_transaction *tx = odb_transaction_files_begin(source);
|
||||
if (!tx)
|
||||
return -1;
|
||||
*out = tx;
|
||||
return 0;
|
||||
return odb_transaction_files_begin(source, out);
|
||||
}
|
||||
|
||||
static int odb_source_files_read_alternates(struct odb_source *source,
|
||||
|
|
|
|||
|
|
@ -16,8 +16,11 @@ struct odb_transaction {
|
|||
/* The ODB source the transaction is opened against. */
|
||||
struct odb_source *source;
|
||||
|
||||
/* The ODB source specific callback invoked to commit a transaction. */
|
||||
void (*commit)(struct odb_transaction *transaction);
|
||||
/*
|
||||
* The ODB source specific callback invoked to commit a transaction.
|
||||
* Returns 0 on success, a negative error code otherwise.
|
||||
*/
|
||||
int (*commit)(struct odb_transaction *transaction);
|
||||
|
||||
/*
|
||||
* This callback is expected to write the given object stream into
|
||||
|
|
|
|||
Loading…
Reference in New Issue