I was asked the other day what's event loop and how libvirt uses it. Well, I haven't found any good sources on the Internet so I thought of writing the documentation on my own. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- NB, when I will push this, the images will go to our libvirt-media repo among with the original SVGs that PNGs were rendered from. I'm sending them here for easier review. docs/internals.html.in | 1 + docs/internals/event_loop_simple.png | Bin 0 -> 16043 bytes docs/internals/event_loop_worker.png | Bin 0 -> 29696 bytes docs/internals/eventloop.html.in | 106 +++++++++++++++++++++++++++++++++++ docs/sitemap.html.in | 4 ++ 5 files changed, 111 insertions(+) create mode 100644 docs/internals/event_loop_simple.png create mode 100644 docs/internals/event_loop_worker.png create mode 100644 docs/internals/eventloop.html.in diff --git a/docs/internals.html.in b/docs/internals.html.in index c30f52f..fcc0758 100644 --- a/docs/internals.html.in +++ b/docs/internals.html.in @@ -14,6 +14,7 @@ <li>Introduction to basic rules and guidelines for <a href="hacking.html">hacking</a> on libvirt code</li> <li>Guide to adding <a href="api_extension.html">public APIs</a></li> + <li>Insight into libvirt <a href="internals/eventloop.html">event loop and worker pool</a></li> <li>Approach for <a href="internals/command.html">spawning commands</a> from libvirt driver code</li> <li>The libvirt <a href="internals/rpc.html">RPC infrastructure</a></li> diff --git a/docs/internals/event_loop_simple.png b/docs/internals/event_loop_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..daf4338a16bc1051aca0ca1c7ea13baa4e7179f1 GIT binary patch literal 16043 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 Mp@LL_gu%=I0mPN)82|tP literal 0 HcmV?d00001 diff --git a/docs/internals/event_loop_worker.png b/docs/internals/event_loop_worker.png new file mode 100644 index 0000000000000000000000000000000000000000..1bec1ea598b2806fea24ab25dc825c9055c76ee6 GIT binary patch literal 29696 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 literal 0 HcmV?d00001 diff --git a/docs/internals/eventloop.html.in b/docs/internals/eventloop.html.in new file mode 100644 index 0000000..93d9e8d --- /dev/null +++ b/docs/internals/eventloop.html.in @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <body> + <h1>Libvirt's event loop</h1> + + <ul id="toc"></ul> + + <p> + This page describes the event loop approach used in + libvirt. Both server and client. + </p> + + <h2><a name="event_loop">Event driven programming</a></h2> + + <p>Traditionally, a program simply ran once, then terminated. + This type of program was very common in the early days of + computing, and lacked any form of user interactivity. This is + still used frequently, particularly in small one purpose + programs.</p> + + <p>However, that approach is not suitable for all the types + of applications. For instance graphical applications spend + most of their run time waiting for an input from user. Only + after it happened (in our example a button was clicked, a key + pressed, etc.) an event is generated to which they respond + by executing desired function. If generalized, this is how + many long running programs (daemons) work. Even those who are + not waiting for direct user input and have no graphical + interface. Such as Libvirt.</p> + + <img alt="event loop" src="event_loop_simple.png"/> + + <p>In Libvirt this approach is used in combination with + <code>poll(2)</code> as all the communication with its + clients (and domains it manages too) happens through sockets. + Therefore whenever new client connects, it is given exclusive + file descriptor which is then watched for incoming events, + e.g. messages. </p> + + <h2><a name="api">The event loop API</a></h2> + + <p>To work with event loop from our code we have plenty of + APIs.</p> + + <ul> + <li><code>virEventAddHandle</code>: Registers a + callback for monitoring file handle events.</li> + <li><code>virEventUpdateHandle</code>: Change set of events + monitored file handle is being watched for.</li> + <li><code>virEventRemoveHandle</code>: Unregisters + previously registered file handle so that it is no + longer monitored for any events.</li> + <li><code>virEventAddTimeout</code>: Registers a + callback for timer event.</li> + <li><code>virEventUpdateTimeout</code>: Changes frequency + for a timer.</li> + <li><code>virEventRemoveTimeout</code>: Unregisters + a timer.</li> + </ul> + + <p>For more information on these APIs continue reading <a + href="../html/libvirt-libvirt-event.html">here</a>.</p> + + <h2><a name="worker_pool">Worker pool</a></h2> + + <p>Looking back at the image above we can see one big + limitation. While processing a message event loop is blocked + and for an outside observer unresponsive. This is not + acceptable for Libvirt. Therefore we have came up with the + following solution.</p> + + <img alt="event loop" src="event_loop_worker.png"/> + + <p>The event loop does only necessary minimum and hand over + message processing to another thread. In fact, there can be + as many processing threads as configured increasing + processing power.</p> + + <p>To break this high level description into smaller pieces, + here is what happens when user calls an API:</p> + <ol> + <li>User (or management application) calls a Libvirt API. + Depending on the connection URI, this may or may not + involve server. Well, for the sake of our + demonstration we assume the former.</li> + <li>Remote driver encodes the API among it's arguments + into an <a href="rpc.html">RPC message</a> and sends + it to the server.</li> + <li>Here, server is waiting in <code>poll(2)</code> for + an event, like incoming message.</li> + <li>As soon as the first bytes of message are received, + even loop wakes up and server starts reading the + whole message.</li> + <li>Once fully read, the event loop notifies threads + known as worker threads from which one picks the incoming + message, decodes and process it.</li> + <li>As soon as API execution is finished, a reply is sent + to the client.</li> + </ol> + + <p>In case that there's no free worker to process an incoming + message in step 5, message is placed at the end of a message + queue and is processed in next iteration.</p> + </body> +</html> diff --git a/docs/sitemap.html.in b/docs/sitemap.html.in index d5cf723..757d5aa 100644 --- a/docs/sitemap.html.in +++ b/docs/sitemap.html.in @@ -397,6 +397,10 @@ <span>Adding new public libvirt APIs</span> </li> <li> + <a href="internals/eventloop.html">Event loop and worker pool</a> + <span>Libvirt's event loop and worker pool mode</span> + </li> + <li> <a href="internals/command.html">Spawning commands</a> <span>Spawning commands from libvirt driver code</span> </li> -- 2.8.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list