[Libvirt-cim] [PATCH 2 of 2] Clean up CSI/CSMI integration

Jay Gagnon grendel at linux.vnet.ibm.com
Tue Jan 22 21:24:15 UTC 2008


# HG changeset patch
# User Jay Gagnon <grendel at linux.vnet.ibm.com>
# Date 1201036935 18000
# Node ID 07117ac8c5fb5447dadc8efed51e8cf7077345d9
# Parent  977df56c5d87f5a90fc90400ecdc7d0687ce2d88
Clean up CSI/CSMI integration

The functions responsible for actually firing the indication weren't really integrated in the first patch, so much as co-existing.  This one attempts to reconcile the two approaches.

Changes from #1 to #2:
Fixed a segfault produced by a hard-coded constant (CS_MODIFIED) that should have been a variable (ind_type).

Changes from #2 to #3:
Added some more information to some failure messages in _do_indication.

Signed-off-by: Jay Gagnon <grendel at linux.vnet.ibm.com>

diff -r 977df56c5d87 -r 07117ac8c5fb src/Virt_ComputerSystemIndication.c
--- a/src/Virt_ComputerSystemIndication.c	Tue Jan 22 16:16:08 2008 -0500
+++ b/src/Virt_ComputerSystemIndication.c	Tue Jan 22 16:22:15 2008 -0500
@@ -48,6 +48,7 @@ static CMPI_THREAD_TYPE lifecycle_thread
 
 enum CS_EVENTS {CS_CREATED,
                 CS_DELETED,
+                CS_MODIFIED,
 };
 
 static pthread_cond_t lifecycle_cond = PTHREAD_COND_INITIALIZER;
@@ -157,82 +158,70 @@ static bool dom_changed(struct dom_xml p
         return ret;
 }
 
-static bool _lifecycle_indication(const CMPIBroker *broker,
-                                  const CMPIContext *ctx,
-                                  const CMPIObjectPath *newsystem,
-                                  const char *type)
+static bool _do_indication(const CMPIBroker *broker,
+                           const CMPIContext *ctx,
+                           CMPIInstance *affected_inst,
+                           int ind_type,
+                           const char *ind_type_name,
+                           char *prefix,
+                           char *ns)
 {
+        CMPIObjectPath *affected_op;
         CMPIObjectPath *ind_op;
         CMPIInstance *ind;
         CMPIStatus s;
+        bool ret = true;
 
         ind = get_typed_instance(broker,
-                                 "Xen", /* Temporary hack */
-                                 type,
-                                 NAMESPACE(newsystem));
+                                 prefix,
+                                 ind_type_name,
+                                 ns);
+
+        /* Generally report errors and hope to continue, since we have no one 
+           to actually return status to. */
         if (ind == NULL) {
-                CU_DEBUG("Failed to create ind");
-                return false;
+                CU_DEBUG("Failed to create ind, type '%s:%s_%s'", 
+                         ns,
+                         prefix,
+                         ind_type_name);
+                ret = false;
         }
 
         ind_op = CMGetObjectPath(ind, &s);
         if (s.rc != CMPI_RC_OK) {
-                CU_DEBUG("Failed to get ind_op");
-                return false;
+                CU_DEBUG("Failed to get ind_op.  Error: '%s'", s.msg);
+                ret = false;
         }
 
-        CMSetProperty(ind, "AffectedSystem",
-                      (CMPIValue *)&newsystem, CMPI_ref);
+        switch (ind_type) {
+        case CS_CREATED:
+        case CS_DELETED:
+                affected_op = CMGetObjectPath(affected_inst, &s);
+                if (s.rc != CMPI_RC_OK) {
+                        ret = false;
+                        CU_DEBUG("problem getting affected_op: '%s'", s.msg);
+                        goto out;
+                }
+                CMSetProperty(ind, "AffectedSystem",
+                              (CMPIValue *)&affected_op, CMPI_ref);
+                break;
+        case CS_MODIFIED:
+                CMSetProperty(ind, "PreviousInstance",
+                              (CMPIValue *)&affected_inst, CMPI_instance);
+                break;
+        }
 
         CU_DEBUG("Delivering Indication: %s",
-               CMGetCharPtr(CMObjectPathToString(ind_op, NULL)));
-
-        CBDeliverIndication(_BROKER,
-                            ctx,
-                            NAMESPACE(newsystem),
-                            ind);
-
-
-        return true;
-}
-
-static bool _do_modified_indication(const CMPIBroker *broker,
-                                    const CMPIContext *ctx,
-                                    CMPIInstance *mod_inst,
-                                    char *prefix,
-                                    char *ns)
-{
-        CMPIObjectPath *ind_op;
-        CMPIInstance *ind;
-        CMPIStatus s;
-
-        ind = get_typed_instance(broker,
-                                 prefix,
-                                 "ComputerSystemModifiedIndication",
-                                 ns);
-        if (ind == NULL) {
-                CU_DEBUG("Failed to create ind");
-                return false;
-        }
-
-        ind_op = CMGetObjectPath(ind, &s);
-        if (s.rc != CMPI_RC_OK) {
-                CU_DEBUG("Failed to get ind_op");
-                return false;
-        }
-
-        CMSetProperty(ind, "PreviousInstance",
-                      (CMPIValue *)&mod_inst, CMPI_instance);
-
-        CU_DEBUG("Delivering Indication: %s\n",
                  CMGetCharPtr(CMObjectPathToString(ind_op, NULL)));
 
-        CBDeliverIndication(_BROKER,
+        CBDeliverIndication(broker,
                             ctx,
-                            CIM_VIRT_NS,
+                            ns,
                             ind);
+        CU_DEBUG("Delivered");
 
-        return true;
+ out:
+        return ret;
 }
 
 static bool wait_for_event(void)
@@ -251,18 +240,12 @@ static bool wait_for_event(void)
         return true;
 }
 
-static bool dom_in_list(virDomainPtr dom, int count, virDomainPtr *list)
+static bool dom_in_list(char *uuid, int count, struct dom_xml *list)
 {
-        const char *_name;
         int i;
 
-        _name = virDomainGetName(dom);
-
         for (i = 0; i < count; i++) {
-                const char *name;
-
-                name = virDomainGetName(list[i]);
-                if (STREQ(name, _name))
+                if (STREQ(uuid, list[i].uuid))
                         return true;
         }
 
@@ -271,60 +254,20 @@ static bool dom_in_list(virDomainPtr dom
 
 static bool async_ind(CMPIContext *context,
                       virConnectPtr conn,
-                      const char *name,
-                      int type)
-{
-        CMPIInstance *newinst;
-        CMPIObjectPath *op;
-        CMPIStatus s;
-        const char *type_name;
-        char *type_cn = NULL;
-        const char *ns = CIM_VIRT_NS;
-
-        /* FIXME: Hmm, need to get the namespace a better way */
-
-        if (type == CS_CREATED) {
-                type_name = "ComputerSystemCreatedIndication";
-                type_cn = get_typed_class(pfx_from_conn(conn), type_name);
-
-                op = CMNewObjectPath(_BROKER, ns, type_cn, &s);
-        } else if (type == CS_DELETED) {
-                type_name = "ComputerSystemDeletedIndication";
-                type_cn = get_typed_class(pfx_from_conn(conn), type_name);
-
-                op = CMNewObjectPath(_BROKER, ns, type_cn, &s);
-        } else {
-                CU_DEBUG("Unknown event type: %i", type);
-                return false;
-        }
-
-        if (type != CS_DELETED)
-                newinst = instance_from_name(_BROKER, conn, (char *)name, op);
-        else
-                /* A deleted domain will have no instance to lookup */
-                newinst = CMNewInstance(_BROKER, op, &s);
-
-        op = CMGetObjectPath(newinst, NULL);
-
-        free(type_cn);
-
-        return _lifecycle_indication(_BROKER, context, op, type_name);
-}
-
-static bool mod_ind(CMPIContext *context,
-                    virConnectPtr conn,
-                    struct dom_xml prev_dom,
-                    char *prefix,
-                    char *ns)
+                      int ind_type,
+                      struct dom_xml prev_dom,
+                      char *prefix,
+                      char *ns)
 {
         bool rc;
         char *name = NULL;
-        CMPIInstance *mod_inst;
+        char *type_name = NULL;
+        CMPIInstance *affected_inst;
 
-        mod_inst = get_typed_instance(_BROKER,
-                                      prefix,
-                                      "ComputerSystem",
-                                      ns);
+        affected_inst = get_typed_instance(_BROKER,
+                                           prefix,
+                                           "ComputerSystem",
+                                           ns);
 
         name = sys_name_from_xml(prev_dom.xml);
         CU_DEBUG("Name for system: '%s'", name);
@@ -333,12 +276,25 @@ static bool mod_ind(CMPIContext *context
                 goto out;
         }
 
-        CMSetProperty(mod_inst, "Name", 
+        switch (ind_type) {
+        case CS_CREATED:
+                type_name = "ComputerSystemCreatedIndication";
+                break;
+        case CS_DELETED:
+                type_name = "ComputerSystemDeletedIndication";
+                break;
+        case CS_MODIFIED:
+                type_name = "ComputerSystemModifiedIndication";
+                break;
+        }
+
+        CMSetProperty(affected_inst, "Name", 
                       (CMPIValue *)name, CMPI_chars);
-        CMSetProperty(mod_inst, "UUID",
+        CMSetProperty(affected_inst, "UUID",
                       (CMPIValue *)prev_dom.uuid, CMPI_chars);
 
-        rc = _do_modified_indication(_BROKER, context, mod_inst, prefix, ns);
+        rc = _do_indication(_BROKER, context, affected_inst, 
+                            ind_type, type_name, prefix, ns);
 
  out:
         free(name);
@@ -352,8 +308,7 @@ static CMPI_THREAD_RETURN lifecycle_thre
         CMPIStatus s;
         int prev_count;
         int cur_count;
-        virDomainPtr *prev_list;
-        virDomainPtr *cur_list;
+        virDomainPtr *tmp_list;
         struct dom_xml *cur_xml = NULL;
         struct dom_xml *prev_xml = NULL;
         virConnectPtr conn;
@@ -363,66 +318,65 @@ static CMPI_THREAD_RETURN lifecycle_thre
         conn = connect_by_classname(_BROKER, args->classname, &s);
         if (conn == NULL) {
                 CU_DEBUG("Failed to connect: %s", CMGetCharPtr(s.msg));
-                return NULL;
+                goto out;
         }
 
         pthread_mutex_lock(&lifecycle_mutex);
 
         CBAttachThread(_BROKER, context);
 
-        prev_count = get_domain_list(conn, &prev_list);
-        s = doms_to_xml(&prev_xml, prev_list, prev_count);
+        prev_count = get_domain_list(conn, &tmp_list);
+        s = doms_to_xml(&prev_xml, tmp_list, prev_count);
         if (s.rc != CMPI_RC_OK)
                 CU_DEBUG("doms_to_xml failed.  Attempting to continue.");
-
+        free_domain_list(tmp_list, prev_count);
+        free(tmp_list);
 
         CU_DEBUG("entering event loop");
         while (lifecycle_enabled) {
                 int i;
                 bool res;
 
-                cur_count = get_domain_list(conn, &cur_list);
-                s = doms_to_xml(&cur_xml, cur_list, cur_count);
+                cur_count = get_domain_list(conn, &tmp_list);
+                s = doms_to_xml(&cur_xml, tmp_list, cur_count);
                 if (s.rc != CMPI_RC_OK)
                         CU_DEBUG("doms_to_xml failed.");
+                free_domain_list(tmp_list, cur_count);
+                free(tmp_list);
 
                 for (i = 0; i < cur_count; i++) {
-                        res = dom_in_list(cur_list[i], prev_count, prev_list);
+                        res = dom_in_list(cur_xml[i].uuid, prev_count, prev_xml);
                         if (!res)
-                                async_ind(context,
-                                          conn,
-                                          virDomainGetName(cur_list[i]),
-                                          CS_CREATED);
+                                async_ind(context, conn, CS_CREATED,
+                                          cur_xml[i], prefix, ns);
+
                 }
 
                 for (i = 0; i < prev_count; i++) {
-                        res = dom_in_list(prev_list[i], cur_count, cur_list);
+                        res = dom_in_list(prev_xml[i].uuid, cur_count, cur_xml);
                         if (!res)
-                                async_ind(context,
-                                          conn,
-                                          virDomainGetName(prev_list[i]),
-                                          CS_DELETED);
+                                async_ind(context, conn, CS_DELETED, 
+                                          prev_xml[i], prefix, ns);
                 }
 
                 for (i = 0; i < prev_count; i++) {
                         res = dom_changed(prev_xml[i], cur_xml, cur_count);
                         if (res) {
-                                CU_DEBUG("Domain '%s' modified.", prev_xml[i].uuid);
-                                mod_ind(context, conn, prev_xml[i], prefix, ns);
+                                async_ind(context, conn, CS_MODIFIED, 
+                                          prev_xml[i], prefix, ns);
+
                         }
                         free_dom_xml(prev_xml[i]);
                 }
 
-                free_domain_list(prev_list, prev_count);
-
-                free(prev_list);
                 free(prev_xml);
-                prev_list = cur_list;
                 prev_xml = cur_xml;
                 prev_count = cur_count;
 
                 wait_for_event();
         }
+
+ out:
         pthread_mutex_unlock(&lifecycle_mutex);
         free_ind_args(&args);
         free(prefix);




More information about the Libvirt-cim mailing list