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