δΊ 2013-3-22 2:43, John Ferlan ει:
On 03/20/2013 11:39 PM, Wenchao Xia wrote:
> Original code 'continue' in the 'for' in return_enum_vssd() when
> one VSDS fail in retrieving, but forgot to set s to normal. This patch
> fix this case.
> Also many debug message is added to log the error if met.
>
> Signed-off-by: Wenchao Xia <xiawenc(a)linux.vnet.ibm.com>
> ---
> src/Virt_VSSD.c | 43 +++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/src/Virt_VSSD.c b/src/Virt_VSSD.c
> index 975623b..3d2de26 100644
> --- a/src/Virt_VSSD.c
> +++ b/src/Virt_VSSD.c
> @@ -181,8 +181,10 @@ static int instance_from_dom(const CMPIBroker *broker,
> struct domain *dominfo = NULL;
>
> ret = get_dominfo(dom, &dominfo);
> - if (!ret)
> + if (!ret) {
> + CU_DEBUG("Failed in get_dominfo().");
> goto out;
> + }
>
> op = CMGetObjectPath(inst, NULL);
> pfx = class_prefix_name(CLASSNAME(op));
> @@ -245,6 +247,7 @@ static int instance_from_dom(const CMPIBroker *broker,
> (dominfo->type == DOMAIN_KVM) || (dominfo->type == DOMAIN_QEMU))
{
> s = _set_fv_prop(broker, dominfo, inst);
> if (s.rc != CMPI_RC_OK) {
> + CU_DEBUG("Failed to set full virtual props.");
> ret = 0;
> goto out;
> }
> @@ -259,6 +262,7 @@ static int instance_from_dom(const CMPIBroker *broker,
> dominfo->type);
>
> if (asprintf(&vsid, "%s:%s", pfx, dominfo->name) == -1) {
> + CU_DEBUG("Failed in asprintf().");
> ret = 0;
> goto out;
> }
> @@ -328,14 +332,34 @@ static CMPIStatus return_enum_vssd(const CMPIObjectPath
*reference,
> } else if (count == 0)
> goto out;
>
> + int fail_count = 0;
Put this with the other decls.
OK.
> for (i = 0; i < count; i++) {
> CMPIInstance *inst = NULL;
>
> inst = _get_vssd(_BROKER, reference, conn, list[i], &s);
>
> virDomainFree(list[i]);
> - if (inst == NULL)
> + if (inst == NULL) {
> + /* log the error */
> + const char *dom_name = virDomainGetName(list[i]);
You'll need to do this before you virDomainFree(list[i]) or reformat the
code a bit to do the virDomainFree() twice. Once before the continue
below and once if inst != NULL
What a stupid error I have, I should be more careful about this. My
bad, thank u for the mention!
Or do the virDomainFree() below in a for loop before free(list).
The rest seems fine.
John
> + if (s.msg) {
> + CU_DEBUG("Failed to get VSSD instance from
"
> + "domain [%s], status msg [%s].",
> + dom_name, CMGetCharPtr(s.msg));
> + } else {
> + CU_DEBUG("Failed to get VSSD instance from
"
> + "domain [%s].",
> + dom_name);
> + }
> + /* restore s until last one */
> + if (i < count - 1) {
> + cu_statusf(_BROKER, &s,
> + CMPI_RC_OK,
> + "NULL");
> + }
> + fail_count++;
> continue;
> + }
>
> if (names_only)
> cu_return_instance_name(results, inst);
> @@ -343,6 +367,21 @@ static CMPIStatus return_enum_vssd(const CMPIObjectPath
*reference,
> CMReturnInstance(results, inst);
> }
>
> + /* check if some VS fail */
> + if (fail_count > 0) {
> + CU_DEBUG("Failed to get %d VSSD in enum, total is %d.",
> + fail_count, count);
> + if (fail_count < count) {
> + /* consider it succeed, some VSSD will be returned */
> + cu_statusf(_BROKER, &s,
> + CMPI_RC_OK,
> + "Got %d/%d VSSD, "
> + "some VS may changed during enum",
> + count - fail_count, count);
> + }
> + }
> +
> +
> out:
> free(list);
> virConnectClose(conn);
>
_______________________________________________
Libvirt-cim mailing list
Libvirt-cim(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvirt-cim
--
Best Regards
Wenchao Xia