Trying to investigate & debug the keepalive series I decided we
needed a better way to trace the RPC protocol than the regular
debug messages. Ideally we'd have a wireshark dissector but that
seems like it will be an awful lot of work todo. So instead I
have added a few systemtap probes to the RPC call which fire
everytime an RPC message is queued for dispatch, or a completed
RPC message is read off the wire
Now I can see all communications using a script like this
# cat > watch.stp <<EOF
function msginfo(prefix, prog, version, proc, type, status, serial)
{
if (type == 0)
typestr = "call"
else if (type == 1)
typestr = "reply"
else if (type == 2)
typestr = "message"
else if (type == 3)
typestr = "stream"
else
typestr = "unknown"
if (status == 0)
statusstr = "ok"
else if (status == 1)
statusstr = "error"
else if (status == 2)
statusstr = "continue"
else
statusstr = "unknown"
printf("%s program: %-10d version: %d procedure: %-4d type: %u:%-9s status: %u:%-9s
serial: %-4d\n",
prefix, prog, version, proc, type, typestr, status, statusstr, serial);
}
probe libvirt.rpc.server_msg_rx {
msginfo(">S", prog, vers, proc, type, status, serial)
}
probe libvirt.rpc.server_msg_tx {
msginfo("<S", prog, vers, proc, type, status, serial)
}
probe libvirt.rpc.client_msg_rx {
msginfo("<C", prog, vers, proc, type, status, serial)
}
probe libvirt.rpc.client_msg_tx {
msginfo(">C", prog, vers, proc, type, status, serial)
}
EOF
# stap watch.stp
C program: 536903814 version: 1 procedure: 66 type: 0:call
status: 0:ok serial: 0
S program: 536903814 version: 1 procedure: 66 type: 0:call status: 0:ok
serial: 0
<S program: 536903814 version: 1 procedure: 66 type: 1:reply
status: 0:ok serial: 0
<C program: 536903814 version: 1 procedure: 66 type: 1:reply status: 0:ok
serial: 0
C program: 536903814 version: 1 procedure: 1 type: 0:call
status: 0:ok serial: 1
S program: 536903814 version: 1 procedure: 1 type: 0:call status: 0:ok
serial: 1
<S program: 536903814 version: 1 procedure: 1 type: 1:reply
status: 0:ok serial: 1
<C program: 536903814 version: 1 procedure: 1 type: 1:reply status: 0:ok
serial: 1
C program: 536903814 version: 1 procedure: 110 type: 0:call
status: 0:ok serial: 2
S program: 536903814 version: 1 procedure: 110 type: 0:call status: 0:ok
serial: 2
<S program: 536903814 version: 1 procedure: 110 type: 1:reply
status: 0:ok serial: 2
<C program: 536903814 version: 1 procedure: 110 type: 1:reply status: 0:ok
serial: 2
C program: 536903814 version: 1 procedure: 23 type: 0:call
status: 0:ok serial: 3
S program: 536903814 version: 1 procedure: 23 type: 0:call status: 0:ok
serial: 3
<S program: 536903814 version: 1 procedure: 23 type: 1:reply
status: 0:ok serial: 3
<C program: 536903814 version: 1 procedure: 23 type: 1:reply status: 0:ok
serial: 3
C program: 536903814 version: 1 procedure: 19 type: 0:call
status: 0:ok serial: 4
S program: 536903814 version: 1 procedure: 19 type: 0:call status: 0:ok
serial: 4
<S program: 536903814 version: 1 procedure: 19 type: 1:reply
status: 0:ok serial: 4
<C program: 536903814 version: 1 procedure: 19 type: 1:reply status: 0:ok
serial: 4
C program: 536903814 version: 1 procedure: 16 type: 0:call
status: 0:ok serial: 5
S program: 536903814 version: 1 procedure: 16 type: 0:call status: 0:ok
serial: 5
<S program: 536903814 version: 1 procedure: 16 type: 1:reply
status: 0:ok serial: 5
<C program: 536903814 version: 1 procedure: 16 type: 1:reply status: 0:ok
serial: 5
C program: 536903814 version: 1 procedure: 151 type: 0:call
status: 0:ok serial: 6
S program: 536903814 version: 1 procedure: 151 type: 0:call status: 0:ok
serial: 6
<S program: 536903814 version: 1 procedure: 151 type: 1:reply
status: 0:ok serial: 6
<C program: 536903814 version: 1 procedure: 151 type: 1:reply status: 0:ok
serial: 6
C program: 536903814 version: 1 procedure: 15 type: 0:call
status: 0:ok serial: 7
S program: 536903814 version: 1 procedure: 15 type: 0:call status: 0:ok
serial: 7
<S program: 536903814 version: 1 procedure: 15 type: 1:reply
status: 0:ok serial: 7
<C program: 536903814 version: 1 procedure: 15 type: 1:reply status: 0:ok
serial: 7
C program: 536903814 version: 1 procedure: 183 type: 0:call
status: 0:ok serial: 8
S program: 536903814 version: 1 procedure: 183 type: 0:call status: 0:ok
serial: 8
<S program: 536903814 version: 1 procedure: 183 type: 1:reply
status: 0:ok serial: 8
<C program: 536903814 version: 1 procedure: 183 type: 1:reply status: 0:ok
serial: 8
C program: 536903814 version: 1 procedure: 122 type: 0:call
status: 0:ok serial: 9
S program: 536903814 version: 1 procedure: 122 type: 0:call status: 0:ok
serial: 9
<S program: 536903814 version: 1 procedure: 122 type: 1:reply
status: 0:ok serial: 9
<C program: 536903814 version: 1 procedure: 122 type: 1:reply status: 0:ok
serial: 9
C program: 536903814 version: 1 procedure: 121 type: 0:call
status: 0:ok serial: 10
S program: 536903814 version: 1 procedure: 121 type: 0:call status: 0:ok
serial: 10
<S program: 536903814 version: 1 procedure: 121 type: 1:reply
status: 0:ok serial: 10
<C program: 536903814 version: 1 procedure: 121 type: 1:reply status: 0:ok
serial: 10
C program: 536903814 version: 1 procedure: 2 type: 0:call
status: 0:ok serial: 11
S program: 536903814 version: 1 procedure: 2 type: 0:call status: 0:ok
serial: 11
<S program: 536903814 version: 1 procedure: 2 type: 1:reply
status: 0:ok serial: 11
<C program: 536903814 version: 1 procedure: 2 type: 1:reply status: 0:ok
serial: 11
Is the trace information resulting from 'virsh dominfo $VM'
An RPC call shoudl result in 4 messages, tx by client, rx
by server, tx by server and rx by client. An async event
will only result in 2 messages, tx by server, rx by client
and so on.
A further enhancement I want to make is to make the rpc
generator script, spit out a systemtap function for
converting procedure numbers into function/event names,
as well as adding helper functions for converting program
type and status numbers into friendly strings