Hi all,

Have you had time to review the patch? I will push this ticket by this
Wednesday if there is no comment/feedback.

Regards, Vu

> -----Original Message-----
> From: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au>
> Sent: Tuesday, March 26, 2019 1:19 PM
> To: hans.nordeb...@ericsson.com; lennart.l...@ericsson.com;
> gary....@dektech.com.au
> Cc: opensaf-devel@lists.sourceforge.net; Vu Minh Nguyen
> <vu.m.ngu...@dektech.com.au>
> Subject: [PATCH 1/1] imm: return try-again on write requests while fs is
> unavailable [#3019]
> 
> When underlying file system is unresponsive to pbe write request, all IMM
> requests that required to be persistent such as creating an IMM object or
> creating an IMM class likely gets SA_AIS_ERR_TIMEOUT.
> 
> This changeset introduces two administrative operations which are provided
> to
> let user inform IMM if the file system is unavailable or not. If the file
> system is not available, IMM will return SA_AIS_ERR_TRY_AGAIN earlier to
> the
> caller instead of SA_AIS_ERR_TIMEOUT.
> 
> Besides, a new IMM attribute, saImmFileSystemStatus, is added to
> SaImmMngt class; the value shows the current status of the file system
> according to IMM view.
> ---
>  src/imm/README                                |  49 ++++++-
>  .../management/test_saImmOmClassCreate_2.c    | 136
> ++++++++++++++++++
>  src/imm/common/immsv_api.h                    |   5 +-
>  src/imm/config/immsv_classes.xml              |   7 +
>  src/imm/immnd/ImmModel.cc                     |  91 ++++++++++--
>  src/imm/immnd/ImmModel.h                      |   1 +
>  src/imm/immnd/immnd_evt.c                     |  11 +-
>  src/imm/immnd/immnd_init.h                    |   1 +
>  8 files changed, 288 insertions(+), 13 deletions(-)
> 
> diff --git a/src/imm/README b/src/imm/README
> index 132ee0ac0..8e91b534c 100644
> --- a/src/imm/README
> +++ b/src/imm/README
> @@ -2969,7 +2969,7 @@ attribute in the object:
> 
>  The following is the shell command:
> 
> -        immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:1024 \
> +        immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:512 \
>             opensafImm=opensafImm,safApp=safImmService
> 
>  This will set bit 10 of the 'opensafImmNostdFlags' runtime attribute
inside
> the immsv.
> @@ -3027,7 +3027,6 @@ expires.
>  To be possible to use this new feature, bit 10 must be set in
>  opensafImmNostdFlags attribute in IMM object.
> 
> -
>  Provide an admin-operation for re-generating backend database from one in
> RAM
> 
> ==============================================================
> ===============
>  https://sourceforge.net/p/opensaf/tickets/2940/
> @@ -3046,6 +3045,52 @@ back-end database from one in memory to keep
> them both consistent.
> 
>  immadm -o 303 safRdn=immManagement,safApp=safImmService
> 
> +Return try-again on write requests while file system is unavailable
> +=============================================================
> ======
> +https://sourceforge.net/p/opensaf/tickets/3019
> +
> +When underlying file system is unresponsive to pbe write request, all IMM
> +requests that required to be persistent such as creating an IMM object or
> +creating an IMM class likely gets SA_AIS_ERR_TIMEOUT.
> +
> +Since OpenSAF version 5.19.06, IMM introduces two new administrative
> operations
> +which are used to inform IMM if the file system is unavailable or not. If
the
> +file system is not available for write, IMM will return
> SA_AIS_ERR_TRY_AGAIN
> +earlier to the caller instead of SA_AIS_ERR_TIMEOUT.
> +
> +Operation ID 400 is used to inform the file system is unavailable:
> + immadm -o 400 safRdn=immManagement,safApp=safImmService
> +
> +and operation ID 401 is used to inform the file system is back:
> + immadm -o 401 safRdn=immManagement,safApp=safImmService
> +
> +Besides, a new runtime IMM attribute, saImmFileSystemStatus, is added to
> +SaImmMngt class; the value shows the current status of the file system:
> +saImmFileSystemStatus = 0 means the file system is unavailable and
> +saImmFileSystemStatus = 1 means the file system is fine for write.
> +
> +Fetching the value of that attribute, other services or applications that
> +have activities to read/write data from/to the file system may benefit as
> well.
> +
> +Note that, to use this new feature, bit 11 must be set in
> opensafImmNostdFlags.
> +
> +The following is the shell command to set the 11st bit:
> + immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:1024 \
> +             opensafImm=opensafImm,safApp=safImmService
> +
> +In summary:
> + Bit 1 controls schema (imm class) changes allowed or not (normally
off/0).
> + Bit 2 controls OpenSAF4.1 protocols allowed or not (normally on/1).
> + Bit 3 controls OpenSAF4.3 protocols allowed or not (normally on/1).
> + Bit 4 controls 2PBE oneSafe2PBE, see 2PBE feature in OpenSAF4.4 above
> (normally off/0).
> + Bit 5 controls OpenSAF4.5 protocols allowed or not (normally on/1).
> + Bit 6 controls OpenSAF4.6 protocols allowed or not (normally on/1).
> + Bit 7 controls OpenSAF4.7 protocols allowed or not (normally on/1).
> + Bit 8 controls OpenSAF5.0 protocols allowed or not (normally on/1).
> + Bit 9 controls OpenSAF5.1 protocols allowed or not (normally on/1).
> + Bit 10 controls OpenSAF5.17.11 protocols allowed or not (normally on/1).
> + Bit 11 controls OpenSAF5.19.06 protocols allowed or not (normally on/1).
> +
>  ----------------------------------------
>  DEPENDENCIES
>  ============
> diff --git a/src/imm/apitest/management/test_saImmOmClassCreate_2.c
> b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
> index f43884e1b..9e12f4f61 100644
> --- a/src/imm/apitest/management/test_saImmOmClassCreate_2.c
> +++ b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
> @@ -16,6 +16,7 @@
>   */
> 
>  #include "imm/apitest/immtest.h"
> +#include "imm/common/immsv_api.h"
> 
>  void saImmOmClassCreate_2_01(void)
>  {
> @@ -709,6 +710,7 @@ void
> saImmOmClassCreate_SchemaChange_2_02(void)
>       /*
>        * [CONFIG_CLASS] Add default value to default-removed attribute
>        */
> +
>       int schemaChangeEnabled = enableSchemaChange();
>       safassert(immutil_saImmOmInitialize(&immOmHandle,
> &immOmCallbacks, &immVersion),
>                 SA_AIS_OK);
> @@ -1534,6 +1536,133 @@ void
> saImmOmClassCreate_SchemaChange_2_18(void)
>               disableSchemaChange();
>  }
> 
> +/* Here are test cases to verify:
> +   1) SA_AIS_ERR_TRY_AGAIN is returned on IMM class creation request if
> file
> +   system is unavailable which is informed to IMM via admop id 400, and
also
> +   ensure saImmFileSystemStatus attribute of SaImmMgnt class must be
> zero.
> +   Note that, the test is only valid if PBE is enabled, otherwise we
expect
> +   getting SA_AIS_OK instead.
> +
> +   2) SA_AIS_OK is returned on IMM class creation request if the file
system
> +   is back which is informed to IMM via admop id 401, and also ensure
that
> +   saImmFileSystemStatus attribute of SaImmMgnt class must be equal to
> one.
> +*/
> +const char mgmt_object[] =
> "safRdn=immManagement,safApp=safImmService";
> +static void updateFileSystemStatus(uint64_t operation_id)
> +{
> +     SaImmHandleT myOmHandle;
> +     SaImmAdminOwnerHandleT ownerHandle;
> +     const SaImmAdminOwnerNameT adminOwnerName = "imm_test";
> +     SaNameT objectName;
> +     const SaNameT *objectNames[] = {&objectName, NULL};
> +     const SaImmAdminOperationParamsT_2 *params[] = {NULL};
> +     SaAisErrorT operation_return_value;
> +
> +     objectName.length = strlen(mgmt_object);
> +     strncpy((char *)objectName.value, mgmt_object,
> +             objectName.length);
> +
> +     safassert(immutil_saImmOmInitialize(&myOmHandle, NULL,
> &immVersion),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmAdminOwnerInitialize(myOmHandle,
> +                                                   adminOwnerName,
> +                                                   SA_TRUE,
&ownerHandle),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmAdminOwnerSet(ownerHandle,
> objectNames,
> +                                            SA_IMM_ONE),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmAdminOperationInvoke_2(
> +                   ownerHandle, &objectName, 0, operation_id,
> +                   params, &operation_return_value,
> SA_TIME_ONE_MINUTE),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmFinalize(myOmHandle), SA_AIS_OK);
> +}
> +
> +uint32_t fetchAttributeValue(const char* attribute_name)
> +{
> +     SaImmHandleT myOmHandle;
> +     SaImmAccessorHandleT accessorHandle;
> +     SaImmAttrValuesT_2 **attributes;
> +     SaImmAttrNameT attributeNames[] = {
> +             (SaImmAttrNameT)attribute_name,
> +             NULL
> +     };
> +     SaNameT objectName;
> +     objectName.length = strlen(mgmt_object);
> +     strncpy((char *)objectName.value, mgmt_object,
> +             objectName.length);
> +
> +     safassert(immutil_saImmOmInitialize(&myOmHandle, NULL,
> +                                         &immVersion),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmAccessorInitialize(myOmHandle,
> +                                                 &accessorHandle),
> +               SA_AIS_OK);
> +     safassert(immutil_saImmOmAccessorGet_2(accessorHandle,
> &objectName,
> +                                            attributeNames, &attributes),
> +               SA_AIS_OK);
> +
> +     uint32_t attribute_value = *(uint32_t
*)(attributes[0]->attrValues[0]);
> +     safassert(immutil_saImmOmFinalize(myOmHandle), SA_AIS_OK);
> +     return attribute_value;
> +}
> +
> +bool pbeEnabled(void)
> +{
> +     return fetchAttributeValue("saImmRepositoryInit") == 1;
> +}
> +
> +void saImmOmClassCreate_with_fs_unavailable(void)
> +{
> +     const SaImmClassNameT className = (SaImmClassNameT)
> "TestClass";
> +     SaImmAttrDefinitionT_2 attr1 = {
> +             "rdn", SA_IMM_ATTR_SANAMET,
> +             SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN |
> SA_IMM_ATTR_CACHED,
> +             NULL};
> +     const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&attr1, NULL};
> +
> +     updateFileSystemStatus(SA_IMM_ADMIN_FS_UNAVAILABLE);
> +     safassert(fetchAttributeValue("saImmFileSystemStatus"), 0);
> +
> +     safassert(immutil_saImmOmInitialize(&immOmHandle, NULL,
> &immVersion),
> +               SA_AIS_OK);
> +     rc = saImmOmClassCreate_2(immOmHandle, className,
> SA_IMM_CLASS_RUNTIME,
> +                               attrDefinitions);
> +     if (pbeEnabled()) {
> +             test_validate(rc, SA_AIS_ERR_TRY_AGAIN);
> +     } else {
> +             test_validate(rc, SA_AIS_OK);
> +             safassert(immutil_saImmOmClassDelete(immOmHandle,
> className),
> +                       SA_AIS_OK);
> +     }
> +     safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +     updateFileSystemStatus(SA_IMM_ADMIN_FS_AVAILABLE);
> +     safassert(fetchAttributeValue("saImmFileSystemStatus"), 1);
> +}
> +
> +void saImmOmClassCreate_with_fs_available(void)
> +{
> +     const SaImmClassNameT className = (SaImmClassNameT)
> "TestClass";
> +     SaImmAttrDefinitionT_2 attr1 = {
> +             "rdn", SA_IMM_ATTR_SANAMET,
> +             SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN |
> SA_IMM_ATTR_CACHED,
> +             NULL};
> +     const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&attr1, NULL};
> +
> +     updateFileSystemStatus(SA_IMM_ADMIN_FS_AVAILABLE);
> +     safassert(fetchAttributeValue("saImmFileSystemStatus"), 1);
> +
> +     safassert(immutil_saImmOmInitialize(&immOmHandle,
> &immOmCallbacks,
> +                                         &immVersion),
> +               SA_AIS_OK);
> +     rc = immutil_saImmOmClassCreate_2(immOmHandle, className,
> +                                       SA_IMM_CLASS_RUNTIME,
> +                                       attrDefinitions);
> +     test_validate(rc, SA_AIS_OK);
> +     safassert(immutil_saImmOmClassDelete(immOmHandle, className),
> SA_AIS_OK);
> +     safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +}
> +
>  extern void saImmOmClassDescriptionGet_2_01(void);
>  extern void saImmOmClassDescriptionGet_2_02(void);
>  extern void saImmOmClassDescriptionGet_2_03(void);
> @@ -1724,4 +1853,11 @@ __attribute__((constructor)) static void
> saImmOmInitialize_constructor(void)
>       test_case_add(
>           2, saImmOmClassCreate_SchemaChange_2_18,
>           "SchemaChange - SA_AIS_OK, Remove STRONG_DEFAULT flag from
> an attribute");
> +     test_case_add(
> +             2, saImmOmClassCreate_with_fs_unavailable,
> +             "FileSystemUnavailable - SA_AIS_ERR_TRY_AGAIN, create
> class while FS is unavailable");
> +     test_case_add(
> +             2, saImmOmClassCreate_with_fs_available,
> +             "FileSystemAvailable - SA_AIS_OK, create class while FS is
> available");
> +
>  }
> diff --git a/src/imm/common/immsv_api.h b/src/imm/common/immsv_api.h
> index e6d613705..3ab3892d1 100644
> --- a/src/imm/common/immsv_api.h
> +++ b/src/imm/common/immsv_api.h
> @@ -151,6 +151,7 @@ typedef enum {
>  #define OPENSAF_IMM_FLAG_PRT50_ALLOW 0x00000080
>  #define OPENSAF_IMM_FLAG_PRT51_ALLOW 0x00000100
>  #define OPENSAF_IMM_FLAG_PRT51710_ALLOW 0x00000200
> +#define OPENSAF_IMM_FLAG_PRT51906_ALLOW 0x00000800
> 
>  #define OPENSAF_IMM_SERVICE_NAME "safImmService"
> 
> @@ -159,7 +160,9 @@ typedef enum {
>    SA_IMM_ADMIN_INIT_FROM_FILE = 100, /* Non standard, force PBE
> disable. */
>    SA_IMM_ADMIN_ABORT_CCBS = 202, /* Non standard, abort non critical
> CCBs. */
>    /* Non standard, regenerate pbe database from RAM */
> -  SA_IMM_ADMIN_REGENERATE_PBE_DB = 303
> +  SA_IMM_ADMIN_REGENERATE_PBE_DB = 303,
> +  SA_IMM_ADMIN_FS_UNAVAILABLE = 400,
> +  SA_IMM_ADMIN_FS_AVAILABLE = 401,
>  } SaImmMngtAdminOperationT;
> 
>  /*
> diff --git a/src/imm/config/immsv_classes.xml
> b/src/imm/config/immsv_classes.xml
> index 6c20fecda..c6f448e82 100644
> --- a/src/imm/config/immsv_classes.xml
> +++ b/src/imm/config/immsv_classes.xml
> @@ -46,5 +46,12 @@
>                       <category>SA_CONFIG</category>
>                       <flag>SA_WRITABLE</flag>
>               </attr>
> +             <attr>
> +                     <name>saImmFileSystemStatus</name>
> +                     <type>SA_UINT32_T</type>
> +                     <category>SA_RUNTIME</category>
> +                     <category>SA_RUNTIME</category>
> +                     <flag>SA_CACHED</flag>
> +             </attr>
>       </class>
>  </imm:IMM-contents>
> diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc
> index 4bc3b8522..2cf2649cf 100644
> --- a/src/imm/immnd/ImmModel.cc
> +++ b/src/imm/immnd/ImmModel.cc
> @@ -594,7 +594,7 @@ static const std::string immManagementDn(
>      "safRdn=immManagement,safApp=safImmService");
>  static const std::string saImmRepositoryInit("saImmRepositoryInit");
>  static const std::string saImmOiTimeout("saImmOiTimeout");
> -
> +static const std::string saImmFileSystemStatus("saImmFileSystemStatus");
>  static SaImmRepositoryInitModeT immInitMode =
> SA_IMM_INIT_FROM_FILE;
>  static bool sRegenerateDb = false;
> 
> @@ -609,6 +609,8 @@ static bool sAbortNonCriticalCcbs =
>  static SaUint32T sTerminatedCcbcount = 0; /* Terminated ccbs count.
> calculated
>                                               at cleanTheBasement  for
every
>                                               second*/
> +// Show the status of underlying file system.
> +static bool sFileSystemAvailable = true;
> 
>  struct AttrFlagIncludes {
>    explicit AttrFlagIncludes(SaImmAttrFlagsT attrFlag) : mFlag(attrFlag)
{}
> @@ -1125,6 +1127,10 @@ bool
> immModel_protocol51710Allowed(IMMND_CB* cb) {
>    return ImmModel::instance(&cb->immModel)->protocol51710Allowed();
>  }
> 
> +bool immModel_protocol51906Allowed(IMMND_CB* cb) {
> +  return ImmModel::instance(&cb->immModel)->protocol51906Allowed();
> +}
> +
>  OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB*
> cb) {
>    return ImmModel::instance(&cb->immModel)->accessControlMode();
>  }
> @@ -2360,6 +2366,7 @@ bool ImmModel::immNotWritable() {
>  bool ImmModel::immNotPbeWritable(bool isPrtoClient) {
>    SaUint32T dummyCon;
>    unsigned int dummyNode;
> +
>    /* Not writable => Not persitent writable. */
>    if (immNotWritable() || is_sync_aborting()) {
>      return true;
> @@ -2379,7 +2386,7 @@ bool ImmModel::immNotPbeWritable(bool
> isPrtoClient) {
>    /* immInitMode == SA_IMM_KEEP_REPOSITORY */
>    /* Check if PBE OI is available and making progress. */
> 
> -  if (!getPbeOi(&dummyCon, &dummyNode)) {
> +  if (!getPbeOi(&dummyCon, &dummyNode) || !sFileSystemAvailable) {
>      /* Pbe SHOULD be present but is NOT */
>      return true;
>    }
> @@ -4023,6 +4030,27 @@ bool ImmModel::protocol51710Allowed() {
>    return noStdFlags & OPENSAF_IMM_FLAG_PRT51710_ALLOW;
>  }
> 
> +bool ImmModel::protocol51906Allowed() {
> +  /* Assume that all nodes are running the same version when loading */
> +  if (sImmNodeState == IMM_NODE_LOADING) {
> +    return true;
> +  }
> +  ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
> +  if (oi == sObjectMap.end()) {
> +    return false;
> +  }
> +
> +  ObjectInfo* immObject = oi->second;
> +  ImmAttrValueMap::iterator avi =
> +      immObject->mAttrValueMap.find(immAttrNostFlags);
> +  osafassert(avi != immObject->mAttrValueMap.end());
> +  osafassert(!(avi->second->isMultiValued()));
> +  ImmAttrValue* valuep = avi->second;
> +  unsigned int noStdFlags = valuep->getValue_int();
> +
> +  return noStdFlags & OPENSAF_IMM_FLAG_PRT51906_ALLOW;
> +}
> +
>  bool ImmModel::protocol41Allowed() {
>    // TRACE_ENTER();
>    ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
> @@ -5085,6 +5113,8 @@ SaAisErrorT
> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard,
>               flags when cluster is started/loaded or restarted/reloaded.
>            */
>            ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
> +          auto oi2 = sObjectMap.find(immManagementDn);
> +
>            if (oi == sObjectMap.end()) {
>              LOG_ER("Failed to find object %s - loading failed",
>                     immObjectDn.c_str());
> @@ -5093,6 +5123,16 @@ SaAisErrorT
> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard,
>              err = SA_AIS_ERR_NOT_READY;
>              goto done;
>            }
> +
> +          if (oi2 == sObjectMap.end()) {
> +            LOG_ER("Failed to find object %s - loading failed",
> +                   immManagementDn.c_str());
> +            /* Return special error up to immnd_evt so that NackToNid can
be
> +               sent before aborting. */
> +            err = SA_AIS_ERR_NOT_READY;
> +            goto done;
> +          }
> +
>            ObjectInfo* immObject = oi->second;
>            ImmAttrValueMap::iterator avi =
>                immObject->mAttrValueMap.find(immAttrNostFlags);
> @@ -5108,6 +5148,9 @@ SaAisErrorT
> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard,
>                immObject->mAttrValueMap.find(immMaxCcbs);
>            ImmAttrValueMap::iterator avi5 =
>                immObject->mAttrValueMap.find(immMinApplierTimeout);
> +          auto mgnt_object = oi2->second;
> +          auto fs_attr_it =
> +              mgnt_object->mAttrValueMap.find(saImmFileSystemStatus);
> 
>            ImmAttrValue* valuep = (ImmAttrValue*)avi->second;
>            unsigned int noStdFlags = valuep->getValue_int();
> @@ -5134,6 +5177,14 @@ SaAisErrorT
> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard,
>            } else {
>              noStdFlags |= OPENSAF_IMM_FLAG_PRT51710_ALLOW;
>            }
> +
> +          if (fs_attr_it == immObject->mAttrValueMap.end()) {
> +            LOG_NO("protocol51906 is not set for opensafImmNostdFlags
> because "
> +                   "the new OpenSAF 5.19.06 attribute is not added to "
> +                   "SaImmMngt class");
> +          } else {
> +            noStdFlags |= OPENSAF_IMM_FLAG_PRT51906_ALLOW;
> +          }
>            valuep->setValue_int(noStdFlags);
>            LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(),
> noStdFlags);
>            /* END Temporary code. */
> @@ -12272,6 +12323,11 @@ SaAisErrorT ImmModel::accessorGet(const
> ImmsvOmSearchInit* req,
>            // The attribute is cached and the OI is transiently detached
>            op.addAttrValue(*j->second);
>            checkAttribute = true;
> +        } else if ((k->second->mFlags & SA_IMM_ATTR_CACHED) &&
> +                    (objectName == immManagementDn) &&
> +                    !(j->second->empty())) {
> +          op.addAttrValue(*j->second);
> +          checkAttribute = true;
>          } else {
>            checkAttribute = false;
>          }
> @@ -12844,6 +12900,11 @@ SaAisErrorT
> ImmModel::searchInitialize(ImmsvOmSearchInit* req,
>                      // detached
>                      op.addAttrValue(*j->second);
>                      checkAttribute = true;
> +                  } else if ((k->second->mFlags & SA_IMM_ATTR_CACHED) &&
> +                             (objectName == immManagementDn) &&
> +                             !(j->second->empty())) {
> +                    op.addAttrValue(*j->second);
> +                    checkAttribute = true;
>                    } else {
>                      checkAttribute = false;
>                    }
> @@ -13798,8 +13859,11 @@ SaAisErrorT
> ImmModel::admoImmMngtObject(const ImmsvOmAdminOperationInvoke*
> req,
>    TRACE_ENTER();
>    ObjectMap::iterator oi = sObjectMap.find(immManagementDn);
>    if (oi == sObjectMap.end()) {
> -    err = SA_AIS_ERR_NOT_EXIST;
> -    goto done;
> +    return SA_AIS_ERR_NOT_EXIST;
> +  }
> +
> +  if (req->params != NULL) {
> +    return SA_AIS_ERR_INVALID_PARAM;
>    }
> 
>    immObject = oi->second;
> @@ -13808,10 +13872,10 @@ SaAisErrorT
> ImmModel::admoImmMngtObject(const ImmsvOmAdminOperationInvoke*
> req,
>    osafassert(!(avi->second->isMultiValued()));
>    valuep = (ImmAttrValue*)avi->second;
> 
> -  if (req->params != NULL) {
> -    err = SA_AIS_ERR_INVALID_PARAM;
> -    goto done;
> -  }
> +  auto fs_attr_iter = immObject-
> >mAttrValueMap.find(saImmFileSystemStatus);
> +  osafassert(fs_attr_iter != immObject->mAttrValueMap.end());
> +  auto fs_attr_value = fs_attr_iter->second;
> +
> 
>    if (req->operationId == SA_IMM_ADMIN_EXPORT) { /* Standard */
>      err = SA_AIS_ERR_NOT_SUPPORTED;
> @@ -13833,13 +13897,22 @@ SaAisErrorT
> ImmModel::admoImmMngtObject(const ImmsvOmAdminOperationInvoke*
> req,
>    } else if (req->operationId == SA_IMM_ADMIN_REGENERATE_PBE_DB) {
>      LOG_NO("Re-generate the pbe database from one in memory.");
>      sRegenerateDb = true;
> +  } else if (req->operationId == SA_IMM_ADMIN_FS_AVAILABLE) {
> +    LOG_NO("Received: immadm -o %u
> safRdn=immManagement,safApp=safImmService",
> +           SA_IMM_ADMIN_FS_AVAILABLE);
> +    sFileSystemAvailable = true;
> +    fs_attr_value->setValue_int(1);
> +  } else if (req->operationId == SA_IMM_ADMIN_FS_UNAVAILABLE) {
> +    LOG_NO("Received: immadm -o %u
> safRdn=immManagement,safApp=safImmService",
> +           SA_IMM_ADMIN_FS_UNAVAILABLE);
> +    sFileSystemAvailable = false;
> +    fs_attr_value->setValue_int(0);
>    } else {
>      LOG_NO("Invalid operation ID %llu, for operation on %s",
>             (SaUint64T)req->operationId, immManagementDn.c_str());
>      err = SA_AIS_ERR_INVALID_PARAM;
>    }
> 
> -done:
>    TRACE_LEAVE();
>    return err;
>  }
> diff --git a/src/imm/immnd/ImmModel.h b/src/imm/immnd/ImmModel.h
> index 65e20d305..0b54bfa1d 100644
> --- a/src/imm/immnd/ImmModel.h
> +++ b/src/imm/immnd/ImmModel.h
> @@ -114,6 +114,7 @@ class ImmModel {
>    bool protocol50Allowed();
>    bool protocol51Allowed();
>    bool protocol51710Allowed();
> +  bool protocol51906Allowed();
>    bool oneSafe2PBEAllowed();
>    bool purgeSyncRequest(SaUint32T clientId);
>    bool verifySchemaChange(const std::string& className, ClassInfo*
> oldClass,
> diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c
> index 0415ebedf..adae1e15a 100644
> --- a/src/imm/immnd/immnd_evt.c
> +++ b/src/imm/immnd/immnd_evt.c
> @@ -3822,8 +3822,17 @@ static SaAisErrorT
> immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq,
> 
>       case IMMND_EVT_A2ND_IMM_ADMOP:
>       case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC:
> -             /* No restrictions at cluster level. */
> +     {
> +             IMMSV_OM_ADMIN_OP_INVOKE *adm =
> &frwrd_evt.info.immnd.info.admOpReq;
> +             bool fs_op = (adm->operationId ==
> SA_IMM_ADMIN_FS_AVAILABLE ||
> +                           adm->operationId ==
> SA_IMM_ADMIN_FS_UNAVAILABLE);
> +             if (!immModel_protocol51906Allowed(cb) && fs_op &&
> +                 strcmp(adm->objectName.buf,
> +                     "safRdn=immManagement,safApp=safImmService") ==
> 0) {
> +                     error = SA_AIS_ERR_TRY_AGAIN;
> +             }
>               break;
> +     }
> 
>       case IMMND_EVT_A2ND_CLASS_CREATE:
>               if (fevsReq->sender_count != 0x1) {
> diff --git a/src/imm/immnd/immnd_init.h b/src/imm/immnd/immnd_init.h
> index 58ed48329..9a3f70072 100644
> --- a/src/imm/immnd/immnd_init.h
> +++ b/src/imm/immnd/immnd_init.h
> @@ -345,6 +345,7 @@ bool immModel_protocol45Allowed(IMMND_CB
> *cb);
>  bool immModel_protocol46Allowed(IMMND_CB *cb);
>  bool immModel_protocol47Allowed(IMMND_CB *cb);
>  bool immModel_protocol50Allowed(IMMND_CB *cb);
> +bool immModel_protocol51906Allowed(IMMND_CB *cb);
>  bool immModel_oneSafe2PBEAllowed(IMMND_CB *cb);
>  OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB
> *cb);
>  const char *immModel_authorizedGroup(IMMND_CB *cb);
> --
> 2.19.2




_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to