reftable/error: discern locked/outdated errors
We currently throw two different errors into a similar-but-different error code: - Errors when trying to lock the reftable stack. - Errors when trying to write to the reftable stack which has been modified concurrently. This results in unclear error handling and user-visible error messages. Create a new `REFTABLE_OUTDATED_ERROR` so that those error conditions can be clearly told apart from each other. Adjust users of the old `REFTABLE_LOCK_ERROR` to use the new error code as required. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
630942a873
commit
af18098c9d
@ -22,7 +22,7 @@ const char *reftable_error_str(int err)
|
||||
case REFTABLE_NOT_EXIST_ERROR:
|
||||
return "file does not exist";
|
||||
case REFTABLE_LOCK_ERROR:
|
||||
return "data is outdated";
|
||||
return "data is locked";
|
||||
case REFTABLE_API_ERROR:
|
||||
return "misuse of the reftable API";
|
||||
case REFTABLE_ZLIB_ERROR:
|
||||
@ -35,6 +35,8 @@ const char *reftable_error_str(int err)
|
||||
return "invalid refname";
|
||||
case REFTABLE_ENTRY_TOO_BIG_ERROR:
|
||||
return "entry too large";
|
||||
case REFTABLE_OUTDATED_ERROR:
|
||||
return "data concurrently modified";
|
||||
case -1:
|
||||
return "general error";
|
||||
default:
|
||||
|
@ -25,7 +25,7 @@ enum reftable_error {
|
||||
*/
|
||||
REFTABLE_NOT_EXIST_ERROR = -4,
|
||||
|
||||
/* Trying to write out-of-date data. */
|
||||
/* Trying to access locked data. */
|
||||
REFTABLE_LOCK_ERROR = -5,
|
||||
|
||||
/* Misuse of the API:
|
||||
@ -57,6 +57,9 @@ enum reftable_error {
|
||||
/* Entry does not fit. This can happen when writing outsize reflog
|
||||
messages. */
|
||||
REFTABLE_ENTRY_TOO_BIG_ERROR = -11,
|
||||
|
||||
/* Trying to write out-of-date data. */
|
||||
REFTABLE_OUTDATED_ERROR = -12,
|
||||
};
|
||||
|
||||
/* convert the numeric error code to a string. The string should not be
|
||||
|
@ -529,9 +529,9 @@ int reftable_stack_add(struct reftable_stack *st,
|
||||
{
|
||||
int err = stack_try_add(st, write, arg);
|
||||
if (err < 0) {
|
||||
if (err == REFTABLE_LOCK_ERROR) {
|
||||
if (err == REFTABLE_OUTDATED_ERROR) {
|
||||
/* Ignore error return, we want to propagate
|
||||
REFTABLE_LOCK_ERROR.
|
||||
REFTABLE_OUTDATED_ERROR.
|
||||
*/
|
||||
reftable_stack_reload(st);
|
||||
}
|
||||
@ -591,7 +591,7 @@ static int reftable_stack_init_addition(struct reftable_addition *add,
|
||||
if (err < 0)
|
||||
goto done;
|
||||
if (err > 0) {
|
||||
err = REFTABLE_LOCK_ERROR;
|
||||
err = REFTABLE_OUTDATED_ERROR;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,7 @@ static void test_reftable_stack_uptodate(void)
|
||||
EXPECT_ERR(err);
|
||||
|
||||
err = reftable_stack_add(st2, &write_test_ref, &ref2);
|
||||
EXPECT(err == REFTABLE_LOCK_ERROR);
|
||||
EXPECT(err == REFTABLE_OUTDATED_ERROR);
|
||||
|
||||
err = reftable_stack_reload(st2);
|
||||
EXPECT_ERR(err);
|
||||
|
Reference in New Issue
Block a user