osaf/services/saf/immsv/immnd/ImmModel.cc | 36 ++++++-
osaf/services/saf/immsv/immnd/ImmModel.hh | 3 +-
osaf/services/saf/immsv/immnd/ImmSearchOp.cc | 5 -
osaf/services/saf/immsv/immnd/immnd_evt.c | 97 ++++++++++++++++++---
osaf/services/saf/immsv/immnd/immnd_init.h | 2 +-
tests/immsv/implementer/applier.c | 121 +++++++++++++++++++++-----
6 files changed, 212 insertions(+), 52 deletions(-)
This is a testpatch containing a test version of the 2PBE handling of
deletes of persistent runtime objects (PRTOs).
This patch will not be pushed. The intent with this patch is to allow
testing and obtaining feedback on the 2PBE handling of PRTO deletes
This test-patch goes on top of the "2PBE PRTO-create" testpatch.
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -1669,7 +1669,8 @@ immModel_rtObjectDelete(IMMND_CB *cb,
SaClmNodeIdT* pbeNodeId,
SaStringT **objNameArr,
SaUint32T* arrSizePtr,
- SaUint32T* spApplConn)
+ SaUint32T* spApplConn,
+ SaUint32T* pbe2BConn)
{
ObjectNameVector ov;
ObjectNameVector::iterator oni;
@@ -1678,7 +1679,7 @@ immModel_rtObjectDelete(IMMND_CB *cb,
SaAisErrorT err = ImmModel::instance(&cb->immModel)->
rtObjectDelete(req, implConn, (unsigned int) implNodeId,
- continuationId, pbeConn, pbeNodeId, ov, spApplConn);
+ continuationId, pbeConn, pbeNodeId, ov, spApplConn, pbe2BConn);
(*arrSizePtr) = (SaUint32T) ov.size();
if((err == SA_AIS_OK) && (*arrSizePtr)) {
@@ -12156,6 +12157,20 @@ void ImmModel::pbePrtObjDeletesContinuat
ObjectMutation* oMut = i2->second;
osafassert(oMut->mOpType == IMM_DELETE);
+ if(oMut->m2PbeCount) {
+ oMut->m2PbeCount--;
+ if(oMut->m2PbeCount && error == SA_AIS_OK) {
+ TRACE("pbePrtObjDeletesContinuation Wait for reply from other
PBE");
+ return;
+ }
+ if(error == SA_AIS_OK) {
+ TRACE("pbePrtObjDeletesContinuation: All PBEs have responded
with OK");
+ }
+ /* If any of hte PBEs reply with error, then the PRTO delete is
aborted.
+ and this contiuation removed.
+ */
+ }
+
oMut->mAfterImage->mObjFlags &= ~IMM_DELETE_LOCK;
if(error == SA_AIS_OK) {
@@ -13075,7 +13090,8 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
SaUint32T* pbeConnPtr,
unsigned int* pbeNodeIdPtr,
ObjectNameVector& objNameVector,
- SaUint32T* spApplConnPtr)
+ SaUint32T* spApplConnPtr,
+ SaUint32T* pbe2BConnPtr)
{
osafassert(spApplConnPtr);
(*spApplConnPtr) = 0;
@@ -13093,6 +13109,8 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
(*continuationIdPtr) = 0;
osafassert(pbeConnPtr);
(*pbeConnPtr) = 0;
+ osafassert(pbe2BConnPtr);
+ (*pbe2BConnPtr) = 0;
}
if(immNotWritable()) { /*Check for persistent RTOs further down. */
@@ -13167,9 +13185,11 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
for(int doIt=0; (doIt < 2) && (err == SA_AIS_OK); ++doIt) {
void* pbe = NULL;
+ void* pbe2B = NULL;
SaUint32T childCount = oi->second->mChildCount;
if(doIt && pbeNodeIdPtr && subTreeHasPersistent) {
+ unsigned int slaveNodeId=0;
TRACE("PRTO DELETE case, deferred deletes until ACK from PBE");
/* We expect a PBE and the recursive RTO delete includes
some PERSISETENT RTOs, then dont delete the RTOs now,
@@ -13195,6 +13215,11 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
*/
}
+ pbe2B = getPbeBSlave(pbe2BConnPtr, &slaveNodeId);
+ TRACE("getPbeBSlave returned: %p", pbe2B);
+ /* If 2PBE then not both PBEs on same processor. */
+ osafassert(!((*pbeConnPtr) && (*pbe2BConnPtr)));
+
/* If the subtree to delete includes PRTOs then we use a
continuationId
as a common pseudo ccbId for all the RTOs in the subtree.
*/
@@ -13220,8 +13245,9 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
ObjectMutation* oMut = new ObjectMutation(IMM_DELETE);
oMut->mContinuationId = (*continuationIdPtr);
oMut->mAfterImage = oi->second;
+ oMut->m2PbeCount = pbe2B?2:1;
sPbeRtMutations[oi->first] = oMut;
- if((oi->second->mObjFlags & IMM_PRTO_FLAG) && (*pbeConnPtr)) {
+ if((oi->second->mObjFlags & IMM_PRTO_FLAG) && ((*pbeConnPtr)
||(*pbe2BConnPtr))) {
TRACE("PRTO flag was set for root of subtree to delete");
if(oi->second->mObjFlags & IMM_DN_INTERNAL_REP) {
std::string tmpName(oi->first);
@@ -13292,7 +13318,7 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
oMut->mContinuationId = (*continuationIdPtr);
oMut->mAfterImage = oi2->second;
sPbeRtMutations[subObjName] = oMut;
- if((oi2->second->mObjFlags & IMM_PRTO_FLAG) &&
(*pbeConnPtr)) {
+ if((oi2->second->mObjFlags & IMM_PRTO_FLAG) &&
((*pbeConnPtr) ||(*pbe2BConnPtr))) {
TRACE("PRTO flag was set for subobj: %s",
subObjName.c_str());
if(oi2->second->mObjFlags & IMM_DN_INTERNAL_REP) {
std::string tmpName(subObjName);
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh
b/osaf/services/saf/immsv/immnd/ImmModel.hh
--- a/osaf/services/saf/immsv/immnd/ImmModel.hh
+++ b/osaf/services/saf/immsv/immnd/ImmModel.hh
@@ -424,7 +424,8 @@ public:
SaUint32T* pbeConnPtr,
unsigned int* pbeNodeIdPtr,
ObjectNameVector& objNameVector,
- SaUint32T* specialApplCon);
+ SaUint32T* specialApplCon,
+ SaUint32T* pbe2BConn);
SaAisErrorT deleteRtObject(
diff --git a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
--- a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
+++ b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
@@ -89,7 +89,6 @@ ImmSearchOp::setImplementer(SaUint32T co
SaAisErrorT
ImmSearchOp::testTopResult(unsigned int* nodeIdp, SaBoolT* bRtsToFetch)
{
- TRACE_ENTER();
SaAisErrorT err = SA_AIS_ERR_NOT_EXIST;
if (!mResultList.empty()) {
@@ -109,8 +108,6 @@ ImmSearchOp::testTopResult(unsigned int*
}
}
- TRACE_LEAVE();
-
return err;
}
@@ -120,7 +117,6 @@ ImmSearchOp::nextResult(IMMSV_OM_RSP_SEA
AttributeList** rtsToFetch,
SaUint64T* implDest)
{
- TRACE_ENTER();
SaAisErrorT err = SA_AIS_ERR_NOT_EXIST;
if(!mRtsToFetch.empty()) {mRtsToFetch.clear();}
@@ -198,7 +194,6 @@ ImmSearchOp::nextResult(IMMSV_OM_RSP_SEA
} else {
mLastResult=NULL;
}
- TRACE_LEAVE();
return err;
}
diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -5267,7 +5267,6 @@ static void immnd_evt_proc_rt_object_cre
/*The persistent back-end is executing at THIS node. */
osafassert(!pbe2BConn);
osafassert(cb->mIsCoord);
- osafassert(pbeNodeId);
osafassert(pbeNodeId == cb->node_id);
implHandle = m_IMMSV_PACK_HANDLE(pbeConn, pbeNodeId);
@@ -5310,12 +5309,11 @@ static void immnd_evt_proc_rt_object_cre
} else if(pbe2BConn) {
osafassert(!(cb->mIsCoord));
- osafassert(pbeNodeId);
osafassert(pbeNodeId != cb->node_id);
- LOG_IN("The persistent back-end SLAVE is executing at
THIS node.");
+ TRACE("PBE SLAVE at THIS node.");
implHandle = m_IMMSV_PACK_HANDLE(pbe2BConn,
cb->node_id);
- /*Fetch client node for PBE */
+ /*Fetch client node for Slave PBE */
immnd_client_node_get(cb, implHandle, &pbe_cl_node);
osafassert(pbe_cl_node);
if (pbe_cl_node->mIsStale) {
@@ -5346,7 +5344,7 @@ static void immnd_evt_proc_rt_object_cre
NCSCC_RC_SUCCESS)
{
LOG_WA("Upcall over MDS for persistent
rt obj create "
- "to PBE failed!");
+ "to Slave PBE failed!");
/* See comment **** above. */
}
}
@@ -6611,6 +6609,7 @@ static void immnd_evt_proc_rt_object_del
SaUint32T nodeId = m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl);
SaBoolT delayedReply = SA_FALSE;
SaUint32T pbeConn = 0;
+ SaUint32T pbe2BConn = 0;
NCS_NODE_ID pbeNodeId = 0;
NCS_NODE_ID *pbeNodeIdPtr = NULL;
SaUint32T continuationId = 0;
@@ -6619,11 +6618,6 @@ static void immnd_evt_proc_rt_object_del
SaUint32T spApplConn=0;
TRACE_ENTER();
-#if 0 /*ABT DEBUG PRINTOUTS START */
- TRACE_2("ABT immnd_evt_proc_rt_object_delete object:%s",
evt->info.objDelete.objectName.buf);
- TRACE_2("ABT immnd_evt_proc_rt_object_delete IMPLID:%u",
evt->info.objDelete.adminOwnerId);
-#endif /*ABT DEBUG PRINTOUTS STOP */
-
if(cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY)) {
pbeNodeIdPtr = &pbeNodeId;
TRACE("We expect there to be a PBE");
@@ -6634,10 +6628,12 @@ static void immnd_evt_proc_rt_object_del
if (originatedAtThisNd) {
err = immModel_rtObjectDelete(cb, &(evt->info.objDelete),
reqConn, nodeId,
- &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr,
&arrSize, &spApplConn);
+ &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr,
&arrSize,
+ &spApplConn, &pbe2BConn);
} else {
err = immModel_rtObjectDelete(cb, &(evt->info.objDelete), 0,
nodeId,
- &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr,
&arrSize, &spApplConn);
+ &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr,
&arrSize,
+ &spApplConn, &pbe2BConn);
}
if(pbeNodeId && (err == SA_AIS_OK) && arrSize) {
@@ -6646,8 +6642,8 @@ static void immnd_evt_proc_rt_object_del
if(pbeConn) {
TRACE("PBE at this node arrSize:%u", arrSize);
/*The persistent back-end is executing at THIS node. */
+ osafassert(!pbe2BConn);
osafassert(cb->mIsCoord);
- osafassert(pbeNodeId);
osafassert(pbeNodeId == cb->node_id);
implHandle = m_IMMSV_PACK_HANDLE(pbeConn, pbeNodeId);
memset(&send_evt, '\0', sizeof(IMMSV_EVT));
@@ -6686,7 +6682,6 @@ static void immnd_evt_proc_rt_object_del
{
LOG_WA("Upcall over MDS for
persistent rt obj delete "
"to PBE failed!");
- /* See comment **** above. */
/* TODO: we could possibly
revert the delete
here an return TRY_AGAIN. We
may have
succeeded in sending some
deletes, but
@@ -6723,6 +6718,80 @@ static void immnd_evt_proc_rt_object_del
}
implHandle = 0LL;
pbe_cl_node = NULL;
+ } else if(pbe2BConn) {
+ TRACE("PBE SLAVE at this node arrSize:%u", arrSize);
+ /*The persistent back-end is executing at THIS node. */
+ osafassert(!(cb->mIsCoord));
+ osafassert(pbeNodeId != cb->node_id);
+ implHandle = m_IMMSV_PACK_HANDLE(pbe2BConn,
cb->node_id);
+
+ memset(&send_evt, '\0', sizeof(IMMSV_EVT));
+ send_evt.type = IMMSV_EVT_TYPE_IMMA;
+ send_evt.info.imma.type =
IMMA_EVT_ND2A_OI_OBJ_DELETE_UC;
+ send_evt.info.imma.info.objDelete.ccbId = 0;
+ send_evt.info.imma.info.objDelete.adminOwnerId =
continuationId;
+ send_evt.info.imma.info.objDelete.immHandle =
implHandle;
+
+ /*Fetch client node for Slave PBE */
+ immnd_client_node_get(cb, implHandle, &pbe_cl_node);
+ osafassert(pbe_cl_node);
+ if (pbe_cl_node->mIsStale) {
+ LOG_WA("SLAVE PBE is down => persistify of
rtObj delete is dropped!");
+ goto done;
+ } else {
+ /* We have obtained handle & dest info for
Slave PBE.
+ Iterate through objNameArray and send delete
upcalls to Slave PBE.
+ */
+ int ix = 0;
+ for (; ix < arrSize && err == SA_AIS_OK; ++ix) {
+
send_evt.info.imma.info.objDelete.objectName.size =
+ (SaUint32T)
strlen(objNameArr[ix]);
+
send_evt.info.imma.info.objDelete.objectName.buf =
+ objNameArr[ix];
+
+ TRACE_2("MAKING PBE-SLAVE PERSISTENT
RT-OBJ DELETE upcalls");
+ if (immnd_mds_msg_send(cb,
NCSMDS_SVC_ID_IMMA_OI,
+
pbe_cl_node->agent_mds_dest, &send_evt) !=
+ NCSCC_RC_SUCCESS)
+ {
+ LOG_WA("Upcall over MDS for
persistent rt obj delete "
+ "to Slave PBE failed!");
+ /* TODO: we could possibly
revert the delete
+ here an return TRY_AGAIN. We
may have
+ succeeded in sending some
deletes, but
+ since we did not send the
completed,
+ the PRTO deletes will not be
commited
+ by the PBE.
+ */
+ goto done;
+ }
+ }
+
+ send_evt.info.imma.type =
IMMA_EVT_ND2A_OI_CCB_COMPLETED_UC;
+ send_evt.info.imma.info.ccbCompl.ccbId = 0;
+ send_evt.info.imma.info.ccbCompl.immHandle =
implHandle;
+ send_evt.info.imma.info.ccbCompl.implId =
arrSize;
+ /* ^^Hack: Use implId to store objCount, see
#1809.^^
+ This avoids having to change the protocol.
+ */
+ send_evt.info.imma.info.ccbCompl.invocation =
continuationId;
+
+ TRACE_2("MAKING PBE PRTO DELETE COMPLETED
upcall to PBE Slave");
+ if (immnd_mds_msg_send(cb,
NCSMDS_SVC_ID_IMMA_OI,
+ pbe_cl_node->agent_mds_dest,
&send_evt) !=
+ NCSCC_RC_SUCCESS)
+ {
+ LOG_WA("Upcall over MDS for persistent
rt obj deletes "
+ "completed, to PBE slave
failed!");
+ /* See comment **** above. */
+ /* TODO: we could actually revert the
delete here an return TRY_AGAIN*/
+ goto done;
+
+ }
+
+ }
+ implHandle = 0LL;
+ pbe_cl_node = NULL;
}
}
diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h
b/osaf/services/saf/immsv/immnd/immnd_init.h
--- a/osaf/services/saf/immsv/immnd/immnd_init.h
+++ b/osaf/services/saf/immsv/immnd/immnd_init.h
@@ -366,7 +366,7 @@ extern "C" {
SaUint32T implConn, SaClmNodeIdT implNodeId,
SaUint32T *continuationId, SaUint32T *pbeConn,
SaClmNodeIdT *pbeNodeId, SaStringT **objNameArr,
- SaUint32T* arrSize, SaUint32T* spApplConn);
+ SaUint32T* arrSize, SaUint32T* spApplConn, SaUint32T
*pbe2BConn);
SaAisErrorT
immModel_rtObjectUpdate(IMMND_CB *cb,
diff --git a/tests/immsv/implementer/applier.c
b/tests/immsv/implementer/applier.c
--- a/tests/immsv/implementer/applier.c
+++ b/tests/immsv/implementer/applier.c
@@ -76,6 +76,30 @@ static SaAisErrorT saImmOiCcbObjectModif
SaAisErrorT rc = SA_AIS_OK;
printf("Modify callback on %s - object:%s ccbId:%llu\n", implName,
objectName->value, ccbId);
+ int ix=0;
+ for(;attrMods[ix]!=NULL;++ix) {
+ const SaImmAttrModificationT_2 *att = attrMods[ix];
+ printf("\tAttribute: %s type:%u, nrofvals:%u\n",
+ att->modAttr.attrName, att->modAttr.attrValueType,
att->modAttr.attrValuesNumber);
+ if(strcmp(att->modAttr.attrName,
SA_IMM_ATTR_ADMIN_OWNER_NAME)==0 && att->modAttr.attrValuesNumber) {
+ SaStringT stVal = *((SaStringT*)
att->modAttr.attrValues[0]);
+ printf("\tAdminOwnerName:%s\n", stVal);
+ } else if(strcmp(att->modAttr.attrName,
SA_IMM_ATTR_CLASS_NAME)==0 && att->modAttr.attrValuesNumber) {
+ SaStringT stVal = *((SaStringT*)
att->modAttr.attrValues[0]);
+ printf("\tClassName:%s\n", stVal);
+ } else if(att->modAttr.attrValueType == SA_IMM_ATTR_SASTRINGT) {
+ SaStringT stVal = *((SaStringT*)
att->modAttr.attrValues[0]);
+ printf("\t%s:%s\n", att->modAttr.attrName, stVal);
+ } else if((att->modAttr.attrValueType == SA_IMM_ATTR_SAUINT32T)
||
+ (att->modAttr.attrValueType == SA_IMM_ATTR_SAINT32T)) {
+ SaUint32T intVal = *((SaUint32T*)
att->modAttr.attrValues[0]);
+ printf("\t%s:%u\n", att->modAttr.attrName, intVal);
+ }
+
+ }
+
+
+
struct CcbUtilCcbData *ccbUtilCcbData;
if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
@@ -99,9 +123,33 @@ static SaAisErrorT saImmOiCcbObjectCreat
{
SaAisErrorT rc = SA_AIS_OK;
struct CcbUtilCcbData *ccbUtilCcbData;
+ int ix=0;
printf("Create callback on %s - parent:%s ccbId:%llu\n", implName,
parentName->value, ccbId);
+ for(;attr[ix]!=NULL;++ix) {
+ const SaImmAttrValuesT_2 *att = attr[ix];
+ printf("\tAttribute: %s type:%u, nrofvals:%u\n",
+ att->attrName, att->attrValueType,
att->attrValuesNumber);
+ if(strcmp(att->attrName, SA_IMM_ATTR_ADMIN_OWNER_NAME)==0 &&
att->attrValuesNumber) {
+ SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+ printf("\tAdminOwnerName:%s\n", stVal);
+ } else if(strcmp(att->attrName, SA_IMM_ATTR_CLASS_NAME)==0 &&
att->attrValuesNumber) {
+ SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+ printf("\tClassName:%s\n", stVal);
+ } else if(strcmp(att->attrName,
SA_IMM_ATTR_IMPLEMENTER_NAME)==0 && att->attrValuesNumber) {
+ SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+ printf("\tImplementerName:%s\n", stVal);
+ } else if(att->attrValueType == SA_IMM_ATTR_SASTRINGT) {
+ SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+ printf("\t%s:%s\n", att->attrName, stVal);
+ } else if((att->attrValueType == SA_IMM_ATTR_SAUINT32T) ||
+ (att->attrValueType == SA_IMM_ATTR_SAINT32T)) {
+ SaUint32T intVal = *((SaUint32T*) att->attrValues[0]);
+ printf("\t%s:%u\n", att->attrName, intVal);
+ }
+ }
+
if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
fprintf(stderr, "Failed to get CCB object for %llu\n",
ccbId);
@@ -182,18 +230,6 @@ static SaAisErrorT saImmOiRtAttrUpdateCa
return SA_AIS_OK;
}
-static void saImmOiAdminOperationCallback(SaImmOiHandleT immOiHandle,
SaInvocationT invocation,
- const SaNameT *objectName, SaImmAdminOperationIdT operationId,
- const SaImmAdminOperationParamsT_2 **params)
-{
- printf("AdminOperationCallback received by impl %s on object %s
operation:%llu invocation:%llu\n",
- implName, (char *) objectName->value, operationId, invocation);
- SaAisErrorT err = saImmOiAdminOperationResult(immOiHandle, invocation,
SA_AIS_OK);
- if(err != SA_AIS_OK) {
- fprintf(stderr, "Reply on admin operation failed, err:%u\n",
err);
- }
-}
-
int main(int argc, char *argv[])
{
int c;
@@ -209,7 +245,7 @@ int main(int argc, char *argv[])
SaNameT objectName;
const SaImmAdminOperationParamsT_2 **params;
const SaImmOiCallbacksT_2 callbacks = {
- .saImmOiAdminOperationCallback = saImmOiAdminOperationCallback,
+ .saImmOiAdminOperationCallback = NULL,
.saImmOiCcbAbortCallback = saImmOiCcbAbortCallback,
.saImmOiCcbApplyCallback = saImmOiCcbApplyCallback,
.saImmOiCcbCompletedCallback = saImmOiCcbCompletedCallback,
@@ -271,6 +307,7 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
+ printf("HERE\n");
/* Remaining arguments should be class names for which implementer is
set. */
while (optind < argc) {
strncpy((char *)objectName.value, argv[optind],
SA_MAX_NAME_LENGTH);
@@ -278,24 +315,56 @@ int main(int argc, char *argv[])
printf("Class: %s\n", objectName.value);
- if(!strcmp((const char *) objectName.value,
"OpensafImmRtTest")) {
+ if(!strcmp((const char *) objectName.value, "OpensafImmRtTest")
||
+ !strcmp((const char *) objectName.value,
"OpensafImmRt2Test")) {
/* Special test case for RTO's.
Class OpensafImmRtTest foundd at
samples/immsv/immsv_test_classes_rtobj.xml
*/
- SaStringT str1="testRdn=ZZZ";
- SaImmAttrValueT strValues[] = {&str1};
- SaImmAttrValuesT_2 v1 = { "testRdn",
SA_IMM_ATTR_SASTRINGT, 1, (void**)strValues };
- const SaImmAttrValuesT_2* attrValues[] = {&v1, NULL};
+ SaNameT myName;
+ strncpy((char *)myName.value, "testRdn=ZZZ",
SA_MAX_NAME_LENGTH);
+ myName.length = strlen((char *)myName.value);
+ if(1) {
+ printf("HERE 2\n");
- error = saImmOiRtObjectCreate_2(immOiHandle,
(SaImmClassNameT) objectName.value, NULL, attrValues);
- if (error != SA_AIS_OK && error != SA_AIS_ERR_EXIST) {
- fprintf(stderr, "error -
saImmOiClassImplementerSet FAILED: %s\n", saf_error(error));
- exit(EXIT_FAILURE);
+ /* First try to delete the RTO */
+ error = saImmOiRtObjectDelete(immOiHandle,
&myName);
}
- if(error == SA_AIS_OK) {
- printf("Runtime object: %s created\n", str1);
- } else {
- printf("Runtime object: %s exists\n", str1);
+
+ if (error == SA_AIS_OK) {
+ printf("Object %s deletedt\n",
myName.value);
+ } else if(error == SA_AIS_ERR_NOT_EXIST) {
+ printf("Object %s does not exist\n",
myName.value);
+ SaStringT str1="testRdn=ZZZ";
+ SaImmAttrValueT strValues[] = {&str1};
+ SaImmAttrValuesT_2 v1 = { "testRdn",
SA_IMM_ATTR_SASTRINGT, 1, (void**)strValues };
+ const SaImmAttrValuesT_2* attrValues[] = {&v1,
NULL};
+
+ error = saImmOiRtObjectCreate_2(immOiHandle,
(SaImmClassNameT) objectName.value, NULL, attrValues);
+ if (error != SA_AIS_OK && error !=
SA_AIS_ERR_EXIST) {
+ fprintf(stderr, "error -
saImmOiRtObjectCreate FAILED: %s\n", saf_error(error));
+ exit(EXIT_FAILURE);
+ }
+ if(error == SA_AIS_OK) {
+
+ SaUint64T uint64Val = 5502120230;
+ SaImmAttrValueT val = &uint64Val;
+ SaImmAttrModificationT_2 attrMod;
+ attrMod.modType =
SA_IMM_ATTR_VALUES_REPLACE;
+ attrMod.modAttr.attrName = "testUint64";
+ attrMod.modAttr.attrValueType =
SA_IMM_ATTR_SAUINT64T;
+ attrMod.modAttr.attrValuesNumber = 1;
+ attrMod.modAttr.attrValues = &val;
+ const SaImmAttrModificationT_2*
attrMods[2] = {&attrMod, NULL};
+ printf("Runtime object: %s created\n",
str1);
+ sleep(2);
+ error =
saImmOiRtObjectUpdate_2(immOiHandle, &myName, attrMods);
+ sleep(2);
+ strncpy((char *)myName.value,
"testRdn=0", SA_MAX_NAME_LENGTH);
+ myName.length = strlen((char
*)myName.value);
+ error =
saImmOiRtObjectUpdate_2(immOiHandle, &myName, attrMods);
+ } else {
+ printf("Runtime object: %s exists\n",
str1);
+ }
}
} else {
error = saImmOiClassImplementerSet(immOiHandle,
(SaImmClassNameT) objectName.value);
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel