A question: why is saImmOmCcbAbort() not allowed on an augmented ccb? 
The OM probably doesn't know if the CCB has been augmented or not, so it 
would have to check for this error code and then fall back to calling 
saImmOmCcbFinalize() + saImmOmCcbInitialize() if this happens.

regards,
Anders Widell

2014-04-04 14:53, Anders Bjornerstedt skrev:
>   osaf/libs/agents/saf/imma/imma_cb.h                |   1 +
>   osaf/libs/agents/saf/imma/imma_def.h               |   2 +-
>   osaf/libs/agents/saf/imma/imma_oi_api.c            |   9 +-
>   osaf/libs/agents/saf/imma/imma_om_api.c            |  82 +++++++++++++++++-
>   osaf/libs/saf/include/saImmOm_A_2_13.h             |   2 +
>   osaf/libs/saf/include/saImmOm_A_2_14.h             |  46 ++++++++++
>   tests/immsv/common/immtest.c                       |   4 +-
>   tests/immsv/management/test_saImmOmCcbApply.c      |  95 
> ++++++++++++++++++++++
>   tests/immsv/management/test_saImmOmCcbInitialize.c |   4 +
>   9 files changed, 231 insertions(+), 14 deletions(-)
>
>
> See ticket or osaf/services/saf/immsv/README for details.
>
> diff --git a/osaf/libs/agents/saf/imma/imma_cb.h 
> b/osaf/libs/agents/saf/imma/imma_cb.h
> --- a/osaf/libs/agents/saf/imma/imma_cb.h
> +++ b/osaf/libs/agents/saf/imma/imma_cb.h
> @@ -60,6 +60,7 @@ typedef struct imma_client_node {
>       bool isImmA2b;       /* Version A.02.11 */
>       bool isImmA2bCbk;    /* Version A.02.11 callback*/
>       bool isImmA2d;       /* Version A.02.13 */
> +     bool isImmA2e;       /* Version A.02.14 */
>       bool isApplier; /* True => This is an Applier-OI */
>       bool isAug;     /* True => handle internal to OI augmented CCB */
>       bool isBusy;    /* True => handle is locked by a thread until a 
> function execution is done */
> diff --git a/osaf/libs/agents/saf/imma/imma_def.h 
> b/osaf/libs/agents/saf/imma/imma_def.h
> --- a/osaf/libs/agents/saf/imma/imma_def.h
> +++ b/osaf/libs/agents/saf/imma/imma_def.h
> @@ -22,7 +22,7 @@
>   /* Macros for Validating Version */
>   #define IMMA_RELEASE_CODE 'A'
>   #define IMMA_MAJOR_VERSION 0x02
> -#define IMMA_MINOR_VERSION 0x0d
> +#define IMMA_MINOR_VERSION 0x0e
>   
>   #define IMMSV_WAIT_TIME  1000 /* Default MDS wait time in 10ms units =>10 
> sec*/
>   
> diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c 
> b/osaf/libs/agents/saf/imma/imma_oi_api.c
> --- a/osaf/libs/agents/saf/imma/imma_oi_api.c
> +++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
> @@ -121,9 +121,12 @@ SaAisErrorT saImmOiInitialize_2(SaImmOiH
>               TRACE_2("OI client version A.2.%u", 
> requested_version.minorVersion);
>               if(requested_version.minorVersion >= 0x0b) {
>                       cl_node->isImmA2b = 0x1;
> -             }
> -             if(requested_version.minorVersion >= 0x0d) {
> -                     cl_node->isImmA2d = 0x1;
> +                     if(requested_version.minorVersion >= 0x0d) {
> +                             cl_node->isImmA2d = true;
> +                             if(requested_version.minorVersion >= 0x0e) {
> +                                     cl_node->isImmA2e = true;
> +                             }
> +                     }
>               }
>       }
>   
> diff --git a/osaf/libs/agents/saf/imma/imma_om_api.c 
> b/osaf/libs/agents/saf/imma/imma_om_api.c
> --- a/osaf/libs/agents/saf/imma/imma_om_api.c
> +++ b/osaf/libs/agents/saf/imma/imma_om_api.c
> @@ -53,7 +53,7 @@ static const char *sysaAdmName = SA_IMM_
>   static const char *sysaImplName = SA_IMM_ATTR_IMPLEMENTER_NAME;
>   
>   static int imma_om_resurrect(IMMA_CB *cb, IMMA_CLIENT_NODE *cl_node, bool 
> *locked);
> -
> +static SaAisErrorT imma_finalizeCcb(SaImmCcbHandleT ccbHandle, bool 
> keepCcbHandleOpen);
>   
>   
> /****************************************************************************
>     Name          :  SaImmOmInitialize
> @@ -124,6 +124,9 @@ SaAisErrorT saImmOmInitialize_o2(SaImmHa
>   
>       if(requested_version.minorVersion >= 0x0d) {
>               cl_node->isImmA2d = true;
> +             if(requested_version.minorVersion >= 0x0e) {
> +                     cl_node->isImmA2e = true;
> +             }
>       }
>   
>       /* Store the callback functions, if set */
> @@ -170,9 +173,12 @@ SaAisErrorT saImmOmInitialize(SaImmHandl
>               TRACE("OM client version A.2.%u", 
> requested_version.minorVersion);
>               if(requested_version.minorVersion >= 0x0b) {
>                       cl_node->isImmA2b = true;
> -             }
> -             if(requested_version.minorVersion >= 0x0d) {
> -                     cl_node->isImmA2d = true;
> +                     if(requested_version.minorVersion >= 0x0d) {
> +                             cl_node->isImmA2d = true;
> +                             if(requested_version.minorVersion >= 0x0e) {
> +                                     cl_node->isImmA2e = true;
> +                             }
> +                     }
>               }
>       }
>   
> @@ -3259,6 +3265,40 @@ SaAisErrorT saImmOmCcbApply(SaImmCcbHand
>   }
>   
>   
> /****************************************************************************
> +  Name          :  saImmOmCcbAbort
> +
> +  Description   :  Aborts a CCB(id) without finalizing the ccb-handle.
> +                   Discards any ccb operations currently associated with the 
> ccb-handle.
> +                   If SA_AIS_OK is returned then ccb-handle can continue to 
> be used and
> +                   is in the same empty state as if it had just been 
> initialized.
> +
> +                   Previously it was only possible to explicitly abort an 
> active ccb
> +                   by invoking saImOmCcbFinalize() which also closes the 
> ccb-handle.
> +
> +                   This a blocking syncronous call.
> +
> +
> +  Arguments     :  ccbHandle - Ccb Handle
> +
> +  Return Values :  SA_AIS_OK; - Means the ccb contents has been discarded.
> +                                and involved Ois receive abort callback.
> +                                Ccb handle is still valid.
> +
> +                   SA_AIS_ERR_VERSION - Not allowed for IMM API version 
> below A.2.14.
> +                   SA_AIS_ERR_BAD_OPERATION - saImmOmCcbAbort not allowed on 
> augmented ccb.
> +
> +                   Remaining returncodes identical to saImmOmFinalize.
> +
> +
> +******************************************************************************/
> +SaAisErrorT saImmOmCcbAbort(SaImmCcbHandleT ccbHandle)
> +{
> +     return imma_finalizeCcb(ccbHandle, true);
> +}
> +
> +
> +
> +/****************************************************************************
>     Name          :  saImmOmAdminOperationInvoke_2/_o2
>    
>     Description   :  Invoke an Administrative Operation on an object in the 
> IMM.
> @@ -7615,7 +7655,7 @@ SaAisErrorT saImmOmAdminOwnerFinalize(Sa
>       return rc;
>   }
>   
> -SaAisErrorT saImmOmCcbFinalize(SaImmCcbHandleT ccbHandle)
> +static SaAisErrorT imma_finalizeCcb(SaImmCcbHandleT ccbHandle, bool 
> keepCcbHandleOpen)
>   {
>       SaAisErrorT rc = SA_AIS_OK;
>       IMMA_CB *cb = &imma_cb;
> @@ -7661,6 +7701,12 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
>       }
>   
>       if (ccb_node->mAugCcb) {
> +             if(keepCcbHandleOpen) {
> +                     LOG_IN("ERR_BAD_OPERATION: saImmOmCcbAbort() not 
> allowed on augmented ccbs");
> +                     rc = SA_AIS_ERR_BAD_OPERATION;
> +                     goto done;
> +             }
> +
>               if(!(ccb_node->mApplied || ccb_node->mAborted)) {
>                       if(ccb_node->mAugIsTainted) {
>                               ccb_node->mAborted = true;
> @@ -7711,6 +7757,12 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
>                       goto done;
>               }
>   
> +             if(keepCcbHandleOpen && !(cl_node->isImmA2e)) {
> +                     LOG_IN("ERR_VERSION: saImmOmCcbAbort() only supported 
> in version A.02.14 or higher");
> +                     rc = SA_AIS_ERR_VERSION;
> +                     goto done;
> +             }
> +
>               timeout = cl_node->syncr_timeout;
>   
>               /* Populate the CcbFinalize event */
> @@ -7759,13 +7811,20 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
>   
>       imma_ccb_node_get(&cb->ccb_tree, &ccbHandle, &ccb_node);
>       if(ccb_node) {
> -             if(rc == SA_AIS_OK) {/* i.e. not TRY_AGAIN or TIMEOUT */
> -                     imma_ccb_node_delete(cb, ccb_node);
> -                     ccb_node = NULL;
> +             if(rc == SA_AIS_OK) {/* Not TRY_AGAIN or TIMEOUT */
> +                     if(!keepCcbHandleOpen) {
> +                             imma_ccb_node_delete(cb, ccb_node);
> +                             ccb_node = NULL;
> +                     }
>               } else {
>                       /* TRY_AGAIN or TIMEOUT => allow user to try finalize 
> again. */
>                       ccb_node->mExclusive = false;
>               }
> +             if(keepCcbHandleOpen) { /* saImmOmCcbAbort */
> +                     osafassert(ccb_node);
> +                     ccb_node->mApplied = true;
> +                     ccb_node->mExclusive = false;
> +             }
>       }
>   
>    done:
> @@ -7779,6 +7838,13 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
>   }
>   
>   
> +SaAisErrorT saImmOmCcbFinalize(SaImmCcbHandleT ccbHandle)
> +{
> +     return imma_finalizeCcb(ccbHandle, false);
> +}
> +
> +
> +
>   /*
>      Internal helper function that determines if there are
>      AdminOwner handles associated with a newly resurrected client.
> diff --git a/osaf/libs/saf/include/saImmOm_A_2_13.h 
> b/osaf/libs/saf/include/saImmOm_A_2_13.h
> --- a/osaf/libs/saf/include/saImmOm_A_2_13.h
> +++ b/osaf/libs/saf/include/saImmOm_A_2_13.h
> @@ -71,4 +71,6 @@ extern "C" {
>   }
>   #endif
>   
> +#include <saImmOm_A_2_14.h>
> +
>   #endif   /* _SA_IMM_OM_A_2_13_H */
> diff --git a/osaf/libs/saf/include/saImmOm_A_2_14.h 
> b/osaf/libs/saf/include/saImmOm_A_2_14.h
> new file mode 100644
> --- /dev/null
> +++ b/osaf/libs/saf/include/saImmOm_A_2_14.h
> @@ -0,0 +1,46 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * (C) Copyright 2014 The OpenSAF Foundation
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
> + * under the GNU Lesser General Public License Version 2.1, February 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + * Author(s): Ericsson AB
> + */
> +
> +/*
> + * DESCRIPTION:
> + *   This file provides the suggested additions to the C language binding for
> + *   the Service Availability(TM) Forum Information Model Management Service 
> (IMM).
> + *   It contains only the prototypes and type definitions that are part of 
> this
> + *   proposed addition.
> + *   These additions are currently NON STANDARD. But the intention is to get 
> these
> + *   additions approved formally by SAF in the future.
> + *
> + *   For detailed explanation of the new API, see 
> osaf/services/saf/immsv/README.
> + */
> +
> +
> +#ifndef _SA_IMM_OM_A_2_14_H
> +#define _SA_IMM_OM_A_2_14_H
> +
> +#ifdef  __cplusplus
> +extern "C" {
> +#endif
> +
> +/* 4.8.x saImmOmCcb */
> +
> +     extern SaAisErrorT
> +      saImmOmCcbAbort(SaImmCcbHandleT ccbHandle);
> +
> +#ifdef  __cplusplus
> +}
> +#endif
> +
> +#endif   /* _SA_IMM_OM_A_2_14_H */
> diff --git a/tests/immsv/common/immtest.c b/tests/immsv/common/immtest.c
> --- a/tests/immsv/common/immtest.c
> +++ b/tests/immsv/common/immtest.c
> @@ -21,8 +21,8 @@
>   #include <pthread.h>
>   #include "immtest.h"
>   
> -const SaVersionT constImmVersion = {'A', 0x02, 0x0d};
> -SaVersionT immVersion = {'A', 0x02, 0x0d};
> +const SaVersionT constImmVersion = {'A', 0x02, 0x0e};
> +SaVersionT immVersion = {'A', 0x02, 0x0e};
>   SaAisErrorT rc;
>   SaImmHandleT immOmHandle;
>   SaImmHandleT immOiHandle;
> diff --git a/tests/immsv/management/test_saImmOmCcbApply.c 
> b/tests/immsv/management/test_saImmOmCcbApply.c
> --- a/tests/immsv/management/test_saImmOmCcbApply.c
> +++ b/tests/immsv/management/test_saImmOmCcbApply.c
> @@ -94,3 +94,98 @@ done:
>       safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
>   }
>   
> +void saImmOmCcbAbort_01(void)
> +{
> +    TRACE_ENTER();
> +    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
> __FUNCTION__;
> +    SaImmAdminOwnerHandleT ownerHandle;
> +    SaImmCcbHandleT ccbHandle;
> +    SaNameT rdn = {strlen("Obj1"), "Obj1"};
> +    SaNameT* nameValues[] = {&rdn};
> +    SaImmAttrValuesT_2 v2 = {"rdn",  SA_IMM_ATTR_SANAMET, 1, 
> (void**)nameValues};
> +    SaUint32T  int1Value1 = 7;
> +    SaUint32T* int1Values[] = {&int1Value1};
> +    SaImmAttrValuesT_2 v1 = {"attr1", SA_IMM_ATTR_SAUINT32T, 1, 
> (void**)int1Values};
> +    const SaImmAttrValuesT_2 * attrValues[] = {&v1, &v2, NULL};
> +    const SaNameT *objectNames[] = {&rootObj, NULL};
> +
> +    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
> SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName,
> +        SA_TRUE, &ownerHandle), SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerSet(ownerHandle, objectNames, SA_IMM_ONE), 
> SA_AIS_OK);
> +    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK); /* Abort on pristine 
> ccb handle should be ok. */
> +    safassert(saImmOmCcbObjectCreate_2(ccbHandle, configClassName,
> +        &rootObj, attrValues), SA_AIS_OK);
> +
> +    /* abort the ccb */
> +    if ((rc = saImmOmCcbAbort(ccbHandle)) != SA_AIS_OK)
> +        goto done;
> +
> +    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK); /* Redundant abort 
> should be ok. */
> +
> +    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> +done:
> +    test_validate(rc, SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> +    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +    TRACE_LEAVE();
> +}
> +
> +void saImmOmCcbAbort_02(void)
> +{
> +    TRACE_ENTER();
> +    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
> __FUNCTION__;
> +    SaImmAdminOwnerHandleT ownerHandle;
> +    SaImmCcbHandleT ccbHandle;
> +    SaNameT rdn = {strlen("Obj1"), "Obj1"};
> +    SaNameT* nameValues[] = {&rdn};
> +    SaImmAttrValuesT_2 v2 = {"rdn",  SA_IMM_ATTR_SANAMET, 1, 
> (void**)nameValues};
> +    SaUint32T  int1Value1 = 7;
> +    SaUint32T* int1Values[] = {&int1Value1};
> +    SaImmAttrValuesT_2 v1 = {"attr1", SA_IMM_ATTR_SAUINT32T, 1, 
> (void**)int1Values};
> +    const SaImmAttrValuesT_2 * attrValues[] = {&v1, &v2, NULL};
> +    const SaNameT *objectNames[] = {&rootObj, NULL};
> +    const SaNameT objectName =
> +        {strlen("Obj1,rdn=root"), "Obj1,rdn=root"};
> +
> +    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
> SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName,
> +        SA_TRUE, &ownerHandle), SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerSet(ownerHandle, objectNames, SA_IMM_ONE), 
> SA_AIS_OK);
> +    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +    safassert(saImmOmCcbObjectCreate_2(ccbHandle, configClassName,
> +        &rootObj, attrValues), SA_AIS_OK);
> +
> +    /* abort the ccb with the object-create. */
> +    if ((rc = saImmOmCcbAbort(ccbHandle)) != SA_AIS_OK)
> +        goto done;
> +
> +    /* continue with ccb handle after abort. New attempt to create same 
> object
> +       should work. */
> +    if ((rc = saImmOmCcbObjectCreate_2(ccbHandle, configClassName, &rootObj,
> +        attrValues) != SA_AIS_OK)) {
> +        goto done;
> +    }
> +
> +    /* apply should work. */
> +    if((rc = saImmOmCcbApply(ccbHandle)) != SA_AIS_OK)
> +        goto done;
> +
> +    /* Set up delete and abort it. */
> +    safassert(saImmOmCcbObjectDelete(ccbHandle, &objectName), SA_AIS_OK);
> +    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK);
> +
> +    /* Finaly use ccb-handle to delete object. */
> +    safassert(saImmOmCcbObjectDelete(ccbHandle, &objectName), SA_AIS_OK);
> +    safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
> +    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> +done:
> +    test_validate(rc, SA_AIS_OK);
> +    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> +    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +    TRACE_LEAVE();
> +}
> +
> diff --git a/tests/immsv/management/test_saImmOmCcbInitialize.c 
> b/tests/immsv/management/test_saImmOmCcbInitialize.c
> --- a/tests/immsv/management/test_saImmOmCcbInitialize.c
> +++ b/tests/immsv/management/test_saImmOmCcbInitialize.c
> @@ -164,6 +164,8 @@ extern void saImmOmCcbApply_01(void);
>   extern void saImmOmCcbApply_02(void);
>   extern void saImmOmCcbFinalize_01(void);
>   extern void saImmOmCcbFinalize_02(void);
> +extern void saImmOmCcbAbort_01(void);
> +extern void saImmOmCcbAbort_02(void);
>   
>   __attribute__ ((constructor)) static void 
> saImmOmInitialize_constructor(void)
>   {
> @@ -235,5 +237,7 @@ extern void saImmOmCcbFinalize_02(void);
>   
>       test_case_add(6, saImmOmCcbObjectModify_2_08, "saImmOmCcbObjectModify_2 
> SA_IMM_ATTR_DELETE multi/single - SA_AIS_OK");
>       test_case_add(6, saImmOmCcbObjectModify_2_07, "saImmOmCcbObjectModify_2 
> SA_IMM_ATTR_DELETE multi/multi - SA_AIS_OK");
> +    test_case_add(6, saImmOmCcbAbort_01, "saImmOmCcbAbort - SA_AIS_OK");
> +    test_case_add(6, saImmOmCcbAbort_02, "saImmOmCcbAbort - SA_AIS_OK on 
> continued ccb handle usage.");
>   }
>   
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Opensaf-devel mailing list
> Opensaf-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>
>


------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to