blob: a8acb50ef60b35a731dfae29780a0afc1faa9395 [file] [log] [blame]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-define(ERLFDB_ERROR(Reason), erlang:error({?MODULE, Reason})).
-define(ERLFDB_PACK(Tuple), erlfdb_tuple:pack(Tuple)).
-define(ERLFDB_PACK(Prefix, Tuple), erlfdb_tuple:pack(Tuple, Prefix)).
-define(ERLFDB_RANGE(Prefix),
erlfdb_subspace:range(erlfdb_subspace:create({}, Prefix))).
-define(ERLFDB_RANGE(Prefix, Term),
erlfdb_subspace:range(erlfdb_subspace:create({Term}, Prefix))).
-define(ERLFDB_EXTEND(Prefix, Term), erlfdb_tuple:pack({Term}, Prefix)).
-define(ERLFDB_EXTRACT(Prefix, Packed), (fun() ->
__PrefixLen = size(Prefix),
<<Prefix:__PrefixLen/binary, __Tail/binary>> = Packed,
erlfdb_tuple:unpack(__Tail)
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)
)).