diff --git a/client/priskv.h b/client/priskv.h index b29f578..52ee0e6 100644 --- a/client/priskv.h +++ b/client/priskv.h @@ -79,128 +79,21 @@ typedef struct priskv_sgl { } priskv_sgl; typedef enum priskv_status { - PRISKV_STATUS_OK = 0x00, - - /* unrecognized command, typically protocol error */ - PRISKV_STATUS_INVALID_COMMAND = 0x100, - - /* zero length key in use? Note that '\0' is allowed */ - PRISKV_STATUS_KEY_EMPTY, - - /* does the length of key exceed @max_key_length? */ - PRISKV_STATUS_KEY_TOO_BIG, - - /* zero length value in use? Note that '\0' is allowed */ - PRISKV_STATUS_VALUE_EMPTY, - - /* the length of @priskv_sgl is smaller than the length of value */ - PRISKV_STATUS_VALUE_TOO_BIG, - - /* no such command */ - PRISKV_STATUS_NO_SUCH_COMMAND, - - /* no such key */ - PRISKV_STATUS_NO_SUCH_KEY, - - /* no such token */ - PRISKV_STATUS_NO_SUCH_TOKEN, - - /* invalid SGL. the number of SGL within a command must not exceed @max_sgl */ - PRISKV_STATUS_INVALID_SGL, - - /* invalid regex */ - PRISKV_STATUS_INVALID_REGEX, - - /* key is updating */ - PRISKV_STATUS_KEY_UPDATING, - - /* connect to server side failed */ - PRISKV_STATUS_CONNECT_ERROR, - - /* generic server side failure */ - PRISKV_STATUS_SERVER_ERROR, - - /* operation not permitted (e.g., SEAL/RELEASE/DROP with wrong token) */ - PRISKV_STATUS_PERMISSION_DENIED, - - /* no enough memory reported by server side */ - PRISKV_STATUS_NO_MEM = 0x200, - - /* RDMA disconnected from the server side */ - PRISKV_STATUS_DISCONNECTED = 0xF00, - - /* local transport error occurs */ - PRISKV_STATUS_TRANSPORT_ERROR, - - /* does inflight requests exceed @max_inflight_command? */ - PRISKV_STATUS_BUSY, - - /* unexpected protocol error */ - PRISKV_STATUS_PROTOCOL_ERROR, +#undef PRISKV_DECLARE_STATUS +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) PRISKV_STATUS_##NAME = CODE, +#include "priskv-status.inc" +#undef PRISKV_DECLARE_STATUS } priskv_status; static inline const char *priskv_status_str(priskv_status status) { switch (status) { - case PRISKV_STATUS_OK: - return "OK"; - - case PRISKV_STATUS_INVALID_COMMAND: - return "Invalid command"; - - case PRISKV_STATUS_KEY_EMPTY: - return "Empty key"; - - case PRISKV_STATUS_KEY_TOO_BIG: - return "Key too big"; - - case PRISKV_STATUS_VALUE_EMPTY: - return "Empty Value"; - - case PRISKV_STATUS_VALUE_TOO_BIG: - return "Value too big"; - - case PRISKV_STATUS_NO_SUCH_COMMAND: - return "No such command"; - - case PRISKV_STATUS_NO_SUCH_KEY: - return "No such key"; - - case PRISKV_STATUS_NO_SUCH_TOKEN: - return "No such token"; - - case PRISKV_STATUS_INVALID_SGL: - return "Invalid SGL"; - - case PRISKV_STATUS_INVALID_REGEX: - return "Invalid regex"; - - case PRISKV_STATUS_KEY_UPDATING: - return "Key is updating"; - - case PRISKV_STATUS_CONNECT_ERROR: - return "Connect error"; - - case PRISKV_STATUS_SERVER_ERROR: - return "Server internal error"; - - case PRISKV_STATUS_PERMISSION_DENIED: - return "Permission denied"; - - case PRISKV_STATUS_NO_MEM: - return "No memory"; - - case PRISKV_STATUS_DISCONNECTED: - return "Disconnected"; - - case PRISKV_STATUS_TRANSPORT_ERROR: - return "Transport error"; - - case PRISKV_STATUS_BUSY: - return "Busy"; - - case PRISKV_STATUS_PROTOCOL_ERROR: - return "Protocol error"; +#undef PRISKV_DECLARE_STATUS +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) \ + case CODE: \ + return STR; +#include "priskv-status.inc" +#undef PRISKV_DECLARE_STATUS } return "Unknown"; diff --git a/cluster/client/Makefile b/cluster/client/Makefile index a105796..99d8dc9 100644 --- a/cluster/client/Makefile +++ b/cluster/client/Makefile @@ -25,7 +25,7 @@ ifneq (,$(filter $(PRISKV_USE_CUDA),yes YES y Y 1)) CFLAGS += $(CUDA_LDFLAGS) -DPRISKV_USE_CUDA endif -PRISKV_CLUSTER_TARGETS = priskv-cluster-benchmark priskv-cluster-example priskv-cluster-test_status +PRISKV_CLUSTER_TARGETS = priskv-cluster-benchmark priskv-cluster-example PRISKV_CLUSTER_TARGETS_SRCS = $(patsubst priskv-cluster-%, %.c, $(PRISKV_CLUSTER_TARGETS)) ALL_SRCS = $(wildcard *.c) LIB_SRCS = $(filter-out $(PRISKV_CLUSTER_TARGETS_SRCS), $(wildcard *.c)) diff --git a/cluster/client/client.h b/cluster/client/client.h index 8456307..9783bf5 100644 --- a/cluster/client/client.h +++ b/cluster/client/client.h @@ -47,127 +47,21 @@ typedef struct priskvClusterSGL { } priskvClusterSGL; typedef enum priskvClusterStatus { - PRISKV_CLUSTER_STATUS_OK = 0x00, - /* unrecognized command, typically protocol error */ - PRISKV_CLUSTER_STATUS_INVALID_COMMAND = 0x100, - - /* zero length key in use? Note that '\0' is allowed */ - PRISKV_CLUSTER_STATUS_KEY_EMPTY, - - /* does the length of key exceed @max_key_length? */ - PRISKV_CLUSTER_STATUS_KEY_TOO_BIG, - - /* zero length value in use? Note that '\0' is allowed */ - PRISKV_CLUSTER_STATUS_VALUE_EMPTY, - - /* the length of @priskv_sgl is smaller than the length of value */ - PRISKV_CLUSTER_STATUS_VALUE_TOO_BIG, - - /* no such command */ - PRISKV_CLUSTER_STATUS_NO_SUCH_COMMAND, - - /* no such key */ - PRISKV_CLUSTER_STATUS_NO_SUCH_KEY, - - /* no such token */ - PRISKV_CLUSTER_STATUS_NO_SUCH_TOKEN, - - /* invalid SGL. the number of SGL within a command must not exceed @max_sgl */ - PRISKV_CLUSTER_STATUS_INVALID_SGL, - - /* invalid regex */ - PRISKV_CLUSTER_STATUS_INVALID_REGEX, - - /* key is updating */ - PRISKV_CLUSTER_STATUS_KEY_UPDATING, - - /* connect to server side failed */ - PRISKV_CLUSTER_STATUS_CONNECT_ERROR, - - /* generic server side failure */ - PRISKV_CLUSTER_STATUS_SERVER_ERROR, - - /* operation not permitted (e.g., SEAL/RELEASE/DROP with wrong token) */ - PRISKV_CLUSTER_STATUS_PERMISSION_DENIED, - - /* no enough memory reported by server side */ - PRISKV_CLUSTER_STATUS_NO_MEM = 0x200, - - /* RDMA disconnected from the server side */ - PRISKV_CLUSTER_STATUS_DISCONNECTED = 0xF00, - - /* local RDMA error occurs */ - PRISKV_CLUSTER_STATUS_TRANSPORT_ERROR, - - /* does inflight requests exceed @max_inflight_command? */ - PRISKV_CLUSTER_STATUS_BUSY, - - /* unexpected protocol error */ - PRISKV_CLUSTER_STATUS_PROTOCOL_ERROR, +#undef PRISKV_DECLARE_STATUS +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) PRISKV_CLUSTER_STATUS_##NAME = CODE, +#include "priskv-cluster-status.inc" +#undef PRISKV_DECLARE_STATUS } priskvClusterStatus; static inline const char *priskv_cluster_status_str(priskvClusterStatus status) { switch (status) { - case PRISKV_CLUSTER_STATUS_OK: - return "OK"; - - case PRISKV_CLUSTER_STATUS_INVALID_COMMAND: - return "Invalid command"; - - case PRISKV_CLUSTER_STATUS_KEY_EMPTY: - return "Empty key"; - - case PRISKV_CLUSTER_STATUS_KEY_TOO_BIG: - return "Key too big"; - - case PRISKV_CLUSTER_STATUS_VALUE_EMPTY: - return "Empty Value"; - - case PRISKV_CLUSTER_STATUS_VALUE_TOO_BIG: - return "Value too big"; - - case PRISKV_CLUSTER_STATUS_NO_SUCH_COMMAND: - return "No such command"; - - case PRISKV_CLUSTER_STATUS_NO_SUCH_KEY: - return "No such key"; - - case PRISKV_CLUSTER_STATUS_NO_SUCH_TOKEN: - return "No such token"; - - case PRISKV_CLUSTER_STATUS_INVALID_SGL: - return "Invalid SGL"; - - case PRISKV_CLUSTER_STATUS_INVALID_REGEX: - return "Invalid regex"; - - case PRISKV_CLUSTER_STATUS_KEY_UPDATING: - return "Key is updating"; - - case PRISKV_CLUSTER_STATUS_CONNECT_ERROR: - return "Connect error"; - - case PRISKV_CLUSTER_STATUS_SERVER_ERROR: - return "Server internal error"; - - case PRISKV_CLUSTER_STATUS_PERMISSION_DENIED: - return "Permission denied"; - - case PRISKV_CLUSTER_STATUS_NO_MEM: - return "No memory"; - - case PRISKV_CLUSTER_STATUS_DISCONNECTED: - return "Disconnected"; - - case PRISKV_CLUSTER_STATUS_TRANSPORT_ERROR: - return "Transport error"; - - case PRISKV_CLUSTER_STATUS_BUSY: - return "Busy"; - - case PRISKV_CLUSTER_STATUS_PROTOCOL_ERROR: - return "Protocol error"; +#undef PRISKV_DECLARE_STATUS +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) \ + case CODE: \ + return STR; +#include "priskv-cluster-status.inc" +#undef PRISKV_DECLARE_STATUS } return "Unknown"; diff --git a/cluster/client/test_status.c b/cluster/client/test_status.c deleted file mode 100644 index 9fb6d56..0000000 --- a/cluster/client/test_status.c +++ /dev/null @@ -1,71 +0,0 @@ -// Simple consistency test: verify numeric and string mappings between single-node status and cluster status -// Run: make -C cluster && ./cluster/client/priskv-cluster-test-status - -#include -#include - -#include "priskv.h" -#include "client.h" - -static int check_one(priskv_status s) -{ - priskvClusterStatus cs = priskvClusterStatusFromPriskvStatus(s); - const char *ss = priskv_status_str(s); - const char *cs_str = priskv_cluster_status_str(cs); - - int ok = 1; - - if (cs != (priskvClusterStatus)s) { - fprintf(stderr, "[NUMERIC] mismatch: priskv=%d cluster=%d\n", (int)s, (int)cs); - ok = 0; - } - - if (strcmp(ss, cs_str) != 0) { - fprintf(stderr, "[STRING] mismatch: priskv=\"%s\" cluster=\"%s\" (code=%d)\n", ss, cs_str, - (int)s); - ok = 0; - } - - return ok; -} - -int main(void) -{ - priskv_status cases[] = { - PRISKV_STATUS_OK, - PRISKV_STATUS_INVALID_COMMAND, - PRISKV_STATUS_KEY_EMPTY, - PRISKV_STATUS_KEY_TOO_BIG, - PRISKV_STATUS_VALUE_EMPTY, - PRISKV_STATUS_VALUE_TOO_BIG, - PRISKV_STATUS_NO_SUCH_COMMAND, - PRISKV_STATUS_NO_SUCH_KEY, - PRISKV_STATUS_NO_SUCH_TOKEN, - PRISKV_STATUS_INVALID_SGL, - PRISKV_STATUS_INVALID_REGEX, - PRISKV_STATUS_KEY_UPDATING, - PRISKV_STATUS_CONNECT_ERROR, - PRISKV_STATUS_SERVER_ERROR, - PRISKV_STATUS_PERMISSION_DENIED, - PRISKV_STATUS_NO_MEM, - PRISKV_STATUS_DISCONNECTED, - PRISKV_STATUS_TRANSPORT_ERROR, - PRISKV_STATUS_BUSY, - PRISKV_STATUS_PROTOCOL_ERROR, - }; - - int pass = 1; - for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) { - if (!check_one(cases[i])) { - pass = 0; - } - } - - if (!pass) { - fprintf(stderr, "Status consistency test: FAILED\n"); - return 1; - } - - printf("Status consistency test: PASSED\n"); - return 0; -} diff --git a/include/priskv-cluster-status.inc b/include/priskv-cluster-status.inc new file mode 100644 index 0000000..6c9a9bb --- /dev/null +++ b/include/priskv-cluster-status.inc @@ -0,0 +1,4 @@ +/* Arguments: NAME, CODE, MESSAGE, IS_RESP_STATUS */ +#include "priskv-status.inc" + +/* Declare cluster-specific status codes below this line */ diff --git a/include/priskv-protocol-helper.h b/include/priskv-protocol-helper.h index 622781c..4d59bd2 100644 --- a/include/priskv-protocol-helper.h +++ b/include/priskv-protocol-helper.h @@ -119,53 +119,16 @@ static inline const char *priskv_command_str(priskv_req_command cmd) static inline const char *priskv_resp_status_str(priskv_resp_status status) { switch (status) { - case PRISKV_RESP_STATUS_OK: - return "OK"; - - case PRISKV_RESP_STATUS_INVALID_COMMAND: - return "Invalid command"; - - case PRISKV_RESP_STATUS_KEY_EMPTY: - return "Empty key"; - - case PRISKV_RESP_STATUS_KEY_TOO_BIG: - return "Key too big"; - - case PRISKV_RESP_STATUS_VALUE_EMPTY: - return "Empty Value"; - - case PRISKV_RESP_STATUS_VALUE_TOO_BIG: - return "Value too big"; - - case PRISKV_RESP_STATUS_NO_SUCH_COMMAND: - return "No such command"; - - case PRISKV_RESP_STATUS_NO_SUCH_KEY: - return "No such key"; - - case PRISKV_RESP_STATUS_NO_SUCH_TOKEN: - return "No such token"; - - case PRISKV_RESP_STATUS_INVALID_SGL: - return "Invalid SGL"; - - case PRISKV_RESP_STATUS_INVALID_REGEX: - return "Invalid regex"; - - case PRISKV_RESP_STATUS_KEY_UPDATING: - return "Key is updating"; - - case PRISKV_RESP_STATUS_CONNECT_ERROR: - return "Connect error"; - - case PRISKV_RESP_STATUS_SERVER_ERROR: - return "Server internal error"; - - case PRISKV_RESP_STATUS_PERMISSION_DENIED: - return "Permission denied"; - - case PRISKV_RESP_STATUS_NO_MEM: - return "No memory"; +#undef PRISKV_DECLARE_STATUS +#undef PRISKV_DECLARE_RESP_STATUS_0 +#undef PRISKV_DECLARE_RESP_STATUS_1 +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) PRISKV_DECLARE_RESP_STATUS_##IS_RESP_STATUS(CODE, STR) +#define PRISKV_DECLARE_RESP_STATUS_1(CODE, STR) case CODE: return STR; +#define PRISKV_DECLARE_RESP_STATUS_0(CODE, STR) +#include "priskv-status.inc" +#undef PRISKV_DECLARE_RESP_STATUS_0 +#undef PRISKV_DECLARE_RESP_STATUS_1 +#undef PRISKV_DECLARE_STATUS } return "Unknown"; diff --git a/include/priskv-protocol.h b/include/priskv-protocol.h index 8c75261..de38a34 100644 --- a/include/priskv-protocol.h +++ b/include/priskv-protocol.h @@ -119,25 +119,16 @@ typedef struct priskv_request { * response status to client */ typedef enum priskv_resp_status { - PRISKV_RESP_STATUS_OK = 0x00, - - PRISKV_RESP_STATUS_INVALID_COMMAND = 0x100, - PRISKV_RESP_STATUS_KEY_EMPTY, - PRISKV_RESP_STATUS_KEY_TOO_BIG, - PRISKV_RESP_STATUS_VALUE_EMPTY, - PRISKV_RESP_STATUS_VALUE_TOO_BIG, - PRISKV_RESP_STATUS_NO_SUCH_COMMAND, - PRISKV_RESP_STATUS_NO_SUCH_KEY, - /* token not found (for SEAL/RELEASE/DROP with invalid token) */ - PRISKV_RESP_STATUS_NO_SUCH_TOKEN, - PRISKV_RESP_STATUS_INVALID_SGL, - PRISKV_RESP_STATUS_INVALID_REGEX, - PRISKV_RESP_STATUS_KEY_UPDATING, - PRISKV_RESP_STATUS_CONNECT_ERROR, - PRISKV_RESP_STATUS_SERVER_ERROR, - PRISKV_RESP_STATUS_PERMISSION_DENIED, - - PRISKV_RESP_STATUS_NO_MEM = 0x200 +#undef PRISKV_DECLARE_STATUS +#undef PRISKV_DECLARE_RESP_STATUS_0 +#undef PRISKV_DECLARE_RESP_STATUS_1 +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) PRISKV_DECLARE_RESP_STATUS_##IS_RESP_STATUS(PRISKV_RESP_STATUS_##NAME, CODE) +#define PRISKV_DECLARE_RESP_STATUS_1(NAME, CODE) NAME = CODE, +#define PRISKV_DECLARE_RESP_STATUS_0(NAME, CODE) +#include "priskv-status.inc" +#undef PRISKV_DECLARE_RESP_STATUS_0 +#undef PRISKV_DECLARE_RESP_STATUS_1 +#undef PRISKV_DECLARE_STATUS } priskv_resp_status; /* diff --git a/include/priskv-status.inc b/include/priskv-status.inc new file mode 100644 index 0000000..28291a1 --- /dev/null +++ b/include/priskv-status.inc @@ -0,0 +1,59 @@ +/* Arguments: NAME, CODE, MESSAGE, IS_RESP_STATUS */ +PRISKV_DECLARE_STATUS(OK, 0x00, "OK", 1) + +/* unrecognized command, typically protocol error */ +PRISKV_DECLARE_STATUS(INVALID_COMMAND, 0x100, "Invalid command", 1) + +/* zero length key in use? Note that '\0' is allowed */ +PRISKV_DECLARE_STATUS(KEY_EMPTY, 0x101, "Empty key", 1) + +/* does the length of key exceed @max_key_length? */ +PRISKV_DECLARE_STATUS(KEY_TOO_BIG, 0x102, "Key too big", 1) + +/* zero length value in use? Note that '\0' is allowed */ +PRISKV_DECLARE_STATUS(VALUE_EMPTY, 0x103, "Empty Value", 1) + +/* the length of @priskv_sgl is smaller than the length of value */ +PRISKV_DECLARE_STATUS(VALUE_TOO_BIG, 0x104, "Value too big", 1) + +/* no such command */ +PRISKV_DECLARE_STATUS(NO_SUCH_COMMAND, 0x105, "No such command", 1) + +/* no such key */ +PRISKV_DECLARE_STATUS(NO_SUCH_KEY, 0x106, "No such key", 1) + +/* no such token */ +PRISKV_DECLARE_STATUS(NO_SUCH_TOKEN, 0x107, "No such token", 1) + +/* invalid SGL. the number of SGL within a command must not exceed @max_sgl */ +PRISKV_DECLARE_STATUS(INVALID_SGL, 0x108, "Invalid SGL", 1) + +/* invalid regex */ +PRISKV_DECLARE_STATUS(INVALID_REGEX, 0x109, "Invalid regex", 1) + +/* key is updating */ +PRISKV_DECLARE_STATUS(KEY_UPDATING, 0x10A, "Key is updating", 1) + +/* connect to server side failed */ +PRISKV_DECLARE_STATUS(CONNECT_ERROR, 0x10B, "Connect error", 1) + +/* generic server side failure */ +PRISKV_DECLARE_STATUS(SERVER_ERROR, 0x10C, "Server internal error", 1) + +/* operation not permitted (e.g., SEAL/RELEASE/DROP with wrong token) */ +PRISKV_DECLARE_STATUS(PERMISSION_DENIED, 0x10D, "Permission denied", 1) + +/* no enough memory reported by server side */ +PRISKV_DECLARE_STATUS(NO_MEM, 0x200, "No memory", 1) + +/* Connection disconnected from the server side */ +PRISKV_DECLARE_STATUS(DISCONNECTED, 0xF00, "Disconnected", 0) + +/* local transport error occurs */ +PRISKV_DECLARE_STATUS(TRANSPORT_ERROR, 0xF01, "Transport error", 0) + +/* does inflight requests exceed @max_inflight_command? */ +PRISKV_DECLARE_STATUS(BUSY, 0xF02, "Busy", 0) + +/* unexpected protocol error */ +PRISKV_DECLARE_STATUS(PROTOCOL_ERROR, 0xF03, "Protocol error", 0) diff --git a/pypriskv/pybind.cpp b/pypriskv/pybind.cpp index aef04e4..e0a435f 100644 --- a/pypriskv/pybind.cpp +++ b/pypriskv/pybind.cpp @@ -270,13 +270,14 @@ PYBIND11_MODULE(_priskv_client, m) { m.attr("PRISKV_KEY_MAX_TIMEOUT") = PRISKV_KEY_MAX_TIMEOUT; - // Export only the PRISKV_STATUS enum (do not export top-level constants) to keep type-safe access. + // Export the priskvClusterStatus enum // Usage: priskv.PRISKV_STATUS.PRISKV_STATUS_OK, etc. - py::enum_(m, "PRISKV_STATUS") - .value("PRISKV_STATUS_OK", PRISKV_STATUS_OK) - .value("PRISKV_STATUS_NO_SUCH_KEY", PRISKV_STATUS_NO_SUCH_KEY) - .value("PRISKV_STATUS_PERMISSION_DENIED", PRISKV_STATUS_PERMISSION_DENIED) - .value("PRISKV_STATUS_NO_SUCH_TOKEN", PRISKV_STATUS_NO_SUCH_TOKEN); + py::enum_(m, "PRISKV_STATUS") +#undef PRISKV_DECLARE_STATUS +#define PRISKV_DECLARE_STATUS(NAME, CODE, STR, IS_RESP_STATUS) .value("PRISKV_STATUS_" #NAME, PRISKV_CLUSTER_STATUS_##NAME) +#include "priskv-cluster-status.inc" +#undef PRISKV_DECLARE_STATUS + ; pybind11::class_(m, "MemoryRegion", py::module_local()) .def(pybind11::init<>())