[libvirt] In freeze for libvirt-0.9.8 and availability of rc2

Daniel P. Berrange berrange at redhat.com
Wed Dec 7 12:12:28 UTC 2011


On Sun, Dec 04, 2011 at 04:10:34PM +0800, Daniel Veillard wrote:
> On Fri, Dec 02, 2011 at 02:30:35PM +0100, Peter Krempa wrote:
> > On 12/02/2011 01:42 AM, Daniel Veillard wrote:
> > >On Thu, Dec 01, 2011 at 02:11:24PM -0700, Eric Blake wrote:
> > >>But that means we really are committing to an rc2.
> > >
> > >   Definitely. For example there is apparently a problem with commit
> > >fa9595003d043df9f2efe95521c00898cef27106 that we ough to fix quickly too
> > >to allow further testing :-)
> > >
> > >Daniel
> > >
> > The problem was caused by two threads that both were thinking they
> > are having the buck and entering poll() which caused some clients to
> > hang. It was possible due to a race condition and therefore was not
> > 100% reproducible. It should be fixed now with:
> > http://www.redhat.com/archives/libvir-list/2011-December/msg00116.html
> 
>   Indeed, the current git head works fine again for me, thanks a lot
> for chasing this :-)
> 
>   So I made an second release candidate available at:
> 
> ftp://libvirt.org/libvirt/libvirt-0.9.8-rc2.tar.gz
> 
> along with rpms, I also tagged git with it.
>   Hopefully the builds on BSD and Windows should be fixed, it would
> be good if it could be tested on OsX and since there was a build done
> last month on Android, I wonder if this could be done again [1].

Thre is something very broken in the RPC code when an event loop
is activated, which is resulting in frequent crashes. Fixing this
is a release blocker IMHO.

Attaching a demo program which crashes 50% of the time or more with
GIT head.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|
-------------- next part --------------

#include <stdlib.h>
#include <stdio.h>
#include <libvirt/libvirt.h>
#include <pthread.h>

static int quit = 0;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

static void *threadevent(void *arg)
{
    pthread_mutex_lock(&lock);
    while (!quit) {
        pthread_mutex_unlock(&lock);
        virEventRunDefaultImpl();
        pthread_mutex_lock(&lock);
    }
    pthread_mutex_unlock(&lock);
    return NULL;
}

static void *threadmain(void *arg)
{
    virConnectPtr conn = arg;
    virDomainPtr *doms;
    int *domids;
    int i,j;
    int n = virConnectNumOfDomains(conn);

    doms = malloc(sizeof(virDomainPtr) *n);
    domids = malloc(sizeof(int) *n);

    virConnectListDomains(conn, domids, n);
    fprintf(stderr, "n%d\n", n);
    for (i = 0 ; i < n ; i++)
        doms[i] = virDomainLookupByID(conn, domids[i]);

    for (j = 0 ; j < 10 ; j++) {
        for (i = 0 ; i < n ; i++) {
            virDomainInfo info;

            virDomainGetInfo(doms[i], &info);
            fprintf(stderr, "%s %llu\n", virDomainGetName(doms[i]), info.cpuTime);
        }
    }

    for (i = 0 ; i < n ; i++)
        virDomainFree(doms[i]);

    free(doms);
    free(domids);

    virConnectClose(conn);
    return NULL;
}

#define NUM_THREADS 10

int main(void) {
    virConnectPtr conn;
    int i;
    pthread_t threads[NUM_THREADS];
    pthread_t event;

    virEventRegisterDefaultImpl();

    conn = virConnectOpen("qemu:///session");

    pthread_create(&event, NULL,
                   threadevent, NULL);

    for (i = 0 ; i < NUM_THREADS ; i++) {
        virConnectRef(conn);

        pthread_create(&threads[i], NULL,
                       threadmain, conn);
    }

    for (i = 0 ; i < NUM_THREADS ; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_lock(&lock);
    quit = 1;
    pthread_mutex_unlock(&lock);
    virConnectClose(conn);
    pthread_join(event, NULL);

    return 0;
}


More information about the libvir-list mailing list