diff --git a/docs/scratch.md b/docs/scratch.md new file mode 100644 index 0000000000000000000000000000000000000000..d8fa63607641cd2bdb79f98fd7854babc77190eb --- /dev/null +++ b/docs/scratch.md @@ -0,0 +1,169 @@ +```plantuml + @startuml create_table + skinparam sequenceMessageAlign center + skinparam responseMessageBelowArrow true + + participant APP as app + box "dnode1" + participant RPC as rpc + participant VNODE as vnode + participant SYNC as sync + end box + + box "dnode2" + participant SYNC as sync2 + participant VNODE as vnode2 + end box + + box "dnode3" + participant SYNC as sync3 + participant VNODE as vnode3 + end box + + ' APP send request to dnode and RPC in dnode recv the request + app ->rpc: create table req + + ' RPC call vnodeProcessReq() function to process the request + rpc -> vnode: vnodeProcessReq + note right + callback function + run in RPC module + threads. The function + only puts the request + to a vnode queue. + end note + + ' VNODE call vnodeProcessReqs() function to integrate requests and process as a whole + vnode -> vnode: vnodeProcessReqs() + note right + integrate reqs and + process as a whole + end note + + + ' sync the request to other nodes + vnode -> sync: syncProcessReqs() + + ' make request persistent + ' sync -->vnode: walWrite()\n(callback function) + + ' replicate requests to other DNODES + sync -> sync2: replication req + sync -> sync3: replication req + sync2 -> vnode2: walWrite()\n(callback function) + sync2 --> sync: replication rsp\n(confirm) + sync3 -> vnode3: walWrite()\n(callback function) + + sync3 --> sync: replication rsp\n(confirm) + + ' send apply request + sync -> sync2: apply req + sync -> sync3: apply req + + ' vnode apply + sync2 -> vnode2: vnodeApplyReqs() + sync3 -> vnode3: vnodeApplyReqs() + + ' call apply request + sync --> vnode: vnodeApplyReqs()\n(callback function) + + ' send response + vnode --> rpc: rpcSendRsp() + + ' dnode send response to APP + rpc --> app: create table rsp + @enduml +``` + +```plantuml + @startuml vnode_process_write + box "dnode1" + participant CRPC as crpc + participant VNODE as vnode + participant SYNC as sync + end box + + -> crpc: create table/submit req + + ' In CRPC threads + group #pink "In CRPC threads" + crpc -> vnode:vnodeProcessReq() + note right + A callback function + run by CRPC thread + to put the request + to a vnode queue + end note + end + + ' In VNODE worker threads + group #lightblue "In VNODE worker threads" + vnode -> vnode: vnodeProcessReqs() + note right + VNODE process requests + accumulated in a + vnode write queue and + process the batch reqs + as a whole + end note + + vnode -> sync: syncProcessReqs() + + sync -> : replication req1 + sync -> : replication req2 + end + + group #red "SYNC threads" + sync <- : replication rsp1 + sync <- : replication rsp2 + sync -> vnode: notify apply + end + + group #lightblue "In VNODE worker threads" + vnode -> vnode: vnodeApplyReqs() + vnode -> crpc: + end + + <- crpc: create table/submit rsp + + @enduml +``` + +```plantuml + @startuml replication_process + participant SYNC as sync + participant VNODE as vnode + + group #pink "SYNC threads" + -> sync: replication req + + sync -> sync: syncProcessReqs() + note right + In the replication + only data is + persisted and response + is sent back + end note + + <- sync: replication rsp + end + + @enduml +``` + +```plantuml + @startuml comfirm_process + participant SYNC as sync + participant VNODE as vnode + + group #pink "SYNC threads" + -> sync: replication rsp + + sync -> vnode: notify VNODE \nthread to process\n the reqs + end + + group #lightblue "VNODE worker threads" + vnode -> vnode: vnodeApplyReqs() + end + @enduml +``` \ No newline at end of file