The version used when initializing the API is in many cases stored in a global
variable and this global variable is used every time the API is initialized.
The version is given as a pointer to this variable. The problem is that this
variable is defined as an [in/out] parameter that gives the version to use when
initializing [in] but the value shall be changed by the agent to the highest
version supported by the initialized service [out]. This means that the next
time the API is initialized it may be initialized with a higher version.
This patch help to fix that always initialize OpenSaf API with correct version
in ntf service.
---
src/ntf/ntfd/NtfLogger.cc | 6 ++++--
src/ntf/ntfd/ntfs_clm.c | 11 ++++++++---
src/ntf/ntfimcnd/ntfimcn_imm.c | 8 +++++---
src/ntf/ntfimcnd/ntfimcn_notifier.c | 4 +++-
src/ntf/tools/ntfclient.c | 4 +++-
5 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/src/ntf/ntfd/NtfLogger.cc b/src/ntf/ntfd/NtfLogger.cc
index 84014b578..d1dc48d18 100644
--- a/src/ntf/ntfd/NtfLogger.cc
+++ b/src/ntf/ntfd/NtfLogger.cc
@@ -66,9 +66,9 @@ void saLogWriteLogCallback(SaInvocationT invocation,
SaAisErrorT error);
static SaLogCallbacksT logCallbacks = {NULL, NULL, saLogWriteLogCallback};
-static SaVersionT logVersion = {'A', 2, 1};
static SaLogHandleT logHandle;
static SaLogStreamHandleT alarmStreamHandle;
+const SaVersionT KLogVersion = {'A', 2, 3};
NtfLogger::NtfLogger() : readCounter(0) {
if (SA_AIS_OK != initLog()) {
@@ -247,18 +247,20 @@ SaAisErrorT NtfLogger::initLog() {
SaNameT alarmStreamName;
osaf_extended_name_lend(SA_LOG_STREAM_ALARM, &alarmStreamName);
int first_try = 1;
+ SaVersionT log_version = KLogVersion;
TRACE_ENTER();
/* Initialize the Log service */
do {
- result = saLogInitialize(&logHandle, &logCallbacks, &logVersion);
+ result = saLogInitialize(&logHandle, &logCallbacks, &log_version);
if (SA_AIS_ERR_TRY_AGAIN == result) {
if (first_try) {
LOG_WA("saLogInitialize returns try again, retries...");
first_try = 0;
}
usleep(AIS_TIMEOUT);
+ log_version = KLogVersion;
}
} while (SA_AIS_ERR_TRY_AGAIN == result);
diff --git a/src/ntf/ntfd/ntfs_clm.c b/src/ntf/ntfd/ntfs_clm.c
index 1f63def8f..cd00fa7b4 100644
--- a/src/ntf/ntfd/ntfs_clm.c
+++ b/src/ntf/ntfd/ntfs_clm.c
@@ -18,6 +18,9 @@
#include "ntf/ntfd/ntfs_com.h"
#include "base/osaf_time.h"
+const SaVersionT KClmVersion = {'B', 0x04, 0x01};
+
+
/*
* @brief CLM callback for tracking node membership status.
* Depending upon the membership status (joining/leaving cluster)
@@ -99,7 +102,6 @@ done:
return;
}
-static SaVersionT clmVersion = {'B', 0x04, 0x01};
static const SaClmCallbacksT_4 clm_callbacks = {
0, ntfs_clm_track_cbk /*saClmClusterTrackCallback*/
};
@@ -113,15 +115,18 @@ void *ntfs_clm_init_thread(void *cb)
{
ntfs_cb_t *_ntfs_cb = (ntfs_cb_t *)cb;
SaAisErrorT rc = SA_AIS_OK;
+ SaVersionT clm_version = KClmVersion;
TRACE_ENTER();
- rc = saClmInitialize_4(&_ntfs_cb->clm_hdl, &clm_callbacks, &clmVersion);
+ rc = saClmInitialize_4(&_ntfs_cb->clm_hdl, &clm_callbacks,
+ &clm_version);
while ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT) ||
(rc == SA_AIS_ERR_UNAVAILABLE)) {
osaf_nanosleep(&kHundredMilliseconds);
+ clm_version = KClmVersion;
rc = saClmInitialize_4(&_ntfs_cb->clm_hdl, &clm_callbacks,
- &clmVersion);
+ &clm_version);
}
if (rc != SA_AIS_OK) {
LOG_ER("saClmInitialize failed with error: %d", rc);
diff --git a/src/ntf/ntfimcnd/ntfimcn_imm.c b/src/ntf/ntfimcnd/ntfimcn_imm.c
index de96e3020..a1daf0e16 100644
--- a/src/ntf/ntfimcnd/ntfimcn_imm.c
+++ b/src/ntf/ntfimcnd/ntfimcn_imm.c
@@ -50,7 +50,7 @@ extern ntfimcn_cb_t ntfimcn_cb; /* See ntfimcn_main.c */
* Global, scope file
*/
/* Release code, major version, minor version */
-#define IMM_VERSION {'A', 2, 12}
+static const SaVersionT KImmVersion = {'A', 2, 12};
static const uint64_t sleep_delay_ms = 500;
static const uint64_t max_waiting_time_7s = (7 * 1000); /* 7 sec */
static const uint64_t max_waiting_time_60s = (60 * 1000); /* 60 sec */
@@ -784,7 +784,7 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb)
goto done;
}
cb->immOiHandle = 0;
- SaVersionT imm_version = IMM_VERSION;
+ SaVersionT imm_version = KImmVersion;
rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks,
&imm_version);
while (
@@ -805,6 +805,7 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb)
}
}
cb->immOiHandle = 0;
+ imm_version = KImmVersion;
rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks,
&imm_version);
}
@@ -927,7 +928,7 @@ static bool initializeImmOmHandle(SaImmHandleT*
immOmHandle) {
struct timespec delay_ts;
SaAisErrorT ais_rc;
bool internal_rc = true;
- SaVersionT imm_version = IMM_VERSION;
+ SaVersionT imm_version = KImmVersion;
osaf_millis_to_timespec(sleep_delay_ms, &delay_ts);
osaf_set_millis_timeout(max_waiting_time_60s, &timeout_ts);
@@ -939,6 +940,7 @@ static bool initializeImmOmHandle(SaImmHandleT*
immOmHandle) {
break;
}
osaf_nanosleep(&delay_ts);
+ imm_version = KImmVersion;
}
if (ais_rc != SA_AIS_OK) {
diff --git a/src/ntf/ntfimcnd/ntfimcn_notifier.c
b/src/ntf/ntfimcnd/ntfimcn_notifier.c
index 9aba87cb6..5db059722 100644
--- a/src/ntf/ntfimcnd/ntfimcn_notifier.c
+++ b/src/ntf/ntfimcnd/ntfimcn_notifier.c
@@ -39,7 +39,7 @@
#include "ntfimcn_main.h"
/* Release code, major version, minor version */
-SaVersionT ntf_version = {'A', 0x01, 0x01};
+const SaVersionT KNtfVersion = {'A', 0x01, 0x01};
const unsigned int sleep_delay_ms = 500;
const unsigned int max_waiting_time_ms = 7 * 1000; /* 7 secs */
const unsigned int max_init_waiting_time_ms = 60 * 1000; /* 60 secs */
@@ -60,6 +60,7 @@ int ntfimcn_ntf_init(ntfimcn_cb_t *cb)
{
SaAisErrorT rc;
int internal_rc = 0;
+ SaVersionT ntf_version = KNtfVersion;
TRACE_ENTER();
@@ -86,6 +87,7 @@ int ntfimcn_ntf_init(ntfimcn_cb_t *cb)
}
}
cb->ntf_handle = 0;
+ ntf_version = KNtfVersion;
rc = saNtfInitialize(&cb->ntf_handle, NULL,
&ntf_version);
}
diff --git a/src/ntf/tools/ntfclient.c b/src/ntf/tools/ntfclient.c
index dcc957b7f..472be4bc3 100644
--- a/src/ntf/tools/ntfclient.c
+++ b/src/ntf/tools/ntfclient.c
@@ -1099,11 +1099,13 @@ SaAisErrorT ntftool_saNtfInitialize(SaNtfHandleT
*ntfHandle,
{
int curRetryTime = 0;
SaAisErrorT rc;
+ SaVersionT ntf_version = *version;
do {
- rc = saNtfInitialize(ntfHandle, ntfCallbacks, version);
+ rc = saNtfInitialize(ntfHandle, ntfCallbacks, &ntf_version);
if (rc == SA_AIS_ERR_TRY_AGAIN) {
sleep(gl_apiRetry);
curRetryTime += gl_apiRetry;
+ ntf_version = *version;
} else
break;
} while (curRetryTime < gl_apiTolerance);