LOG introduced the `saLogRecordDestination` attribute since OpenSAF 5.2
to handle the alternative destinations of log records, ticket [#2258].
During upgrade, if LOG server comes up before IMM model is updated
to new one which has saLogRecordDestination in, LOG server will be crashed

The solution is if not able to fetching new added attribute value from IMM,
LOG will try one more time with the attribute list without new added ones.
---
 src/log/logd/lgs_amf.cc   |   1 +
 src/log/logd/lgs_amf.h    |   2 +
 src/log/logd/lgs_imm.cc   | 113 ++++++++++++++++++++--------------------------
 src/log/logd/lgs_mbcsv.cc |   3 +-
 src/log/logd/lgs_mbcsv.h  |   3 ++
 src/log/logd/lgs_stream.h |   2 +
 6 files changed, 59 insertions(+), 65 deletions(-)

diff --git a/src/log/logd/lgs_amf.cc b/src/log/logd/lgs_amf.cc
index d62be99..30a4d5b 100644
--- a/src/log/logd/lgs_amf.cc
+++ b/src/log/logd/lgs_amf.cc
@@ -19,6 +19,7 @@
  * other modules.
  */
 
+#include "log/logd/lgs_amf.h"
 #include "nid/agent/nid_start_util.h"
 #include "osaf/immutil/immutil.h"
 #include "log/logd/lgs.h"
diff --git a/src/log/logd/lgs_amf.h b/src/log/logd/lgs_amf.h
index 91bd2de..2a7f0ff 100644
--- a/src/log/logd/lgs_amf.h
+++ b/src/log/logd/lgs_amf.h
@@ -18,6 +18,8 @@
 #ifndef LOG_LOGD_LGS_AMF_H_
 #define LOG_LOGD_LGS_AMF_H_
 
+#include <saAis.h>
+#include "log/logd/lgs_cb.h"
 
 SaAisErrorT lgs_amf_init(lgs_cb_t *cb);
 
diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc
index c856ec2..76faf6c 100644
--- a/src/log/logd/lgs_imm.cc
+++ b/src/log/logd/lgs_imm.cc
@@ -34,7 +34,6 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
-
 #include <saImmOm.h>
 #include <saImmOi.h>
 
@@ -2733,33 +2732,16 @@ done:
  * @return SaAisErrorT
  */
 static SaAisErrorT stream_create_and_configure(
-    const std::string &dn, log_stream_t **in_stream, int stream_id,
-    SaImmAccessorHandleT accessorHandle) {
+    const std::string &dn, int stream_id,
+    SaImmAttrValuesT_2** attributes) {
   SaAisErrorT rc = SA_AIS_OK;
-  SaNameT objectName;
   SaImmAttrValuesT_2 *attribute;
-  SaImmAttrValuesT_2 **attributes;
   int i = 0;
   log_stream_t *stream;
-  char *attribute_names[] = {
-      const_cast<char *>("saLogStreamFileName"),
-      const_cast<char *>("saLogStreamPathName"),
-      const_cast<char *>("saLogStreamMaxLogFileSize"),
-      const_cast<char *>("saLogStreamFixedLogRecordSize"),
-      const_cast<char *>("saLogStreamLogFullAction"),
-      const_cast<char *>("saLogStreamLogFullHaltThreshold"),
-      const_cast<char *>("saLogStreamMaxFilesRotated"),
-      const_cast<char *>("saLogStreamLogFileFormat"),
-      const_cast<char *>("saLogRecordDestination"),
-      const_cast<char *>("saLogStreamSeverityFilter"),
-      const_cast<char *>("saLogStreamCreationTimestamp"),
-      NULL};
 
   TRACE_ENTER2("(%s)", dn.c_str());
 
-  osaf_extended_name_lend(dn.c_str(), &objectName);
-
-  *in_stream = stream = log_stream_new(dn, stream_id);
+  stream = log_stream_new(dn, stream_id);
 
   if (stream == NULL) {
     rc = SA_AIS_ERR_NO_MEMORY;
@@ -2775,15 +2757,6 @@ static SaAisErrorT stream_create_and_configure(
   else
     stream->streamType = STREAM_TYPE_APPLICATION;
 
-  /* Get all attributes of the object */
-  if ((rc = immutil_saImmOmAccessorGet_2(accessorHandle, &objectName,
-                                         attribute_names, &attributes)) !=
-      SA_AIS_OK) {
-    LOG_ER("Configuration for %s not found: %s", dn.c_str(), saf_error(rc));
-    rc = SA_AIS_ERR_NOT_EXIST;
-    goto done;
-  }
-
   while ((attribute = attributes[i++]) != NULL) {
     void *value;
 
@@ -2910,11 +2883,11 @@ SaAisErrorT lgs_imm_init_configStreams(lgs_cb_t *cb) {
   int int_rc = 0;
   log_stream_t *stream;
   SaImmHandleT omHandle;
-  SaImmAccessorHandleT accessorHandle;
   SaVersionT immVersion = {'A', 2, 1};
   SaImmSearchHandleT immSearchHandle;
   SaImmSearchParametersT_2 objectSearch;
   SaImmAttrValuesT_2 **attributes;
+  SaImmAttrDefinitionT_2** attr_definitions;
   int wellknownStreamId = 0;
   int appStreamId = 3;
   uint32_t streamId = 0;
@@ -2929,12 +2902,28 @@ SaAisErrorT lgs_imm_init_configStreams(lgs_cb_t *cb) {
     osaf_abort(0);
   }
 
-  om_rc = immutil_saImmOmAccessorInitialize(omHandle, &accessorHandle);
-  if (om_rc != SA_AIS_OK) {
-    LOG_ER("immutil_saImmOmAccessorInitialize failed %s", saf_error(om_rc));
-    osaf_abort(0);
+  // We don't know the IMM model we are working with is the latest model
+  // or the old ones that could not have our addedd new attribute names.
+  // So, we ask helps from `saImmOmClassDescriptionGet_2`.
+  SaImmClassCategoryT category = SA_IMM_CLASS_CONFIG;
+  om_rc = immutil_saImmOmClassDescriptionGet_2(
+      omHandle, const_cast<char*>(className), &category, &attr_definitions);
+  osafassert(om_rc == SA_AIS_OK);
+
+  // Get list of non-pure of `SaLogStreamConfig` class.
+  unsigned ii = 0;
+  SaImmAttrDefinitionT_2* temp;
+  std::vector<char*> list_temp;
+  while ((temp = attr_definitions[ii++]) != nullptr) {
+    if (temp->attrFlags & SA_IMM_ATTR_RUNTIME) continue;
+      list_temp.push_back(temp->attrName);
   }
 
+  ii = 0;
+  char* list_attributes[list_temp.size() + 1];
+  for (auto& item : list_temp) list_attributes[ii++] = item;
+  list_attributes[ii] = nullptr;
+
   /* Search for all objects of class "SaLogStreamConfig". */
   /**
    * Should not base on the attribute name `safLgStrCfg`
@@ -2951,29 +2940,32 @@ SaAisErrorT lgs_imm_init_configStreams(lgs_cb_t *cb) {
    * `safApp=safLogService` might miss configurable app stream eg: app stream
    * with DN `saLgStrCfg=test`
    */
-  if ((om_rc = immutil_saImmOmSearchInitialize_2(
-           omHandle, NULL, SA_IMM_SUBTREE,
-           SA_IMM_SEARCH_ONE_ATTR | SA_IMM_SEARCH_GET_NO_ATTR, &objectSearch,
-           NULL, /* Get no attributes */
-           &immSearchHandle)) == SA_AIS_OK) {
-    while (immutil_saImmOmSearchNext_2(immSearchHandle, &objectName,
-                                       &attributes) == SA_AIS_OK) {
-      /**
-       * With headless mode enabled, when lgsv restarts, there could be other
-       * configurable app streams. It differs from legacy mode in which no app
-       * stream could be exist at startup.
-       *
-       * With well-known streams, stream ID is in reserved numbers [0-2].
-       */
-      SaConstStringT name = osaf_extended_name_borrow(&objectName);
-      streamId =
-          is_well_know_stream(name) ? wellknownStreamId++ : appStreamId++;
-      ais_rc =
-          stream_create_and_configure(name, &stream, streamId, accessorHandle);
-      if (ais_rc != SA_AIS_OK) {
-        LOG_WA("stream_create_and_configure failed %d", ais_rc);
-        goto done;
-      }
+
+  om_rc = immutil_saImmOmSearchInitialize_2(
+      omHandle, NULL, SA_IMM_SUBTREE,
+      SA_IMM_SEARCH_ONE_ATTR | SA_IMM_SEARCH_GET_SOME_ATTR,
+      &objectSearch,
+      list_attributes,
+      &immSearchHandle);
+  osafassert(om_rc == SA_AIS_OK);
+
+  while (immutil_saImmOmSearchNext_2(immSearchHandle, &objectName,
+                                     &attributes) == SA_AIS_OK) {
+    /**
+     * With headless mode enabled, when lgsv restarts, there could be other
+     * configurable app streams. It differs from legacy mode in which no app
+     * stream could be exist at startup.
+     *
+     * With well-known streams, stream ID is in reserved numbers [0-2].
+     */
+    SaConstStringT name = osaf_extended_name_borrow(&objectName);
+    streamId =
+        is_well_know_stream(name) ? wellknownStreamId++ : appStreamId++;
+    ais_rc =
+        stream_create_and_configure(name, streamId, attributes);
+    if (ais_rc != SA_AIS_OK) {
+      LOG_WA("stream_create_and_configure failed %d", ais_rc);
+      goto done;
     }
   }
 
@@ -3022,11 +3014,6 @@ SaAisErrorT lgs_imm_init_configStreams(lgs_cb_t *cb) {
 
 done:
   /* Do not abort if error when finalizing */
-  om_rc = immutil_saImmOmAccessorFinalize(accessorHandle);
-  if (om_rc != SA_AIS_OK) {
-    LOG_NO("%s immutil_saImmOmAccessorFinalize() Fail %d", __FUNCTION__, 
om_rc);
-  }
-
   om_rc = immutil_saImmOmSearchFinalize(immSearchHandle);
   if (om_rc != SA_AIS_OK) {
     LOG_NO("%s immutil_saImmOmSearchFinalize() Fail %d", __FUNCTION__, om_rc);
diff --git a/src/log/logd/lgs_mbcsv.cc b/src/log/logd/lgs_mbcsv.cc
index 175858b..33149de 100644
--- a/src/log/logd/lgs_mbcsv.cc
+++ b/src/log/logd/lgs_mbcsv.cc
@@ -16,9 +16,8 @@
  *
  */
 
+#include "log/logd/lgs_mbcsv.h"
 #include "log/logd/lgs.h"
-#include "base/ncssysf_def.h"
-#include "base/ncssysf_mem.h"
 #include "base/osaf_time.h"
 
 #include "osaf/immutil/immutil.h"
diff --git a/src/log/logd/lgs_mbcsv.h b/src/log/logd/lgs_mbcsv.h
index 30ee47b..e602378 100644
--- a/src/log/logd/lgs_mbcsv.h
+++ b/src/log/logd/lgs_mbcsv.h
@@ -22,6 +22,9 @@
 
 #include <stdint.h>
 #include <saAmf.h>
+#include "log/logd/lgs_cb.h"
+#include "base/ncssysf_def.h"
+#include "base/ncssysf_mem.h"
 
 /* Version 1: Logservice check-point version older versions than OpenSAF 4.4.
  *            Cannot be configured for split filesystem.
diff --git a/src/log/logd/lgs_stream.h b/src/log/logd/lgs_stream.h
index 3c52534..efc39d4 100644
--- a/src/log/logd/lgs_stream.h
+++ b/src/log/logd/lgs_stream.h
@@ -89,6 +89,8 @@ typedef struct log_stream {
   uint32_t stb_curFileSize; /* Bytes written to current log file */
 
   // Hold vector of destname string {"name1", "name2", etc.}
+  // Default value is empty. It MUST be synced with
+  // `saLogRecordDestination` default value.
   std::vector<std::string> dest_names;
   // Hold a list of strings separated by semicolon "name1;name2;etc"
   // This data is used to checkpoint to standby
-- 
1.9.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to