[libvirt] [PATCH v2 01/12] Define keepalive protocol

Eric Blake eblake at redhat.com
Thu Sep 29 14:30:13 UTC 2011


On 09/29/2011 07:46 AM, Jiri Denemark wrote:
> On Thu, Sep 29, 2011 at 14:19:43 +0100, Daniel P. Berrange wrote:
>> On Fri, Sep 23, 2011 at 10:24:46AM +0200, Jiri Denemark wrote:
>>> The keepalive program has three procedures: ADVERTISE, PING, and PONG.
>>> All are used only in asynchronous messages and the sender doesn't wait
>>> for any reply. However, the party which receives PING messages is
>>> supposed to react by sending PONG message the other party, but no
>>> explicit binding between PING and PONG messages is made. ADVERTISE is
>>> sent by a client to indicate it supports keepalive protocol. Server is
>>> not allowed to send any keepalive message until it sees ADVERTISE.
>>
>> I guess I'm not entirely understanding what the point of the
>> ADVERTISE message here is?
>>
>> IIUC, the flow of messages you are describing will end up as:
>>
>>   1. C ->  S  remote_supports_feature_args (KEEPALIVE)
>>   2. S ->  C  remote_supports_feature_ret  (TRUE|FALSE)
>>   3. C ->  S  keepalive ADVERTISE
>>   4. C ->  S  keepalive PING
>>   5. S ->  C  keepalive PONG
>>   6. C ->  S  keepalive PING
>>   7. S ->  C  keepalive PONG
>>   ...
>>   n. C ->  S  keepalive PING
>>   n+1. S ->  C  keepalive PONG
>>
>> We need to the remote_supports_feature method to determine if the
>> keepalive protocol is supported, what purpose is the ADVERTISE
>> message serving ?
>
> PING messages can be sent by both client and server and sending them can be
> independently disabled on both sides. ADVERTISE is sent because a server may
> never get any PING messages from a client which was configured not to send
> them. But the server still wants to know that the client supports this feature
> and thus the server can send PING messages. Also there is a keepalive timeout
> between ADVERTISE and PING, which can be different on both sides so server may
> decide to send PING earlier than the client.

So, if I understand correctly, there are two flows:

client->server pings:

virConnectAllowKeepAlive()
1. C ->  S  remote_supports_feature_args (KEEPALIVE)
2. S ->  C  remote_supports_feature_ret  (TRUE|FALSE)
virConnectStartKeepAlive()
4a. C ->  S  keepalive PING
5a. S ->  C  keepalive PONG
6a. C ->  S  keepalive PING
7a. S ->  C  keepalive PONG
...

server->client pings:

virConnectAllowKeepAlive()
1. C ->  S  remote_supports_feature_args (KEEPALIVE)
2. S ->  C  remote_supports_feature_ret  (TRUE|FALSE)
3. C ->  S  keepalive ADVERTISE
server checks conf file
4b. S ->  C  keepalive PING
5b. C ->  S  keepalive PONG
6b. S ->  C  keepalive PING
7b. C ->  S  keepalive PONG
...

Steps 1-3 are shared by both directions (although step 3 is not 
essential in the c->s direction).  Remaining ping/pong sequences are 
independent, and can operate at different frequencies (c->s at the 
frequency in virConnectStartKeepAlive(), and s->c at the frequency in 
the conf file).  Either side can terminate the connection if enough 
PONGs are not received (c->s terminates according to count in 
virConnectStartKeepAlive(), and s->c according to conf file).

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list