Hi AndersBj,

Publish the new patch with the below comments.

Thanks,
Neel.

On Wednesday 23 July 2014 08:34 PM, Anders Bjornerstedt wrote:
> Hi Neel.
>
> There is some valuable work done in this patch and most of it is ok.
> But in its current state I have to give it a NACK.
>
> It needs some adjustments and extension  before it can be pushed.
>
> There are two main problems:
>
> 1) The PBE is the main OI for the object involved and we actually want 
> to be able to reach the PBE
> (not just the IMMND) to also probe the PBE for resource measurements. 
> Only the empty OK reply
> on PBE resources needs to be implemented in #35, but the problem now 
> is that this patch shortcircuits the admop
> inside the IMMND so that it never reaches the PBE. Instead the 
> admin-op should reach the PBE and
> the PBE should just reply OK for now. In the future the PBE would scan 
> the list of params for values
> that where owned by the PBE and set those vales in a reply.
>
> 2) The control flow fetches the IMMND params at the requesting ndoe 
> and it does so on the invocation.
> It should normally wait for the reply (from the PBE) and only fetch 
> the (local)  IMMND params immediately
> if there is no PBE (it is disabled).
>
> The good news is that the added new method 
> ImmModel::resourceDisplay(...) should be ok as is.
> But it would usually be invoked later (still only at the IMMND where 
> the om-client resides).
>
> This is how I would like to see the data flow (assuming the PBE is 
> enabled):
>
> A) The admin-op is invoked in the normal way. It reaches the PBE. The 
> PBE recognizes
> the new resource admin-op and just replies OK. Later we add support 
> for PBE params
> which will be added by the PBE.
>
> B) The reply is received normally (the PBE could be remote so the 
> reply could be from remote),
> and caught in immnd_evt_pbe_admop_rsp().  Inside if(reqConn) { ... } 
> there should be a check if this
> is the new special admin-op. (The same long condition that you 
> currently have  in proc_admop().
> If this case matches, then invoke ImmModel::resourceDisplay(...) to 
> fetch the parameters that you have implemented.
> Note that here we could potentiually be appending IMMND parameters to 
> an existing list of PBE parameters.
>
> For the case where there is no PBE, then the call should bounce sort 
> of like it does now, by returning  ERR_REPAIR_PENDING
> which is caught in proc_admop() which invokes 
> ImmModl::resourceDisplay(). But this would be the rarer 0PBE case.
>
>
> Some additional detailed review comments below.
>
> reddy.neelaka...@oracle.com wrote:
>>  osaf/services/saf/immsv/immnd/ImmModel.cc |  279 
>> ++++++++++++++++++++++++++++-
>>  osaf/services/saf/immsv/immnd/ImmModel.hh  |   10 +-
>>  osaf/services/saf/immsv/immnd/immnd_evt.c  |   43 ++++-
>>  osaf/services/saf/immsv/immnd/immnd_init.h |    6 +-
>>  osaf/tools/safimm/immadm/imm_admin.c       |   13 +-
>>  5 files changed, 333 insertions(+), 18 deletions(-)
>>
>>
>> The enhancement dumps the IMMsv resource utilization data using IMM 
>> Admin Operation.
>> The IMM AdminOperation must be directed to immsv object 
>> opensafImm=opensafImm,safApp=safImmService.
>>
>> Presently two types of operationNames for dumping resource 
>> utilization is supported:
>>
>> display -- returns the terse output for the requested resource. The 
>> number of requested resource will be returned.
> Clarify to: The allocation count of the resource will be returned, 
> "number" can be misread as some kind of id.
>
>>    The supported resource are implementers, adminowners, ccbhandles 
>> and searchhandels.
> For ccbs its not really ccbHandles but just ccbs. I suggest the 
> resource name: 'ccbs'..
> Remeber that one ccb-handle can produce a chain of ccb's and even 
> after a ccb-handle is closed,
> the ccb(s) may linger in the system and will be included in the count.
> It is the number of "lingering" ccbs that is printed.
> Also even when there are zero ccbs lingering in the server, there may 
> be valid ccb-handles at clients.
> Note: It is the correct count that is printed. It is just the 
> explanation of what is counted that is not quite correct here.
> Similarly for "search-handles" I suggest: 'searches'.
>> Eg:
>>
>> immadm -O display -p resource:SA_STRING_T:implementers 
>> opensafImm=opensafImm,safApp=safImmService
>>
>> The output is the number of implementers present:
>> Name                                               Type Value(s)
>> ========================================================================
>> count                                              SA_INT64_T 9 (0x9)
>>
>> displayverbose -- returns the verbose output for the requested 
>> resource. The verbose output is supported for the resources 
>> implementers and adminowners. If the number of resource is greater 
>> than 127 then the verbose output is displayed to syslog.
>>
>> Eg:
>> immadm -O displayverbose -p resource:SA_STRING_T:implementers 
>> opensafImm=opensafImm,safApp=safImmService
>> [using admin-owner: 'safImmService']
>> Object: opensafImm=opensafImm,safApp=safImmService
>> Name                                               Type Value(s)
>> ========================================================================
>> safLogService                                      SA_INT64_T 131343 
>> (0x2010f)
>> safClmService                                      SA_INT64_T 131343 
>> (0x2010f)
>> safAmfService                                      SA_INT64_T 131343 
>> (0x2010f)
>> MsgQueueService131343                              SA_INT64_T 131343 
>> (0x2010f)
>> safMsgGrpService                                   SA_INT64_T 131343 
>> (0x2010f)
>> safCheckPointService                               SA_INT64_T 131343 
>> (0x2010f)
>> safEvtService                                      SA_INT64_T 131343 
>> (0x2010f)
>> safLckService                                      SA_INT64_T 131343 
>> (0x2010f)
>> safSmfService                                      SA_INT64_T 131343 
>> (0x2010f)
> Here in this case it is not clear to the user what the value printed 
> per implementer is. It looks like the nodeId (all of them are the same)
> but more useful would be the implementerId or the connectionId (from 
> the OI handle) because the user "knows" on which node they are 
> invoking the request on
> and  remember that we only get the reply for the local IMMND (plus PBE 
> that can be remote).
>
> For the verbose output it would be nice to also get the complete name, 
> implementer-id, client-id and node-id for the implementer. But that 
> could be added later.
> Either by re-opening the enhancement if you get some time before FC or 
> later by creating a minor defect ticket.
>> If the operationName display-help is used, the return parameters will 
>> have presently supported resources for dumping resource utilization 
>> data.
>>
>> Eg:
>> immadm -O display-help opensafImm=opensafImm,safApp=safImmService
>> [using admin-owner: 'safImmService']
>> Object: opensafImm=opensafImm,safApp=safImmService
>> Name                                               Type Value(s)
>> ========================================================================
>> supportedResources                                 SA_STRING_T 
>> implementers
>> supportedResources                                 SA_STRING_T 
>> adminowners
>> supportedResources                                 SA_STRING_T 
>> ccbhandles
>> supportedResources                                 SA_STRING_T 
>> searchhandels
>>
>>
>> error-string is returned. if any of the dispaly operations fails.
>>   immadm is modified for displaying the returned parameters when 
>> dumping of resource utilization is supported .
>>
>> 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
>> @@ -1169,11 +1169,12 @@ immModel_adminOperationInvoke(IMMND_CB *
>>      SaInvocationT inv,
>>      SaUint32T* implConn,
>>      SaClmNodeIdT* implNodeId,
>> -    SaBoolT pbeExpected)
>> +    SaBoolT pbeExpected,
>> +    bool* displayRes)
>>  {
>>      return ImmModel::instance(&cb->immModel)->
>>          adminOperationInvoke(req, reqConn, reply_dest, inv,
>> -        implConn, implNodeId, pbeExpected);
>> +        implConn, implNodeId, pbeExpected, displayRes);
>>  }
>>
>>  SaUint32T  /* Returns admo-id for object if object exists and active 
>> admo exists, otherwise zero. */
>> @@ -1903,6 +1904,44 @@ immModel_fetchRtUpdate(IMMND_CB *cb,
>>  }
>>
>>
>> +SaAisErrorT +immModel_resourceDisplay(IMMND_CB *cb,
>> +    const struct ImmsvOmAdminOperationInvoke *req,
>> +    struct ImmsvAdminOperationParam **rparams)
>> +{
>> +
>> +    struct ImmsvAdminOperationParam *params = req->params;
>> +    SaStringT opName = NULL;
>> +    SaUint64T searchcount=0;
>> +
>> +    while (params) {
>> +    if ((strcmp(params->paramName.buf, SA_IMM_PARAM_ADMOP_NAME))==0){
>> +    opName=params->paramBuffer.val.x.buf;
>> +    break;
>> +    }
>> +    params=params->next;
>> +    }
>> +    +    if ((strcmp(opName,"display")==0)){
>> +        IMMND_OM_SEARCH_NODE *searchOp;
>> +        IMMND_IMM_CLIENT_NODE *cl_node =
>> +                  (IMMND_IMM_CLIENT_NODE 
>> *)ncs_patricia_tree_getnext(&cb->client_info_db, NULL);
>> +        while(cl_node) {
>> +           searchOp = cl_node->searchOpList;
>> +            while(searchOp) {
>> +                searchcount++;
>> +                searchOp = searchOp->next;
>> +            }
>> +            cl_node = (IMMND_IMM_CLIENT_NODE 
>> *)ncs_patricia_tree_getnext(
>> +                           &cb->client_info_db, 
>> cl_node->patnode.key_info);
>> +        }
>> +
>> +    }
>> +
>> +    return ImmModel::instance(&cb->immModel)->
>> +    resourceDisplay(req, rparams, searchcount);
>> +}
>> +
>>  /*====================================================================*/ 
>>
>>
>>  ImmModel::ImmModel() : @@ -10107,7 +10146,7 @@ SaAisErrorT 
>> ImmModel::adminOperationInvo
>>                                             SaInvocationT& saInv,
>>                                             SaUint32T* implConn,
>>                                             unsigned int* implNodeId,
>> -                                           bool pbeExpected)
>> +                                           bool pbeExpected, bool* 
>> displayRes)
>>  {
>>      TRACE_ENTER();
>>      SaAisErrorT err = SA_AIS_OK;
>> @@ -10212,6 +10251,12 @@ SaAisErrorT ImmModel::adminOperationInvo
>>   fake_obj:
>>      // Check for call on object implementer
>>      if(object->mImplementer && object->mImplementer->mNodeId) {
>> +
>> +    if(req->operationId == SA_IMM_PARAM_ADMOP_ID_ESC && objectName 
>> == immObjectDn && displayRes){
>> +        err = updateImmObject2(req, displayRes);
>> +        goto done;
>> +    }
>> +
> The above check could I think just as well be put into 
> ImmModel:resourceDisplay.
>
>
>>          *implConn = object->mImplementer->mConn;
>>          *implNodeId = object->mImplementer->mNodeId;
>>          @@ -10271,7 +10316,7 @@ SaAisErrorT 
>> ImmModel::adminOperationInvo
>>      } else {
>>          /* Check for special imm OI support */
>>          if(!pbeExpected && objectName == immObjectDn) {
>> -            err = updateImmObject2(req);
>> +            err = updateImmObject2(req, displayRes);
> Not sure we have to go to updateImmObject2 because we are no really 
> updating anything.
> We should only be going there if there is no OI (no PBE) and only to 
> bounce, getting
> the special error code ERR_REPAIR_PENDING which actually stands 
> exactly for
> "admin op directed at the opensaf imm service object normally handle 
> by PBE but PBE is detached"
>
>>              TRACE_7("Admin op on special object %s whith no 
>> implementer ret:%u",
>>                  objectName.c_str(), err);
>>          } else if(objectName == immManagementDn) {
>> @@ -10582,7 +10627,7 @@ ImmModel::updateImmObject(std::string ne
>>  }
>>
>>  SaAisErrorT
>> -ImmModel::updateImmObject2(const ImmsvOmAdminOperationInvoke* req)
>> +ImmModel::updateImmObject2(const ImmsvOmAdminOperationInvoke* req, 
>> bool * displayRes)
>>  {
>>      SaAisErrorT err = SA_AIS_ERR_REPAIR_PENDING;
>>      /* Function for handling admin-ops directed at the immsv itself.
>> @@ -10621,7 +10666,8 @@ ImmModel::updateImmObject2(const ImmsvOm
>>      valuep = (ImmAttrValue *) avi->second;
>>      noStdFlags = valuep->getValue_int();
>>
>> -    if((req->params == NULL) || (req->params->paramType != 
>> SA_IMM_ATTR_SAUINT32T)) {
>> +    if((req->params == NULL) || ((req->params->paramType != 
>> SA_IMM_ATTR_SAUINT32T)&& + (req->params->paramType != 
>> SA_IMM_ATTR_SASTRINGT))) {
>>          err = SA_AIS_ERR_INVALID_PARAM;
>>          goto done;
>>      }
>> @@ -10645,9 +10691,25 @@ ImmModel::updateImmObject2(const ImmsvOm
>>          noStdFlags &= ~flagsToUnSet;
>>          valuep->setValue_int(noStdFlags);
>>          LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(), 
>> noStdFlags);
>> +    } else if(req->operationId == SA_IMM_PARAM_ADMOP_ID_ESC && 
>> displayRes && req->params) {
>> +    IMMSV_ADMIN_OPERATION_PARAM* params = req->params;
>> +
>> +    while(params) {
>> + if((strcmp(params->paramName.buf,SA_IMM_PARAM_ADMOP_NAME)==0) && 
>> (params->paramType==SA_IMM_ATTR_SASTRINGT))                {
>> + if(strncmp(params->paramBuffer.val.x.buf,"display",7)==0) {
>> +                *displayRes=true;
>> +            } else {
>> +                LOG_WA("Invalid OperationName %s for dumping IMM 
>> resource is not set properly", params-> paramBuffer.val.x.buf);
>> +                err = SA_AIS_ERR_INVALID_PARAM;
>> +            }
>> +            break;
>> +        }
>> +        params = params->next;
>> +    }
>> +
> Again put the above logic, which is specific to this particular 
> admin-op in the ImmModel::resourceDisplay methoid,
> which is particluar to that admin-op.
>>      } else {
>>          LOG_NO("Invalid operation ID %llu, for operation on %s", 
>> (SaUint64T) req->operationId,
>> -            immObjectDn.c_str());
>> +                                    immObjectDn.c_str());
>>          err = SA_AIS_ERR_INVALID_PARAM;
>>      }
>>
>> @@ -10657,6 +10719,209 @@ ImmModel::updateImmObject2(const ImmsvOm
>>  }
>>
>>  SaAisErrorT
>> +ImmModel::resourceDisplay(const struct ImmsvOmAdminOperationInvoke 
>> *req, +                struct ImmsvAdminOperationParam **rparams, 
>> SaUint64T searchcount)
>> +{
>> +    SaAisErrorT err = SA_AIS_OK;
>> +    struct ImmsvAdminOperationParam *params = req->params;
>> +    SaStringT opName = NULL, resourceName = NULL, errStr = NULL;
>> +    struct ImmsvAdminOperationParam * resparams = NULL;
>> +
>> +    TRACE_ENTER();
>> +
>> +    while (params) {
>> +        if ((strcmp(params->paramName.buf, 
>> SA_IMM_PARAM_ADMOP_NAME))==0){
>> +            opName=params->paramBuffer.val.x.buf;
>> +            break;
>> +        }
>> +            params=params->next;
>> +    }
>> +
>> +
>> +    if (opName){
>> +        params = req->params;
>> +        while(params){
>> +            if((strcmp(params->paramName.buf, "resource"))==0){
>> + resourceName=params->paramBuffer.val.x.buf;
>> +                TRACE_5("The resource  is %s", resourceName);
>> +                            break;
>> +                    }
>> +            params=params->next;
>> +        }
>> +        if(!resourceName){  + if(strcmp(opName,"display-help")==0){
>> +                TRACE_5("supported IMM resources to be displyed by 
>> using admin operation");
>> +            } else {
>> +                LOG_WA("The resource type is not present in the 
>> requested parameters for displaying IMM resources");
>> +                err = SA_AIS_ERR_INVALID_PARAM;
>> +                int len= strlen("resource type is not present in the 
>> requested parameters")+1;
>> +                errStr = (SaStringT)malloc (len);
>> +                strcpy(errStr, "resource type is not present in the 
>> requested parameters");
>> +            }
>> +        }
>> +    }
>> +
>> +    if ((strcmp(opName,"display")==0)) {
>> +        resparams = (struct ImmsvAdminOperationParam *)calloc (1, 
>> sizeof(struct ImmsvAdminOperationParam));
>> +        resparams->paramType = SA_IMM_ATTR_SAINT64T;
>> +        resparams->next = NULL;
>> +        resparams->paramName.size=strlen("count")+1;
>> +        resparams->paramName.buf=(char *) malloc 
>> (resparams->paramName.size);
>> +        strcpy(resparams->paramName.buf,"count");
>> +        if((strcmp(resourceName,"implementers")==0)){
>> + resparams->paramBuffer.val.saint64=sImplementerVector.size();
>> +        }else if ((strcmp(resourceName,"adminowners")==0)){
>> + resparams->paramBuffer.val.saint64=sOwnerVector.size();
>> +                }else if ((strcmp(resourceName,"ccbhandles")==0)){
>> + resparams->paramBuffer.val.saint64=sCcbVector.size();
>> +                }else if ((strcmp(resourceName,"searchhandels")==0)){
>> + resparams->paramBuffer.val.saint64=searchcount;
>> +        }else {
>> +                        LOG_WA("Display of IMM reources for 
>> resourceName %s is unsupported", resourceName);
>> +                        err = SA_AIS_ERR_INVALID_PARAM; 
>> +                        int cnt = strlen("Display of IMM reources 
>> for resourceName is unsupported")+1;
>> +                        errStr = (SaStringT)malloc (cnt);
>> +                        strcpy(errStr, "Display of IMM reources for 
>> resourceName is unsupported");
>> +            free(resparams);
>> +            resparams = NULL;
>> +            goto done;
>> +                }
>> +
>> +    } else if(strcmp(opName,"displayverbose")==0){
>> +
>> +        struct ImmsvAdminOperationParam * result=NULL;
>> +        if((strcmp(resourceName,"implementers")==0)){
>> +            if(sImplementerVector.size() > 0){
>> +                if(sImplementerVector.size() < 128){
>> +
>> +                    ImplementerVector::iterator i;
>> +                    for(i = sImplementerVector.begin(); i != 
>> sImplementerVector.end(); ++i) {
>> +                        ImplementerInfo* info = (*i);
>> +                        struct ImmsvAdminOperationParam * res = 
>> +                            (struct ImmsvAdminOperationParam 
>> *)calloc (1, sizeof(struct ImmsvAdminOperationParam));
>> +                        res->paramType = SA_IMM_ATTR_SAINT64T;
>> +                        res->next = NULL;
>> + res->paramName.size=info->mImplementerName.length()+1;
>> +                        res->paramName.buf=(char *) malloc 
>> (res->paramName.size);
>> + strcpy(res->paramName.buf,info->mImplementerName.c_str());
>> + res->paramBuffer.val.saint64=info->mNodeId;
>> +                                    if(result){
>> +                            result->next = res;
>> +                            result=res;
>> +                        }else {
>> +                            result = res;
>> +                            resparams=res;
>> +                        }
>> +                    }
>> +
>> +                } else {
>> +                    LOG_NO("The Number of implementers are greater 
>> than 128, displaying the implementers 
>> informati                            on to syslog");
>> +                    ImplementerVector::iterator i;
>> +                                        for(i = 
>> sImplementerVector.begin(); i != sImplementerVector.end(); ++i) {
>> +                        ImplementerInfo* info = (*i);
>> +                        LOG_IN("Implementer name %s and location of 
>> the implementer is %u", + info->mImplementerName.c_str(), 
>> info->mNodeId);
>> +                    }
>> +                }
>> +            }
>> +        } else if((strcmp(resourceName,"adminowners")==0)){
>> +            if(sOwnerVector.size() > 0){
>> +                                if(sOwnerVector.size() < 128){
>> +                    AdminOwnerVector::iterator i;
>> +                                        for(i = 
>> sOwnerVector.begin(); i != sOwnerVector.end(); ++i) {
>> +                        AdminOwnerInfo* adminOwner = (*i);
>> +                                                struct 
>> ImmsvAdminOperationParam * res =
>> +                                                  (struct 
>> ImmsvAdminOperationParam *) +                            calloc (1, 
>> sizeof(struct ImmsvAdminOperationParam));
>> + res->paramType = SA_IMM_ATTR_SAINT64T;
>> +                                                res->next = NULL;
>> + res->paramName.size=adminOwner->mAdminOwnerName.length()+1;
>> + res->paramName.buf=(char *) malloc (res->paramName.size);
>> + strcpy(res->paramName.buf,adminOwner->mAdminOwnerName.c_str());
>> + res->paramBuffer.val.saint64=adminOwner->mNodeId;
>> +                        if(result){
>> +                            result->next = res;
>> +                            result=res;
>> +                        }else { + result = res;
>> +                            resparams=res;
>> +                        }
>> +                                        }
>> +                                }
>> +                                        LOG_NO("The Number of 
>> AdminOwners are greater than 128, displaying the adminowner 
>> information                             to syslog"); 
>> +                    AdminOwnerVector::iterator i;
>> +                                        for(i = 
>> sOwnerVector.begin(); i != sOwnerVector.end(); ++i) {
>> +                        AdminOwnerInfo* adminOwner = (*i);
>> + LOG_IN("Implementer name %s and location of the implementer is %u", 
>> + adminOwner->mAdminOwnerName.c_str(), adminOwner->mNodeId); 
>> +                                        }
>> +            }
>> +        } else {
>> +            LOG_WA("Verbose display of reourcename %s is 
>> unsupported", resourceName);
>> +                    err = SA_AIS_ERR_INVALID_PARAM; +            int 
>> cnt = strlen("verbose display of requested resourceName is 
>> unsupported")+1;
>> +            errStr = (SaStringT)malloc (cnt);
>> +            strcpy(errStr, "Verbose display of requested 
>> resourceName is unsupported");
>> +            goto done;
>> +        }
>> +    } else if((strcmp(opName,"display-help")==0)) {
>> +        const char *resources[]  = {"implementers", "adminowners", 
>> "ccbhandles", "searchhandels", NULL};
>> +        int i=0; +
>> +        struct ImmsvAdminOperationParam * result=NULL;
>> +        while(resources[i]){
>> +            struct ImmsvAdminOperationParam * res = (struct 
>> ImmsvAdminOperationParam *)
>> +                            calloc (1, sizeof(struct 
>> ImmsvAdminOperationParam));
>> +            res->paramType = SA_IMM_ATTR_SASTRINGT;
>> +            res->next = NULL;
>> + res->paramName.size=strlen("supportedResources")+1;
>> +            res->paramName.buf=(char *) malloc (res->paramName.size);
>> +            strcpy(res->paramName.buf,"supportedResources");
>> +            res->paramBuffer.val.x.size= strlen(resources[i])+1;
>> +            res->paramBuffer.val.x.buf = (char *) malloc 
>> (res->paramBuffer.val.x.size);
>> +            strcpy(res->paramBuffer.val.x.buf,resources[i]);
>> +
>> +            if(result){
>> +                result->next = res;
>> +                result=res;
>> +            }
>> +            else {
>> +                result = res;
>> +                resparams=res;
>> +            }
>> +            i++;
>> +        }
>> +    }else{
>> +        LOG_WA("OperationName %s is not supported", opName);
>> +        err = SA_AIS_ERR_INVALID_PARAM;
>> +        int cnt = strlen("OperationName is not supported")+1;
>> +        errStr = (SaStringT)malloc (cnt);
>> +        strcpy(errStr, "OperationName is not supported");
>> +    }
>> +
>> +
>> +    done:
>> +    if(!resparams && errStr){
>> +        struct ImmsvAdminOperationParam * errparam = (struct 
>> ImmsvAdminOperationParam *)
>> +                        calloc (1, sizeof(struct 
>> ImmsvAdminOperationParam));
>> +                errparam->paramType = SA_IMM_ATTR_SASTRINGT;
>> +                errparam->next = NULL;
>> + errparam->paramName.size=strlen(SA_IMM_PARAM_ADMOP_ERROR)+1;
>> +                errparam->paramName.buf=(char *) malloc 
>> (errparam->paramName.size);
>> + strcpy(errparam->paramName.buf,SA_IMM_PARAM_ADMOP_ERROR);
>> +        errparam->paramBuffer.val.x.size= strlen(errStr)+1;
>> +        errparam->paramBuffer.val.x.buf = errStr;
>> +        resparams=errparam;
>> +    }
>> +
>> +    *rparams = resparams;
>> +
>> +    TRACE_LEAVE();
>> +    return err;
>> +}
>> +
>> +
>> +SaAisErrorT
>>  ImmModel::admoImmMngtObject(const ImmsvOmAdminOperationInvoke* req)
>>  {
>>      SaAisErrorT err = SA_AIS_ERR_INTERRUPT;
>> 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
>> @@ -351,7 +351,8 @@ public:
>>                                               SaInvocationT& inv,
>>                                               SaUint32T* implConn,
>>                                               unsigned int* implNodeId,
>> -                                             bool pbeExpected);
>> +                                             bool pbeExpected,
>> +                         bool* displayRes);
>>           // Objects
>>      @@ -453,6 +454,11 @@ public:
>>                                         ImplementerInfo* info,
>>                                         bool& subTreeHasPersistent,
>>                                         bool& subTreeHasSpecialAppl);
>> +
>> +    SaAisErrorT       resourceDisplay(
>> +                    const struct ImmsvOmAdminOperationInvoke *req, 
>> +                    struct ImmsvAdminOperationParam **rparams,
>> +                    SaUint64T searchcount);
>>           SaAisErrorT       objectSync(const ImmsvOmObjectSync* req);
>>      bool              fetchRtUpdate(ImmsvOmObjectSync* syncReq,
>> @@ -633,7 +639,7 @@ private:
>>      void               updateImmObject(
>>                                         std::string newClassName, 
>>                                         bool remove=false);
>> -    SaAisErrorT        updateImmObject2(const 
>> ImmsvOmAdminOperationInvoke* req);
>> +    SaAisErrorT        updateImmObject2(const 
>> ImmsvOmAdminOperationInvoke* req, bool * displayRes);
>>      SaAisErrorT        admoImmMngtObject(const 
>> ImmsvOmAdminOperationInvoke* req);
>>           void               addNoDanglingRefs(ObjectInfo *obj);
>> 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
>> @@ -4625,6 +4625,7 @@ static void immnd_evt_proc_admop(IMMND_C
>>      SaUint32T implConn = 0;
>>      NCS_NODE_ID implNodeId = 0;
>>      SaBoolT async = SA_FALSE;
>> +    bool displayRes=false;
> I was going to say "add a comment clarifying that this new bool is 
> only for this particular admin-op.".
> But I think all this special processing in proc_admop() dissapears and 
> ends up in proc_admop_rsp() instead.
> But then this bool will appear there and so a comment explaining this 
> special bool will be merited there.
> In proc_admop it should suffice to just bounce with REPAIR_PENDING if 
> this is the special case and the
> PBE is missing.
>>      SaBoolT pbeExpected = cb->mPbeFile && (cb->mRim == 
>> SA_IMM_KEEP_REPOSITORY);
>>
>>      async = (evt->type == IMMND_EVT_A2ND_IMM_ADMOP_ASYNC);
>> @@ -4644,8 +4645,8 @@ static void immnd_evt_proc_admop(IMMND_C
>>
>>      error = immModel_adminOperationInvoke(cb, &(evt->info.admOpReq),
>>                            originatedAtThisNd ? conn : 0,
>> -                          (SaUint64T)reply_dest, saInv, &implConn,
>> -                                      &implNodeId, pbeExpected);
>> +                          (SaUint64T)reply_dest, saInv, &implConn, 
>> +                          &implNodeId, pbeExpected, &displayRes);
>>
>>      /*Check if we have an implementer, if so forward the message.
>>         If there is no implementer then implNodeId is zero.
>> @@ -4782,7 +4783,43 @@ static void immnd_evt_proc_admop(IMMND_C
>>          memset(&send_evt, '\0', sizeof(IMMSV_EVT));
>>          send_evt.type = IMMSV_EVT_TYPE_IMMA;
>>
> Now we are getting to the case where there is no PBE, i.e. the PBE is 
> disabled.
>
> But I dont like the code duplication below.
> From here:
>> -        if(error == SA_AIS_ERR_REPAIR_PENDING) {
>> +        if(error == SA_AIS_ERR_REPAIR_PENDING && displayRes) {
>> +            IMMSV_ADMIN_OPERATION_PARAM *rparams= NULL;
>> +            uint32_t rc = NCSCC_RC_SUCCESS, result = SA_AIS_OK;
>> +            osafassert(displayRes);
>> +            TRACE("Ok reply for internally handled adminOp when 
>> operationId is display");
>> +
>> +            result = immModel_resourceDisplay(cb, 
>> &(evt->info.admOpReq), &rparams);
>> +
>> +            if(!rparams)
>> +                TRACE_2("rparams from display is NULL");
>> +            send_evt.info.imma.type = IMMA_EVT_ND2A_ADMOP_RSP_2;
>> +            send_evt.info.imma.info.admOpRsp.invocation = saInv;
>> +            send_evt.info.imma.info.admOpRsp.result = result;
>> +            send_evt.info.imma.info.admOpRsp.error = SA_AIS_OK;
>> +            send_evt.info.imma.info.admOpRsp.parms = rparams;
>> +
>> +            if (async) {
>> +                TRACE_2("ASYNCRONOUS special reply %llu %u %u to OM",
>> +                send_evt.info.imma.info.admOpRsp.invocation,
>> +                send_evt.info.imma.info.admOpRsp.result,
>> +                send_evt.info.imma.info.admOpRsp.error);
>> +                rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMA_OM,
>> +                            cl_node->agent_mds_dest, &send_evt);
>> +                TRACE_2("ASYNC REPLY SENT rc:%u", rc);
>> +            } else {
>> +                TRACE_2("NORMAL syncronous reply %llu %u to OM",
>> +                send_evt.info.imma.info.admOpRsp.invocation,
>> +                send_evt.info.imma.info.admOpRsp.result);
>> +                rc = immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), 
>> &send_evt);
>> +                TRACE_2("SYNC REPLY SENT rc:%u", rc);
>> +            }
>> +
>> +            if (rc != NCSCC_RC_SUCCESS) {
>> +                LOG_ER("Failure in sending reply for admin-op over 
>> MDS");
>> +            }
>> +
>> +        } else if(error == SA_AIS_ERR_REPAIR_PENDING) {
>>              uint32_t rc = NCSCC_RC_SUCCESS;
>>              osafassert(!pbeExpected);
>>              TRACE("Ok reply for internally handled adminOp when PBE 
>> not configured");
>     ...}
> to the end of this else if branch.
>
> There should be one if statement catching ERR_REPAIR_PENDING and 
> inside that an additional
> nesting level discriminiating between what is now two cases of 
> admin-ops normally handled by PBE.
> Most of the code should be the same (message type for reply etc).
>
> /AndersBj
>
>> 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
>> @@ -98,7 +98,7 @@ extern "C" {
>>                        SaUint32T reqConn,
>>                        SaUint64T reply_dest,
>>                        SaInvocationT inv, SaUint32T *implConn,
>> -                                  SaClmNodeIdT *implNodeId, SaBoolT 
>> pbeExpected);
>> +                                  SaClmNodeIdT *implNodeId, SaBoolT 
>> pbeExpected, bool* displayRes);
>>
>>      SaAisErrorT immModel_classCreate(IMMND_CB *cb, const struct 
>> ImmsvOmClassDescr *req,
>> @@ -410,6 +410,10 @@ extern "C" {
>>      SaAisErrorT immModel_implIsFree(IMMND_CB *cb,
>>          const SaImmOiImplementerNameT implName);
>>
>> +    SaAisErrorT immModel_resourceDisplay(IMMND_CB *cb, + const 
>> struct ImmsvOmAdminOperationInvoke *req,
>> +        struct ImmsvAdminOperationParam **rparams);
>> +
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> diff --git a/osaf/tools/safimm/immadm/imm_admin.c 
>> b/osaf/tools/safimm/immadm/imm_admin.c
>> --- a/osaf/tools/safimm/immadm/imm_admin.c
>> +++ b/osaf/tools/safimm/immadm/imm_admin.c
>> @@ -244,7 +244,7 @@ int main(int argc, char *argv[])
>>          {"admin-owner", required_argument, 0, 'a'},
>>          {"help", no_argument, 0, 'h'},
>>          {"timeout", required_argument, 0, 't'},
>> -        {"verbose", required_argument, 0, 'v'},
>> +        {"verbose", no_argument, 0, 'v'},
>>          {0, 0, 0, 0}
>>      };
>>      SaAisErrorT error;
>> @@ -269,6 +269,7 @@ int main(int argc, char *argv[])
>>
>>      params = realloc(NULL, sizeof(SaImmAdminOperationParamsT_2 *));
>>      params[0] = NULL;
>> +    SaStringT opName = NULL;
>>
>>      while (1) {
>>          c = getopt_long(argc, argv, "dp:o:O:a:t:hv", long_options, 
>> NULL);
>> @@ -306,6 +307,7 @@ int main(int argc, char *argv[])
>>              param->paramType = SA_IMM_ATTR_SASTRINGT;
>>              param->paramBuffer = malloc(sizeof(SaStringT));
>>              *((SaStringT *)(param->paramBuffer)) = strdup(optarg);
>> +            opName = strdup(optarg);
>>              break;
>>          case 'p':
>>              params_len++;
>> @@ -347,7 +349,7 @@ int main(int argc, char *argv[])
>>      }
>>
>>      if (operationId == -1) {
>> -        fprintf(stderr, "error - must specify admin operation ID\n");
>> +        fprintf(stderr, "error - must specify admin operation ID 
>> %llx\n", operationId);
>>          exit(EXIT_FAILURE);
>>      }
>>
>> @@ -417,7 +419,7 @@ retry:
>>              exit(EXIT_FAILURE);
>>          }
>>
>> -        if (operationReturnValue != SA_AIS_OK) {
>> +        if (operationReturnValue != SA_AIS_OK ) {
>>              unsigned int ix = 0;
>>
>>              if ((operationReturnValue == SA_AIS_ERR_TRY_AGAIN) && 
>> !disable_tryagain) {
>> @@ -444,11 +446,12 @@ retry:
>>
>>                  print_params(argv[optind], out_params);
>>              }
>> -
>> +
>>              exit(EXIT_FAILURE);
>>          }
>>
>> -        if (verbose && out_params && out_params[0]) {
>> +
>> +        if (((opName && (strncmp(opName,"display",7)==0))||verbose) 
>> &&out_params && out_params[0]) {
>>              if(!isFirst)
>>                  printf("\n");
>>              else
>


------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to