You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by ms...@apache.org on 2021/12/01 23:03:00 UTC

[incubator-teaclave] branch master updated: Optimize RPC memory footprint of serde (#577)

This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/master by this push:
     new edc10fd  Optimize RPC memory footprint of serde (#577)
edc10fd is described below

commit edc10fd8d9dc6f442dd946b721ed9383cfd01bb9
Author: Mingshen Sun <bo...@mssun.me>
AuthorDate: Wed Dec 1 15:02:55 2021 -0800

    Optimize RPC memory footprint of serde (#577)
---
 examples/python/wasm_rust_psi_payload/Cargo.lock |  2 +-
 rpc/src/request.rs                               |  1 -
 sdk/python/teaclave.py                           | 48 ++++++++++++++++--------
 services/proto/proto_gen/templates/proto.j2      |  2 +-
 tests/scripts/functional_tests.py                |  9 +++--
 types/src/staged_function.rs                     |  1 -
 6 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/examples/python/wasm_rust_psi_payload/Cargo.lock b/examples/python/wasm_rust_psi_payload/Cargo.lock
index 6795859..d367651 100644
--- a/examples/python/wasm_rust_psi_payload/Cargo.lock
+++ b/examples/python/wasm_rust_psi_payload/Cargo.lock
@@ -2,7 +2,7 @@
 # It is not intended for manual editing.
 [[package]]
 name = "teaclave_context"
-version = "0.1.0"
+version = "0.2.0"
 
 [[package]]
 name = "wasm_rust_psi_payload"
diff --git a/rpc/src/request.rs b/rpc/src/request.rs
index 242b8f3..7a77348 100644
--- a/rpc/src/request.rs
+++ b/rpc/src/request.rs
@@ -24,7 +24,6 @@ pub struct Request<T> {
     #[serde(skip_serializing_if = "HashMap::is_empty")]
     #[serde(default)]
     pub metadata: HashMap<String, String>,
-    #[serde(flatten)]
     pub message: T,
 }
 
diff --git a/sdk/python/teaclave.py b/sdk/python/teaclave.py
index 9d0d105..1adf540 100644
--- a/sdk/python/teaclave.py
+++ b/sdk/python/teaclave.py
@@ -50,6 +50,10 @@ __all__ = [
 Metadata = Dict[str, str]
 
 
+class Request:
+    pass
+
+
 class FunctionInput:
     """Function input for registering.
 
@@ -112,14 +116,14 @@ class CryptoInfo:
         self.iv = iv
 
 
-class UserRegisterReqeust:
+class UserRegisterRequest(Request):
     def __init__(self, user_id: str, user_password: str):
         self.request = "user_register"
         self.id = user_id
         self.password = user_password
 
 
-class UserLoginRequest:
+class UserLoginRequest(Request):
     def __init__(self, user_id: str, user_password: str):
         self.request = "user_login"
         self.id = user_id
@@ -190,7 +194,7 @@ class AuthenticationClient:
             user_id: User ID.
             user_password: Password.
         """
-        request = UserRegisterReqeust(user_id, user_password)
+        request = UserRegisterRequest(user_id, user_password)
         _write_message(self.channel, request)
         _ = _read_message(self.channel)
 
@@ -256,7 +260,7 @@ class FrontendService:
         return FrontendClient(self._channel)
 
 
-class RegisterFunctionRequest:
+class RegisterFunctionRequest(Request):
     def __init__(self, metadata: Metadata, name: str, description: str,
                  executor_type: str, public: bool, payload: List[int],
                  arguments: List[str], inputs: List[FunctionInput],
@@ -273,7 +277,7 @@ class RegisterFunctionRequest:
         self.outputs = outputs
 
 
-class RegisterInputFileRequest:
+class RegisterInputFileRequest(Request):
     def __init__(self, metadata: Metadata, url: str, cmac: List[int],
                  crypto_info: CryptoInfo):
         self.request = "register_input_file"
@@ -283,7 +287,7 @@ class RegisterInputFileRequest:
         self.crypto_info = crypto_info
 
 
-class RegisterOutputFileRequest:
+class RegisterOutputFileRequest(Request):
     def __init__(self, metadata: Metadata, url: str, crypto_info: CryptoInfo):
         self.request = "register_output_file"
         self.metadata = metadata
@@ -291,7 +295,7 @@ class RegisterOutputFileRequest:
         self.crypto_info = crypto_info
 
 
-class UpdateInputFileRequest:
+class UpdateInputFileRequest(Request):
     def __init__(self, metadata: Metadata, data_id: str, url: str):
         self.request = "update_input_file"
         self.metadata = metadata
@@ -299,7 +303,7 @@ class UpdateInputFileRequest:
         self.url = url
 
 
-class UpdateOutputFileRequest:
+class UpdateOutputFileRequest(Request):
     def __init__(self, metadata: Metadata, data_id: str, url: str):
         self.request = "update_output_file"
         self.metadata = metadata
@@ -307,7 +311,7 @@ class UpdateOutputFileRequest:
         self.url = url
 
 
-class CreateTaskRequest:
+class CreateTaskRequest(Request):
     def __init__(self, metadata: Metadata, function_id: str,
                  function_arguments: Dict[str, Any], executor: str,
                  inputs_ownership: List[OwnerList],
@@ -321,7 +325,7 @@ class CreateTaskRequest:
         self.outputs_ownership = outputs_ownership
 
 
-class AssignDataRequest:
+class AssignDataRequest(Request):
     def __init__(self, metadata: Metadata, task_id: str, inputs: List[DataMap],
                  outputs: List[DataMap]):
         self.request = "assign_data"
@@ -331,21 +335,21 @@ class AssignDataRequest:
         self.outputs = outputs
 
 
-class ApproveTaskRequest:
+class ApproveTaskRequest(Request):
     def __init__(self, metadata: Metadata, task_id: str):
         self.request = "approve_task"
         self.metadata = metadata
         self.task_id = task_id
 
 
-class InvokeTaskRequest:
+class InvokeTaskRequest(Request):
     def __init__(self, metadata: Metadata, task_id: str):
         self.request = "invoke_task"
         self.metadata = metadata
         self.task_id = task_id
 
 
-class GetTaskRequest:
+class GetTaskRequest(Request):
     def __init__(self, metadata: Metadata, task_id: str):
         self.request = "get_task"
         self.metadata = metadata
@@ -448,9 +452,21 @@ class FrontendClient:
 def _write_message(sock: ssl.SSLSocket, message: Any):
     class RequestEncoder(json.JSONEncoder):
         def default(self, o):
-            return o.__dict__
-
-    message = json.dumps(message, cls=RequestEncoder).encode()
+            if isinstance(o, Request):
+                request = o.__dict__["request"]
+                j = {}
+                j["message"] = {}
+                j["message"][request] = {}
+                for k, v in o.__dict__.items():
+                    if k == "metadata": j[k] = v
+                    elif k == "request": continue
+                    else: j["message"][request][k] = v
+                return j
+            else:
+                return o.__dict__
+
+    message = json.dumps(message, cls=RequestEncoder,
+                         separators=(',', ':')).encode()
     sock.sendall(struct.pack(">Q", len(message)))
     sock.sendall(message)
 
diff --git a/services/proto/proto_gen/templates/proto.j2 b/services/proto/proto_gen/templates/proto.j2
index a1f96e9..84ffdaa 100644
--- a/services/proto/proto_gen/templates/proto.j2
+++ b/services/proto/proto_gen/templates/proto.j2
@@ -18,7 +18,7 @@ under the License.
 #}
 
 #[derive(Clone, serde::Serialize, serde::Deserialize, Debug)]
-#[serde(tag = "request", rename_all = "snake_case")]
+#[serde(rename_all = "snake_case")]
 pub enum {{ service.proto_name }}Request {
     {%- for m in service.methods %}
     {{ m.proto_name }}({{ m.input_type }}),
diff --git a/tests/scripts/functional_tests.py b/tests/scripts/functional_tests.py
index d1232ca..aa7820d 100755
--- a/tests/scripts/functional_tests.py
+++ b/tests/scripts/functional_tests.py
@@ -140,9 +140,12 @@ class TestAuthenticationService(unittest.TestCase):
         user_password = "invalid_password"
 
         message = {
-            "request": "user_login",
-            "id": user_id,
-            "password": user_password
+            "message": {
+                "user_login": {
+                    "id": user_id,
+                    "password": user_password
+                }
+            }
         }
         write_message(self.socket, message)
 
diff --git a/types/src/staged_function.rs b/types/src/staged_function.rs
index 3c706e0..3607850 100644
--- a/types/src/staged_function.rs
+++ b/types/src/staged_function.rs
@@ -28,7 +28,6 @@ type ArgumentValue = serde_json::Value;
 
 #[derive(Clone, Serialize, Deserialize, Debug, Default)]
 pub struct FunctionArguments {
-    #[serde(flatten)]
     inner: serde_json::Map<String, ArgumentValue>,
 }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org