From 31d3134d5b525e2483d023d5e8efe461b7eab171 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Wed, 26 Sep 2018 12:36:11 -0700 Subject: [PATCH 1/2] Cq documentation --- doc/core/grpc-cq.md | 64 +++++++++++++++++++++++++++++++++++++++++ doc/images/grpc-cq.png | Bin 0 -> 41659 bytes 2 files changed, 64 insertions(+) create mode 100644 doc/core/grpc-cq.md create mode 100644 doc/images/grpc-cq.png diff --git a/doc/core/grpc-cq.md b/doc/core/grpc-cq.md new file mode 100644 index 00000000000..b485c354566 --- /dev/null +++ b/doc/core/grpc-cq.md @@ -0,0 +1,64 @@ +# gRPC Completion Queue + +_Author: Sree Kuchibhotla (@sreecha) - Sep 2018_ + +Code: [completion_queue.cc](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/surface/completion_queue.cc) + +This document gives an overview of completion queue architecture and focuses mainly on the interaction between completion queue and the Polling engine layer. + +## Completion queue attributes +Completion queue has two attributes + + - Completion_type: + - GRPC_CQ_NEXT: grpc_completion_queue_next() can be called (but not grpc_completion_queue_pluck()) + - GRPC_CQ_PLUCK: grpc_completion_queue_pluck() can be called (but not grpc_completion_queue_next()) + - GRPC_CQ_CALLBACK: The tags in the queue are function pointers to callbacks. Also, neither next() nor pluck() can be called on this + + - Polling_type: + - GRPC_CQ_NON_POLLING: Threads calling completion_queue_next/pluck do not do any polling + - GRPC_CQ_DEFAULT_POLLING: Threads calling completion_queue_next/pluck do polling + - GRPC_CQ_NON_LISTENING: Functionally similar to default polling except for a boolean attribute that states that the cq is non-listening. This is used by the grpc-server code to not associate any listening sockets with this completion-queue’s pollset + + +## Details + +![image](../images/grpc-cq.png) + + +### **grpc\_completion\_queue\_next()** & **grpc_completion_queue_pluck()** APIS + + +``` C++ +grpc_completion_queue_next(cq, deadline)/pluck(cq, deadline, tag) { + while(true) { + \\ 1. If an event is queued in the completion queue, dequeue and return + \\ (in case of pluck() dequeue only if the tag is the one we are interested in) + + \\ 2. If completion queue shutdown return + + \\ 3. In case of pluck, add (tag, worker) pair to the tag<->worker map on the cq + + \\ 4. Call grpc_pollset_work(cq’s-pollset, deadline) to do polling + \\ Note that if this function found some fds to be readable/writable/error, + \\ it would have scheduled those closures (which may queue completion events + \\ on SOME completion queue - not necessarily this one) + } +} +``` + +### Queuing a completion event (i.e., "tag") + +``` C++ +grpc_cq_end_op(cq, tag) { + \\ 1. Queue the tag in the event queue + + \\ 2. Find the pollset corresponding to the completion queue + \\ (i) If the cq is of type GRPC_CQ_NEXT, then KICK ANY worker + \\ i.e., call grpc_pollset_kick(pollset, nullptr) + \\ (ii) If the cq is of type GRPC_CQ_PLUCK, then search the tag<->worker + \\ map on the completion queue to find the worker. Then specifically + \\ kick that worker i.e call grpc_pollset_kick(pollset, worker) +} + +``` + diff --git a/doc/images/grpc-cq.png b/doc/images/grpc-cq.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9e0958623c8aa4080f6c799b5bc1d2cf0d5923 GIT binary patch literal 41659 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 literal 0 HcmV?d00001 From 018a14bdec298275ed0b560be55f783092defb85 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Thu, 27 Sep 2018 11:18:18 -0700 Subject: [PATCH 2/2] generate_projects.sh --- tools/doxygen/Doxyfile.core | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index aa75bc68283..8562dfff3a9 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -771,6 +771,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ +doc/core/grpc-cq.md \ doc/core/grpc-error.md \ doc/core/moving-to-c++.md \ doc/core/pending_api_cleanups.md \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 91860567339..aa7b11fd547 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -771,6 +771,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ +doc/core/grpc-cq.md \ doc/core/grpc-error.md \ doc/core/moving-to-c++.md \ doc/core/pending_api_cleanups.md \