Ack from me. Reviewed and tested. Find minor comments below in the code started with [Zoran]
Best regards, Zoran -----Original Message----- From: Anders Björnerstedt Sent: den 4 april 2014 14:53 To: reddy.neelaka...@oracle.com; Zoran Milinkovic Cc: opensaf-devel@lists.sourceforge.net Subject: [PATCH 1 of 3] IMM: Support for saImmOmCcbAbort API [#798] 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); [Zoran] osafassert is not needed. ccb_node cannot be NULL here. + 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."); } ------------------------------------------------------------------------------ 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