From b868d6077c14e3653fdaddcb856ab2bf6ceb9c00 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Tue, 19 Dec 2017 16:10:11 +0530 Subject: dict: support better on-wire transfer This patch brings data type awareness to dictionary, and also makes sure valid data is properly sent to the other side of the wire using XDR. Next step is to allow people to add more data types (for example, Bool, UUID, iatt etc), and then make it part of every fop signature in wire. Fixes #203 Change-Id: Ie0eee2db847bea2bf7dad80dec89ce3e7c5917c1 Signed-off-by: Amar Tumballi --- rpc/xdr/src/glusterfs-fops.x | 10 ++++++++++ rpc/xdr/src/glusterfs3.h | 4 ++++ rpc/xdr/src/rpc-common-xdr.x | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+) (limited to 'rpc/xdr') diff --git a/rpc/xdr/src/glusterfs-fops.x b/rpc/xdr/src/glusterfs-fops.x index 5b5c5904678..44e5d9191a2 100644 --- a/rpc/xdr/src/glusterfs-fops.x +++ b/rpc/xdr/src/glusterfs-fops.x @@ -231,3 +231,13 @@ enum gf_upcall_flags_t { GF_UPCALL_LEASE_RECALL, GF_UPCALL_FLAGS_MAXVALUE }; + +enum gf_dict_data_type_t { + GF_DATA_TYPE_UNKNOWN, + GF_DATA_TYPE_INT, + GF_DATA_TYPE_UINT, + GF_DATA_TYPE_DOUBLE, + GF_DATA_TYPE_STR, + GF_DATA_TYPE_PTR, + GF_DATA_TYPE_MAX +}; diff --git a/rpc/xdr/src/glusterfs3.h b/rpc/xdr/src/glusterfs3.h index 0aa1ae80bf3..2da5594a347 100644 --- a/rpc/xdr/src/glusterfs3.h +++ b/rpc/xdr/src/glusterfs3.h @@ -418,4 +418,8 @@ gf_proto_cache_invalidation_to_upcall (xlator_t *this, out: return ret; } + +extern int dict_to_xdr (dict_t *this, gfx_dict *xdict); +extern int xdr_to_dict (gfx_dict *xdict, dict_t **to); + #endif /* !_GLUSTERFS3_H */ diff --git a/rpc/xdr/src/rpc-common-xdr.x b/rpc/xdr/src/rpc-common-xdr.x index 7ccfbb11a51..1af7c8041ed 100644 --- a/rpc/xdr/src/rpc-common-xdr.x +++ b/rpc/xdr/src/rpc-common-xdr.x @@ -17,6 +17,7 @@ * not captured in any section specific file */ %#include "xdr-common.h" +%#include "glusterfs-fops.h" struct auth_glusterfs_parms_v2 { int pid; @@ -64,3 +65,25 @@ struct gf_common_rsp { int op_errno; opaque xdata<>; /* Extra data */ } ; + + +union gfx_value switch (gf_dict_data_type_t type) { + case GF_DATA_TYPE_INT: + hyper value_int; + case GF_DATA_TYPE_UINT: + unsigned hyper value_uint; + case GF_DATA_TYPE_DOUBLE: + double value_dbl; + case GF_DATA_TYPE_STR: + opaque val_string<>; +}; + +struct gfx_dict_pair { + opaque key<>; + gfx_value value; +}; + +struct gfx_dict { + unsigned int count; + gfx_dict_pair pairs<>; +}; -- cgit