Stabilize RPC error code values:

The original intent was that RPC error codes were not stable.
But those codes were made available through the API, so some
users came to depend on the code values.  This change adapts
to the current state of affairs.
This commit is contained in:
Scott Schurr
2019-06-28 19:51:19 -07:00
committed by Nik Bougalis
parent 6d8988b78a
commit 89b3bf0796
2 changed files with 106 additions and 66 deletions

View File

@@ -27,82 +27,110 @@ namespace ripple {
// VFALCO NOTE These are outside the RPC namespace
// NOTE: Although the precise numeric values of these codes were never
// intended to be stable, several API endpoints include the numeric values.
// Some users came to rely on the values, meaning that renumbering would be
// a breaking change for those users.
//
// We therefore treat the range of values as stable although they are not
// and are subject to change.
//
// Please only append to this table. Do not "fill-in" gaps and do not re-use
// or repurpose error code values.
enum error_code_i
{
rpcUNKNOWN = -1, // Represents codes not listed in this enumeration
// -1 represents codes not listed in this enumeration
rpcUNKNOWN = -1,
rpcSUCCESS = 0,
rpcSUCCESS = 0,
rpcBAD_SYNTAX, // Must be 1 to print usage to command line.
rpcJSON_RPC,
rpcFORBIDDEN,
// Error numbers beyond this line are not stable between versions.
// Programs should use error tokens.
rpcBAD_SYNTAX = 1,
rpcJSON_RPC = 2,
rpcFORBIDDEN = 3,
// Misc failure
rpcNO_PERMISSION,
rpcNO_EVENTS,
rpcTOO_BUSY,
rpcSLOW_DOWN,
rpcHIGH_FEE,
rpcNOT_ENABLED,
rpcNOT_READY,
rpcAMENDMENT_BLOCKED,
// unused 4,
// unused 5,
rpcNO_PERMISSION = 6,
rpcNO_EVENTS = 7,
// unused 8,
rpcTOO_BUSY = 9,
rpcSLOW_DOWN = 10,
rpcHIGH_FEE = 11,
rpcNOT_ENABLED = 12,
rpcNOT_READY = 13,
rpcAMENDMENT_BLOCKED = 14,
// Networking
rpcNO_CLOSED,
rpcNO_CURRENT,
rpcNO_NETWORK,
rpcNO_CLOSED = 15,
rpcNO_CURRENT = 16,
rpcNO_NETWORK = 17,
// Ledger state
rpcACT_NOT_FOUND,
rpcLGR_NOT_FOUND,
rpcLGR_NOT_VALIDATED,
rpcMASTER_DISABLED,
rpcTXN_NOT_FOUND,
// unused 18,
rpcACT_NOT_FOUND = 19,
// unused 20,
rpcLGR_NOT_FOUND = 21,
rpcLGR_NOT_VALIDATED = 22,
rpcMASTER_DISABLED = 23,
// unused 24,
// unused 25,
// unused 26,
// unused 27,
// unused 28,
rpcTXN_NOT_FOUND = 29,
// unused 30,
// Malformed command
rpcINVALID_PARAMS,
rpcUNKNOWN_COMMAND,
rpcNO_PF_REQUEST,
rpcINVALID_PARAMS = 31,
rpcUNKNOWN_COMMAND = 32,
rpcNO_PF_REQUEST = 33,
// Bad parameter
rpcACT_BITCOIN,
rpcACT_MALFORMED,
rpcALREADY_MULTISIG,
rpcALREADY_SINGLE_SIG,
rpcBAD_FEATURE,
rpcBAD_ISSUER,
rpcBAD_MARKET,
rpcBAD_SECRET,
rpcBAD_SEED,
rpcCHANNEL_MALFORMED,
rpcCHANNEL_AMT_MALFORMED,
rpcCOMMAND_MISSING,
rpcDST_ACT_MALFORMED,
rpcDST_ACT_MISSING,
rpcDST_ACT_NOT_FOUND,
rpcDST_AMT_MALFORMED,
rpcDST_AMT_MISSING,
rpcDST_ISR_MALFORMED,
rpcLGR_IDXS_INVALID,
rpcLGR_IDX_MALFORMED,
rpcPUBLIC_MALFORMED,
rpcSIGNING_MALFORMED,
rpcSENDMAX_MALFORMED,
rpcSRC_ACT_MALFORMED,
rpcSRC_ACT_MISSING,
rpcSRC_ACT_NOT_FOUND,
rpcSRC_CUR_MALFORMED,
rpcSRC_ISR_MALFORMED,
rpcSTREAM_MALFORMED,
rpcATX_DEPRECATED,
rpcACT_BITCOIN = 34,
rpcACT_MALFORMED = 35,
rpcALREADY_MULTISIG = 36,
rpcALREADY_SINGLE_SIG = 37,
// unused 38,
// unused 39,
rpcBAD_FEATURE = 40,
rpcBAD_ISSUER = 41,
rpcBAD_MARKET = 42,
rpcBAD_SECRET = 43,
rpcBAD_SEED = 44,
rpcCHANNEL_MALFORMED = 45,
rpcCHANNEL_AMT_MALFORMED = 46,
rpcCOMMAND_MISSING = 47,
rpcDST_ACT_MALFORMED = 48,
rpcDST_ACT_MISSING = 49,
rpcDST_ACT_NOT_FOUND = 50,
rpcDST_AMT_MALFORMED = 51,
rpcDST_AMT_MISSING = 52,
rpcDST_ISR_MALFORMED = 53,
// unused 54,
// unused 55,
// unused 56,
rpcLGR_IDXS_INVALID = 57,
rpcLGR_IDX_MALFORMED = 58,
// unused 59,
// unused 60,
// unused 61,
rpcPUBLIC_MALFORMED = 62,
rpcSIGNING_MALFORMED = 63,
rpcSENDMAX_MALFORMED = 64,
rpcSRC_ACT_MALFORMED = 65,
rpcSRC_ACT_MISSING = 66,
rpcSRC_ACT_NOT_FOUND = 67,
// unused 68,
rpcSRC_CUR_MALFORMED = 69,
rpcSRC_ISR_MALFORMED = 70,
rpcSTREAM_MALFORMED = 71,
rpcATX_DEPRECATED = 72,
// Internal error (should never happen)
rpcINTERNAL, // Generic internal error.
rpcNOT_IMPL,
rpcNOT_SUPPORTED,
rpcINTERNAL = 73, // Generic internal error.
rpcNOT_IMPL = 74,
rpcNOT_SUPPORTED = 75,
rpcLAST = rpcNOT_SUPPORTED // rpcLAST should always equal the last code.
};

View File

@@ -111,11 +111,11 @@ struct ErrorInfoArray
// Sort and validate unorderedErrorInfos at compile time. Should be
// converted to consteval when get to C++20.
template<int N>
template<int M, int N>
constexpr auto
sortErrorInfos (ErrorInfo const (&unordered)[N]) -> ErrorInfoArray<N>
sortErrorInfos (ErrorInfo const (&unordered)[N]) -> ErrorInfoArray<M>
{
ErrorInfoArray<N> ret;
ErrorInfoArray<M> ret;
for (ErrorInfo const& info : unordered)
{
@@ -136,19 +136,31 @@ sortErrorInfos (ErrorInfo const (&unordered)[N]) -> ErrorInfoArray<N>
// Verify that all entries are filled in starting with 1 and proceeding
// to rpcLAST.
int expect = 0;
//
// It's okay for there to be missing entries; they will contain the code
// rpcUNKNOWN. But other than that all entries should match their index.
int codeCount {0};
int expect {rpcBAD_SYNTAX - 1};
for (ErrorInfo const& info : ret.infos)
{
if (info.code != ++expect)
++expect;
if (info.code == rpcUNKNOWN)
continue;
if (info.code != expect)
throw (std::invalid_argument ("Empty error_code_i in list"));
++codeCount;
}
if (expect != rpcLAST)
throw (std::invalid_argument ("Insufficient list entries"));
if (codeCount != N)
throw (std::invalid_argument ("Bad handling of unorderedErrorInfos"));
return ret;
}
constexpr auto sortedErrorInfos {sortErrorInfos(unorderedErrorInfos)};
constexpr auto sortedErrorInfos {sortErrorInfos<rpcLAST>(unorderedErrorInfos)};
constexpr ErrorInfo unknownError;
} // detail