From 53077693e161368f6c33b73a2f967fe490c36838 Mon Sep 17 00:00:00 2001 From: Nick Vatamaniuc Date: Thu, 25 Mar 2021 18:42:18 -0400 Subject: [PATCH] Add ERLFDB_IS_RETRYABLE/2 guard This is a guard which may be used to catch and handle retryable errors. It's more ergonomic as a guard than a function, since the handler won't have to catch and re-throw unwanted (non-retryable) exceptions. Along with a guard, some common FDB error codes are also defined. It's not an exhaustive list and mostly consists of retryable and a few other common errors. --- include/erlfdb.hrl | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/include/erlfdb.hrl b/include/erlfdb.hrl index e67c542..a8acb50 100644 --- a/include/erlfdb.hrl +++ b/include/erlfdb.hrl @@ -31,6 +31,38 @@ end)()). +% Most of the retriable FDB errors. The list of errors can be generated with +% something like [erlfdb:get_error_string(C) || C <- lists:seq(1, 5000), +% erlfdb:error_predicate(retryable, C)]. +% +-define(ERLFDB_TIMED_OUT, 1004). +-define(ERLFDB_TRANSACTION_TOO_OLD, 1007). +-define(ERLFDB_FUTURE_VERSION, 1009). +-define(ERLFDB_NOT_COMMITTED, 1020). +-define(ERLFDB_COMMIT_UNKNOWN_RESULT, 1021). +-define(ERLFDB_TRANSACTION_CANCELLED, 1025). +-define(ERLFDB_TRANSACTION_TIMED_OUT, 1031). +-define(ERLFDB_PROCESS_BEHIND, 1037). +-define(ERLFDB_DATABASE_LOCKED, 1038). +-define(ERLFDB_CLUSTER_VERSION_CHANGED, 1039). +-define(ERLFDB_PROXY_MEMORY_LIMIT_EXCEEDED, 1042). +-define(ERLFDB_BATCH_TRANSACTION_THROTTLED, 1051). +-define(ERLFDB_TAG_THROTTLED, 1213). +-define(ERLFDB_TRANSACTION_TOO_LARGE, 2101). - - +% The list is the exact result from calling `error_predicate/2` and does not +% include ?TRANSACTION_TIMED_OUT. In some cases it may make sense to also +% consider that error as retryable. +% +-define(ERLFDB_IS_RETRYABLE(Code), ( + (Code == ?ERLFDB_TRANSACTION_TOO_OLD) orelse + (Code == ?ERLFDB_FUTURE_VERSION) orelse + (Code == ?ERLFDB_NOT_COMMITTED) orelse + (Code == ?ERLFDB_COMMIT_UNKNOWN_RESULT) orelse + (Code == ?ERLFDB_PROCESS_BEHIND) orelse + (Code == ?ERLFDB_DATABASE_LOCKED) orelse + (Code == ?ERLFDB_CLUSTER_VERSION_CHANGED) orelse + (Code == ?ERLFDB_PROXY_MEMORY_LIMIT_EXCEEDED) orelse + (Code == ?ERLFDB_BATCH_TRANSACTION_THROTTLED) orelse + (Code == ?ERLFDB_TAG_THROTTLED) +)).