From 32c7d99b5a89a6d7976255c285eb4d6c513735d6 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 5 Oct 2008 05:24:24 +0200 Subject: [PATCH] Migration support Signal TERM is send, we will not accept any new offers. --- node/avahi.c | 10 +++++----- node/main.c | 11 ++++++++++- node/migrate.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ node/publish.c | 25 +++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 node/migrate.c diff --git a/node/avahi.c b/node/avahi.c index 9cbd2fa..3e6d645 100644 --- a/node/avahi.c +++ b/node/avahi.c @@ -53,12 +53,12 @@ static void modify_callback(AvahiTimeout *e, void *userdata) { * service and create it anew */ if (avahi_client_get_state(client) != AVAHI_CLIENT_FAILURE) { - /* And create them again with the new name */ - struct timeval tv; + /* And create them again with the new name */ + struct timeval tv; - create_services(client); + create_services(client); - avahi_simple_poll_get(simple_poll)->timeout_update(e, avahi_elapse_time(&tv, 1000*POLL, 0)); + avahi_simple_poll_get(simple_poll)->timeout_update(e, avahi_elapse_time(&tv, 1000*POLL, 0)); } } @@ -121,7 +121,7 @@ void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED vo * name on the network, so it's time to create our services */ struct timeval tv; - if (!avahi_service_browser_new(c, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_offer._tcp", NULL, 0, browse_callback, NULL)) { + if (! (offerServiceBrowser = avahi_service_browser_new(c, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_offer._tcp", NULL, 0, browse_callback, NULL))) { fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(c))); } diff --git a/node/main.c b/node/main.c index 8fef498..fce15cf 100644 --- a/node/main.c +++ b/node/main.c @@ -3,19 +3,28 @@ #include #include +#include #include "node.h" +void terminate(int sig) { + if (offerServiceBrowser) + avahi_service_browser_free(offerServiceBrowser); + +} + int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char*argv[]) { /* Allocate main loop object */ if (!(simple_poll = avahi_simple_poll_new())) { fprintf(stderr, "Failed to create simple poll object.\n"); goto fail; } - + /* The client that is going to do the work */ client_callback(NULL, AVAHI_CLIENT_FAILURE, NULL); + signal(SIGTERM, terminate); + /* Run the main loop */ avahi_simple_poll_loop(simple_poll); diff --git a/node/migrate.c b/node/migrate.c new file mode 100644 index 0000000..b2c944e --- /dev/null +++ b/node/migrate.c @@ -0,0 +1,49 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "../handler_virt_tender.h" + +int migrate_domain(AvahiClient *client, virDomainPtr dom) { + int ret = -1; + unsigned long memory; + char *target; + char destination[1024]; + virConnectPtr dconn; + + memory = virDomainGetMaxMemory(dom); + target = create_tender(client, NULL, virDomainGetName(dom), virDomainGetMaxMemory(dom)); + + snprintf(destination, 1022, "xen://%s/", target); + destination[1023] = '\0'; + free(target); + + dconn = virConnectOpen(destination); + + if (dconn) { + virDomainPtr desDom; + + desDom = virDomainMigrate(dom, dconn, VIR_MIGRATE_LIVE, NULL, NULL, 1000); + + if (desDom) { + ret = 0; + virDomainFree(desDom); + } + + virConnectClose(dconn); + } + + return ret; +} diff --git a/node/publish.c b/node/publish.c index f949bc7..63750f6 100644 --- a/node/publish.c +++ b/node/publish.c @@ -68,6 +68,31 @@ void remove_everything() { } } +void migrate_everything(AvahiClient *c) { + if (domus) { + virConnectPtr conn; + conn = virConnectOpen(NULL); + + if (conn) { + int i; + for (i = 0; i < domu_count; i++) { + virDomainPtr dom; + dom = virDomainLookupByID (conn, domus[i].domainid); + + if (dom) { + if (migrate_domain(c, dom) != 0) { + virDomainShutdown(dom); + } + + virDomainFree(dom); + } + + } + virConnectClose(conn); + } + } +} + void create_services(AvahiClient *c) { virConnectPtr conn = virConnectOpenReadOnly(NULL); -- 2.11.4.GIT