236 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| ```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
 | |
| ```
 | |
| 
 | |
| ## Leader处理强一致写入请求
 | |
| ```plantuml
 | |
|     @startuml leader_process_stict_consistency
 | |
|     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
 | |
|         sync -> : apply rsp1
 | |
|         sync -> : apply rsp2
 | |
|     end
 | |
| 
 | |
|     group #lightblue "In VNODE worker threads"
 | |
|         vnode -> vnode: vnodeApplyReqs()
 | |
|         vnode -> crpc:
 | |
|     end
 | |
| 
 | |
|     <- crpc: create table/submit rsp
 | |
| 
 | |
|     @enduml
 | |
| ```
 | |
| 
 | |
| ## Follower处理强一致写入请求
 | |
| ```plantuml
 | |
|     @startuml follower_process_strict_consistency
 | |
|     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
 | |
| 
 | |
|         -> sync: apply req
 | |
| 
 | |
|         sync -> vnode: notify apply
 | |
|     end
 | |
| 
 | |
|     group #lightblue "VNODE worker threads"
 | |
|         vnode -> vnode: vnodeApplyReqs()
 | |
|     end
 | |
| 
 | |
|     @enduml
 | |
| ```
 | |
| 
 | |
| ## Leader处理最终一致写入请求
 | |
| ```plantuml
 | |
|     @startuml leader_process_eventual_consistency
 | |
|     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
 | |
| 
 | |
|         sync -> vnode: notify apply
 | |
|     end
 | |
| 
 | |
| 
 | |
|     group #lightblue "In VNODE worker threads"
 | |
|         vnode -> vnode: vnodeApplyReqs()
 | |
|         vnode -> crpc:
 | |
|     end
 | |
| 
 | |
|     <- crpc: create table/submit rsp
 | |
| 
 | |
|     @enduml
 | |
| ```
 | |
| 
 | |
| ## Follower处理最终一致写入请求
 | |
| ```plantuml
 | |
|     @startuml follower_process_eventual_consistency
 | |
|     participant SYNC as sync
 | |
|     participant VNODE as vnode
 | |
| 
 | |
|     group #pink "SYNC threads"
 | |
|         -> sync: replication rsp
 | |
| 
 | |
|         sync -> sync: syncProcessReqs()
 | |
| 
 | |
|         sync -> vnode: notify VNODE \nthread to process\n the reqs
 | |
|     end
 | |
| 
 | |
|     group #lightblue "VNODE worker threads"
 | |
|         vnode -> vnode: vnodeApplyReqs()
 | |
|     end
 | |
|     @enduml
 | |
| ``` |