Improve error messages when a backend is cancelled by deadlock detection

We send SIGINT to a backend that is cancelled due to a deadlock. That
approach ends up being a very confusing error message.

With this commit we intercept the error messages and show a more
meaningful error message to the user.
pull/1529/head
Onder Kalaci 2017-08-11 11:43:13 +03:00
parent be4fc45c03
commit 66936053a0
1 changed files with 25 additions and 0 deletions

View File

@ -57,6 +57,7 @@ static char *CitusVersion = CITUS_VERSION;
void _PG_init(void);
static void multi_log_hook(ErrorData *edata);
static void CreateRequiredDirectories(void);
static void RegisterCitusConfigVariables(void);
static void WarningForEnableDeadlockPrevention(bool newval, void *extra);
@ -175,6 +176,9 @@ _PG_init(void)
set_rel_pathlist_hook = multi_relation_restriction_hook;
set_join_pathlist_hook = multi_join_restriction_hook;
/* register hook for error messages */
emit_log_hook = multi_log_hook;
InitializeMaintenanceDaemon();
/* organize that task tracker is started once server is up */
@ -195,6 +199,27 @@ _PG_init(void)
}
/*
* multi_log_hook intercepts postgres log commands. We use this to override
* postgres error messages when they're not specific enough for the users.
*/
static void
multi_log_hook(ErrorData *edata)
{
/*
* Show the user a meaningful error message when a backend is cancelled
* by the distributed deadlock detection.
*/
if (edata->elevel == ERROR && edata->sqlerrcode == ERRCODE_QUERY_CANCELED &&
MyBackendGotCancelledDueToDeadlock())
{
edata->sqlerrcode = ERRCODE_T_R_DEADLOCK_DETECTED;
edata->message = "canceling the transaction since it has "
"involved in a distributed deadlock";
}
}
/*
* StartupCitusBackend initializes per-backend infrastructure, and is called
* the first time citus is used in a database.