Hi Dat,

See my comments start with [Thien]

Best Regards,
Thien

-----Original Message-----
From: Dat Tran Quoc Phan <dat.tq.p...@dektech.com.au> 
Sent: Monday, February 13, 2023 3:21 PM
To: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Thien Minh Huynh 
<thien.m.hu...@dektech.com.au>
Cc: opensaf-devel@lists.sourceforge.net; Dat Tran Quoc Phan 
<dat.tq.p...@dektech.com.au>
Subject: [PATCH 1/1] imm: Wait for NFS available before processing ccb [#3330]

There is a case that the ccb apply not run on some nodes due to NFS 
unavailable. Then it causes the mismatch state in complete ack.

Solution is to wait for NFS available before continuing ccb execution.

[Thien]: Long and short commit message should be describe closest with your 
change.
e.g.: The solution is to make FileSystemAvailable consistent between all nodes.
---
 src/imm/immnd/ImmModel.cc | 21 ++++++++++++++++-----  src/imm/immnd/ImmModel.h 
 |  1 +
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc index 
f49f95699..7932595f1 100644
--- a/src/imm/immnd/ImmModel.cc
+++ b/src/imm/immnd/ImmModel.cc
@@ -612,8 +612,6 @@ 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) {} @@ 
-2416,7 +2414,7 @@ bool ImmModel::immNotPbeWritable(bool isPrtoClient) {
   /* immInitMode == SA_IMM_KEEP_REPOSITORY */
   /* Check if PBE OI is available and making progress. */
 
-  if (!getPbeOi(&dummyCon, &dummyNode) || !sFileSystemAvailable) {
+  if (!getPbeOi(&dummyCon, &dummyNode) || !getFSAvailableFlag()) {
[Thien]: Should be keep using static variable instead of directly from IMM.
Instead of that, we able sync attribute value " saImmFileSystemStatus " to 
static variable in finalize sync phase.
e.g: 
SaAisErrorT  ImmModel::finalizeSync(...) {
if (isCoord) {
...
} else {
...
}
sFileSystemAvailable = getFSAvailableFlag();

}

     /* Pbe SHOULD be present but is NOT */
     return true;
   }
@@ -2956,6 +2954,21 @@ void ImmModel::setRegenerateDbFlag(bool value) {
   sRegenerateDb = value;
 }
 
+bool ImmModel::getFSAvailableFlag() {
+  ImmAttrValueMap::iterator avi;
+  ObjectInfo* immMgObject = NULL;
+  ObjectMap::iterator oi = sObjectMap.find(immManagementDn);
+  if (oi != sObjectMap.end()) {
+    immMgObject = oi->second;
+    avi = immMgObject->mAttrValueMap.find(saImmFileSystemStatus);
+    if (avi != immMgObject->mAttrValueMap.end()) {
+      osafassert(!avi->second->isMultiValued());
+      if (avi->second->empty()) return true;
+      return avi->second->getValue_int() != 0;
+    }
+  }
+  return true;
+}
 /**
  * Fetches the SaImmRepositoryInitT value of the attribute
  * 'saImmRepositoryInit' in the object immManagementDn.
@@ -13972,14 +13985,12 @@ SaAisErrorT ImmModel::admoImmMngtObject(const 
ImmsvOmAdminOperationInvoke* req,
            SA_IMM_ADMIN_FS_AVAILABLE);
     osafassert(fs_attr_iter != immObject->mAttrValueMap.end());
     auto fs_attr_value = fs_attr_iter->second;
-    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);
     osafassert(fs_attr_iter != immObject->mAttrValueMap.end());
     auto fs_attr_value = fs_attr_iter->second;
-    sFileSystemAvailable = false;
     fs_attr_value->setValue_int(0);
   } else {
     LOG_NO("Invalid operation ID %llu, for operation on %s", diff --git 
a/src/imm/immnd/ImmModel.h b/src/imm/immnd/ImmModel.h index 
9940330f6..571e783ad 100644
--- a/src/imm/immnd/ImmModel.h
+++ b/src/imm/immnd/ImmModel.h
@@ -376,6 +376,7 @@ class ImmModel {
                   bool increment);
   bool getRegenerateDbFlag();
   void setRegenerateDbFlag(bool value);
+  bool getFSAvailableFlag();
   SaImmRepositoryInitModeT getRepositoryInitMode();
   unsigned int getMaxSyncBatchSize();
   SaTimeT getSyncrTimeout();
--
2.17.1



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

Reply via email to