On Tue, Jan 09, 2007 at 09:44:44AM -0500, Daniel Veillard wrote:
On Fri, Jan 05, 2007 at 09:18:53PM +0000, Daniel P. Berrange wrote:
> The attached patch provides a new driver backend for libvirt which allows
> management of QEMU instances by talking to the libvirt QEMU daemon. It
> basically just marshalls libvirt API calls onto the wire & de-marshalls
> the reply. All the interesting functionality stuff is in the daemon.
Okay, but I'm getting a bit lost about the potential daemons running,
there one can be autostarted, in the previous patch we also potentially
fork(fork(daemon)) so I'm wondering how many process are actually running
in the end, maybe I will need a couple of pictures, like in the current
architecture page
http://libvirt.org/architecture.html (which will have
to be updated too :-)
There's two ways its launched:
- The session bus is auto-launched by libvirt. In this scenaro, libvirt
does the double fork() magic to dis-inherit the libvirt_qemud process
- The system bus is started manually. In this case, it runs in foreground
unless you use the --daemon command line argument to make it do the
double-fork() into background.
[...]
> +int qemudNodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virNodeInfoPtr info){
> + info->cores = 1;
> + info->threads = 1;
> + info->sockets = 1;
> + info->nodes = 1;
> + strcpy(info->model, "i686");
> + info->mhz = 6000;
> + info->cpus = 1;
> + info->memory = 1024*1024;
> + return 0;
> +}
haha :-) At least worth a big TODO !
Shouldn't qemud_internal.c gets its own error reporting function like the
other _internal.c which does the right stuff, I only spotted returns of
error values, and this is linked to the client binary so this seems to be
missing, right ?
The only errors that should be occurring in qemud_internal.c are two
classes:
- Data transport errors (eg, failure to connect, TLS failures, etc)
- Errors forwarded back from the daemon over the wire.
I already deal with the latter. The former probably needs a little more
work.
> RCS file: /data/cvs/libvirt/src/virsh.c,v
> retrieving revision 1.41
> diff -u -p -r1.41 virsh.c
> --- src/virsh.c 22 Nov 2006 17:48:29 -0000 1.41
> +++ src/virsh.c 5 Jan 2007 21:09:08 -0000
> @@ -292,7 +292,7 @@ cmdConnect(vshControl * ctl, vshCmd * cm
>
> if (ctl->name)
> free(ctl->name);
> - ctl->name = vshCommandOptString(cmd, "name", NULL);
> + ctl->name = vshStrdup(ctl, vshCommandOptString(cmd, "name",
NULL));
>
I'm a bit lost on that one, was that a separate bug ?
We switch from a static string to dynamically allocated one, right ?
Opps, this is compeltely unrelated to QEMU - its a general bug. The string
from vshCommandOptString is just a pointer to its internal buffer. This
is free'd next time user enters a command in virsh. So by storing it in
ctl->name we keep a pointer to a free'd string, with predictable SEGV
a short while later. Simply dup'ing the string is enough.
> @@ -268,6 +268,9 @@ virDefaultErrorFunc(virErrorPtr err)
> case VIR_FROM_RPC:
> dom = "XML-RPC ";
> break;
> + case VIR_FROM_QEMUD:
> + dom = "QEMUD ";
> + break;
> }
> if ((err->dom != NULL) && (err->code != VIR_ERR_INVALID_DOMAIN))
{
> domain = err->dom->name;
I guess some new error code will need to be added too once quemud_internal.c
is being updated ... Hum, how do we process errors provided by the server ?
The libvirt_qemud daemon includes <libvirt/virterror.h> and sends back the
appropriate error codes over the wire, along with a message. This is used
to call __virRaiseError - see the qemudPacketError() function at the top
of the qemud_internal.c file - this function is called whenver the wire
protocol gives back an unexpected result
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules:
http://search.cpan.org/~danberr/ -=|
|=- Projects:
http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|