osaf/libs/common/immsv/immsv_evt.c         |   12 +-
 osaf/libs/common/immsv/include/immsv_evt.h |   14 ++-
 osaf/services/saf/immsv/README             |   19 ++-
 osaf/services/saf/immsv/immd/immd_evt.c    |  122 ++++++++++++++++++++--------
 osaf/services/saf/immsv/immd/immd_mbcsv.c  |    6 +-
 osaf/services/saf/immsv/immd/immd_sbevt.c  |   43 +++++----
 osaf/services/saf/immsv/immnd/immnd_evt.c  |   11 ++-
 osaf/services/saf/immsv/immnd/immnd_proc.c |   68 +++++++++------
 8 files changed, 194 insertions(+), 101 deletions(-)


The protocol for communicating IMMND file configuration to the active IMMD
and for checkpointing the same from active to standby IMMD has been elaborated
and made safer. In particular, an upgrade from pre 4.4. OpenSAF to OpenSAF 4.4
is now possible.

The file configuration consists of:
(1) The directory for peristent storage,
(2) The xml file to load from if PBE is not enabled or if no PBE file exists,
(3) The pbe file base-name to load from if PBE is enabled.

The IMMNDs also communicate epoch and PBE enabled/disabled state to the IMMD
and the active IMMD checkpoints this to the standby.

diff --git a/osaf/libs/common/immsv/immsv_evt.c 
b/osaf/libs/common/immsv/immsv_evt.c
--- a/osaf/libs/common/immsv/immsv_evt.c
+++ b/osaf/libs/common/immsv/immsv_evt.c
@@ -1534,7 +1534,7 @@ static uint32_t immsv_evt_enc_sublevels(
                                LOG_ER("TOO MANY attribute modifications 
line:%u", __LINE__);
                                return NCSCC_RC_OUT_OF_MEM;
                        }
-               } else if ((i_evt->info.immd.info.ctrl_msg.pbeEnabled == 2) &&
+               } else if ((i_evt->info.immd.info.ctrl_msg.pbeEnabled >= 3) &&
                        (i_evt->info.immd.type == IMMD_EVT_ND2D_INTRO)) { /* 
extended intro */
 
                        IMMSV_OCTET_STRING *os = 
&(i_evt->info.immd.info.ctrl_msg.dir);
@@ -2153,7 +2153,7 @@ static uint32_t immsv_evt_dec_sublevels(
                                immsv_evt_dec_attrmods(i_ub, &p);
                                o_evt->info.immd.info.objModify.attrMods = p;
                        }
-               } else if ((o_evt->info.immd.info.ctrl_msg.pbeEnabled == 2) && 
+               } else if ((o_evt->info.immd.info.ctrl_msg.pbeEnabled >= 3) && 
                        (o_evt->info.immd.type == IMMD_EVT_ND2D_INTRO)) { /* 
extended intro */
 
                        IMMSV_OCTET_STRING *os = 
&(o_evt->info.immd.info.ctrl_msg.dir);
@@ -2853,8 +2853,8 @@ static uint32_t immsv_evt_enc_toplevel(I
                        ncs_encode_8bit(&p8, immdevt->info.ctrl_msg.pbeEnabled);
                        ncs_enc_claim_space(o_ub, 1);
 
-                       if((immdevt->info.ctrl_msg.pbeEnabled == 2) &&
-                               (immdevt->type == IMMD_EVT_ND2D_INTRO)) { /* 
extended */
+                       if((immdevt->info.ctrl_msg.pbeEnabled >= 3) &&
+                               (immdevt->type == IMMD_EVT_ND2D_INTRO)) { /* 
extended intro */
                                IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
                                ncs_encode_32bit(&p8, 
immdevt->info.ctrl_msg.dir.size);
                                ncs_enc_claim_space(o_ub, 4);
@@ -4146,8 +4146,8 @@ static uint32_t immsv_evt_dec_toplevel(N
                        immdevt->info.ctrl_msg.pbeEnabled = 
ncs_decode_8bit(&p8);
                        ncs_dec_skip_space(i_ub, 1);
 
-                       if((immdevt->info.ctrl_msg.pbeEnabled == 2) &&
-                               (immdevt->type == IMMD_EVT_ND2D_INTRO)) { /* 
extended */
+                       if((immdevt->info.ctrl_msg.pbeEnabled >= 3) &&
+                               (immdevt->type == IMMD_EVT_ND2D_INTRO)) { /* 
extended intro */
                                IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
4);
                                immdevt->info.ctrl_msg.dir.size = 
ncs_decode_32bit(&p8);
                                ncs_dec_skip_space(i_ub, 4);
diff --git a/osaf/libs/common/immsv/include/immsv_evt.h 
b/osaf/libs/common/immsv/include/immsv_evt.h
--- a/osaf/libs/common/immsv/include/immsv_evt.h
+++ b/osaf/libs/common/immsv/include/immsv_evt.h
@@ -391,7 +391,9 @@ typedef struct immsv_d2nd_control {
        uint8_t isCoord;
        uint8_t syncStarted;
        SaUint32T nodeEpoch;
-       uint8_t pbeEnabled;
+       uint8_t pbeEnabled;/* See pbeEnabled for immsv_nd2d_control directly 
below.
+                             In general only 0 or 1 would be used D => ND. */
+
        IMMSV_OCTET_STRING dir;
        IMMSV_OCTET_STRING xmlFile;
        IMMSV_OCTET_STRING pbeFile;     
@@ -405,7 +407,15 @@ typedef struct immsv_nd2d_control {
        SaUint32T ndExecPid;
        SaUint32T epoch;
        uint8_t refresh;                //TRUE=> This is a refresh of epoch.
-       uint8_t pbeEnabled;
+       uint8_t pbeEnabled;/* OpenSaf4.4: 
+                             2:not-enabled-not-configured can be convertred to 
0 in immd.
+                             3:not-enabled-configured
+                             4:enabled-configured.
+                             For 4 and 3, file parameters (dir/xmlf/pbef) 
*may* be appended.
+
+                             OpenSaf4.3 and earlier:
+                             0:not-enabled
+                             1: enabled. */
        IMMSV_OCTET_STRING dir;
        IMMSV_OCTET_STRING xmlFile;
        IMMSV_OCTET_STRING pbeFile;
diff --git a/osaf/services/saf/immsv/README b/osaf/services/saf/immsv/README
--- a/osaf/services/saf/immsv/README
+++ b/osaf/services/saf/immsv/README
@@ -379,14 +379,19 @@ To enable this feature the folowing thre
        this is normally linked symbolically to 
'hostfs/repl-opensaf/immsv_store'.
 
        Define IMMSV_PBE_FILE to the file name of the sqlite3 database file,
-       normally 'imm.db'. 
-       Note that IMMSV_LOAD_FILE must still also be defined. Even with PBE
-       enabled, you typically initial start from an imm.xml file.
+       normally 'imm.db'. Note that IMMSV_PBE_FILE must be defined in 
immnd.conf
+       for *all* nodes in the cluster, including payloads, even if they cannot
+       access  the file. The fact that this environment variable is nonempty
+       is what tells all nodes that PBE is configured. 
+
+       Note also that IMMSV_LOAD_FILE must still also be defined. Even with PBE
+       enabled, you typically initial start from an imm.xml file. A restore 
from
+       backup will also typically use an imm.xml file.
 
        Optionally define IMMSV_PBE_TMP_DIR (see immnd.conf). The PBE sometimes
-        needs to regenerate the imm.db file. This is much faster (10 times) if
-        the file is generated in a non replicated file system and then copied
-        to the replicated file system.
+       needs to regenerate the imm.db file. This is much faster (10 times) if
+       the file is generated in a non replicated file system and then copied
+       to the replicated file system.
 
        Initial start the system.
        Ensure that it comes up (that the immsv loads properly from imm.xml).
@@ -407,7 +412,7 @@ To enable this feature the folowing thre
        A 'ps' on the controller where the IMMND coord currently resides 
        should show something like:
 
-        618 root 22320 S N  /usr/local/bin/immdump --daemon --pbe /var/lib/..
+        618 root 22320 S N  /usr/local/bin/immpbed --daemon --pbe /var/lib/..
 
 The PBE feature can at any time be disabled by setting the saImmRepositoryInit
 attribute back to SA_IMM_FROM_FILE (2).
diff --git a/osaf/services/saf/immsv/immd/immd_evt.c 
b/osaf/services/saf/immsv/immd/immd_evt.c
--- a/osaf/services/saf/immsv/immd/immd_evt.c
+++ b/osaf/services/saf/immsv/immd/immd_evt.c
@@ -359,6 +359,9 @@ static void immd_start_sync_ok(IMMD_CB *
 
        mbcp_msg.type = IMMD_A2S_MSG_SYNC_START;
        mbcp_msg.info.ctrl = sync_evt.info.immnd.info.ctrl;
+       mbcp_msg.info.ctrl.pbeEnabled = 
+               (cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:((cb->mDir)?3:2);
+       TRACE("pbeEnabled sent to standby is:%u", 
mbcp_msg.info.ctrl.pbeEnabled);
 
        proc_rc = immd_mbcsv_sync_update(cb, &mbcp_msg);
        if (proc_rc != NCSCC_RC_SUCCESS) {
@@ -404,6 +407,8 @@ static void immd_abort_sync_ok(IMMD_CB *
 
        mbcp_msg.type = IMMD_A2S_MSG_SYNC_ABORT;
        mbcp_msg.info.ctrl = sync_evt.info.immnd.info.ctrl;
+       mbcp_msg.info.ctrl.pbeEnabled = 
+               (cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:((cb->mDir)?3:2);
 
        proc_rc = immd_mbcsv_sync_update(cb, &mbcp_msg);
        if (proc_rc != NCSCC_RC_SUCCESS) {
@@ -478,6 +483,10 @@ static int immd_dump_ok(IMMD_CB *cb, SaU
 
        mbcp_msg.type = IMMD_A2S_MSG_DUMP_OK;
        mbcp_msg.info.ctrl = dump_evt.info.immnd.info.ctrl;
+       mbcp_msg.info.ctrl.pbeEnabled = 
+               (cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:((cb->mDir)?3:2);
+
+       TRACE("pbeEnabled sent to standby is:%u", 
mbcp_msg.info.ctrl.pbeEnabled);
 
        proc_rc = immd_mbcsv_sync_update(cb, &mbcp_msg);
        if (proc_rc != NCSCC_RC_SUCCESS) {
@@ -528,13 +537,9 @@ static void immd_req_sync(IMMD_CB *cb, I
 {
        uint32_t proc_rc = NCSCC_RC_SUCCESS;
        IMMSV_EVT rqsync_evt;
-       IMMD_MBCSV_MSG mbcp_msg;
 
        TRACE_ENTER();
        memset(&rqsync_evt, 0, sizeof(IMMSV_EVT));
-       memset(&mbcp_msg, 0, sizeof(IMMD_MBCSV_MSG));
-
-       /*TODO: Send mbcp message to sby <dest, pid, epoch>? */
 
        rqsync_evt.type = IMMSV_EVT_TYPE_IMMND;
        rqsync_evt.info.immnd.type = IMMND_EVT_D2ND_SYNC_REQ;
@@ -649,8 +654,8 @@ static void immd_accept_node(IMMD_CB *cb
        accept_evt.info.immnd.info.ctrl.ndExecPid = node_info->immnd_execPid;
        accept_evt.info.immnd.info.ctrl.fevsMsgStart = cb->fevsSendCount;
        accept_evt.info.immnd.info.ctrl.nodeEpoch = node_info->epoch;
-       accept_evt.info.immnd.info.ctrl.pbeEnabled = 
-               (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       /* Sending back pbeEnabled from IMMD to IMMNDs not really needed.*/
+       accept_evt.info.immnd.info.ctrl.pbeEnabled = (cb->mRim == 
SA_IMM_KEEP_REPOSITORY);
 
        if (isOnController && (cb->immnd_coord == 0)) {
                LOG_NO("First IMMND on controller found at %x this IMMD at %x."
@@ -668,7 +673,6 @@ static void immd_accept_node(IMMD_CB *cb
        mbcp_msg.type = IMMD_A2S_MSG_INTRO_RSP;  /* Mbcp intro to SBY. */
        mbcp_msg.info.ctrl = accept_evt.info.immnd.info.ctrl;
        if(cb->mPbeFile && !(cb->mFsParamMbcp) && cb->immd_remote_up) { /* Send 
fs params to SBY. */
-               mbcp_msg.info.ctrl.pbeEnabled = 2; /* Extended intro sent only 
once to current SBY */
                cb->mFsParamMbcp = true;
                fsParamMbcp = true;
                mbcp_msg.info.ctrl.dir.size = strlen(cb->mDir)+1;
@@ -678,6 +682,9 @@ static void immd_accept_node(IMMD_CB *cb
                mbcp_msg.info.ctrl.pbeFile.size = strlen(cb->mPbeFile)+1;
                mbcp_msg.info.ctrl.pbeFile.buf = (char *) cb->mPbeFile;
        }
+       /* Sending pbeEnabled from active IMMD to standby IMMD is needed in 
case of fo/so */
+       mbcp_msg.info.ctrl.pbeEnabled = 
(cb->mRim==SA_IMM_KEEP_REPOSITORY)?4:(cb->mPbeFile)?3:2;
+
 
        /*Checkpoint the message to standby director. 
           Syncronous call=>wait for ack */
@@ -784,9 +791,12 @@ static uint32_t immd_evt_proc_immnd_anno
                } else {
                        /* From coord. */
                        SaImmRepositoryInitModeT oldRim = cb->mRim;
-                       cb->mRim = 
(evt->info.ctrl_msg.pbeEnabled)?SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
+
+                       cb->mRim = (evt->info.ctrl_msg.pbeEnabled==4 || 
evt->info.ctrl_msg.pbeEnabled==1)?
+                               SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
                        if(oldRim != cb->mRim) {
-                               LOG_NO("SaImmRepositoryInitModeT noted as 
being: %s", 
+                               LOG_IN("immd_announce_dump: pbeEnabled received 
as %u from IMMND coord", evt->info.ctrl_msg.pbeEnabled);
+                               LOG_NO("ACT: SaImmRepositoryInitModeT changed 
and noted as being: %s", 
                                        (cb->mRim == 
SA_IMM_KEEP_REPOSITORY)?"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
                        }
                }
@@ -1209,7 +1219,7 @@ static uint32_t immd_evt_proc_immnd_req_
                }
 
                if (node_info->isCoord) {
-                       LOG_ER("SERIOUS INCONSISTENCY, current IMMND coord " 
"requests sync!");
+                       LOG_ER("SERIOUS INCONSISTENCY, current IMMND coord 
requests sync!");
                        immd_proc_immd_reset(cb, true);
                        proc_rc = NCSCC_RC_FAILURE;
                } else {
@@ -1306,9 +1316,21 @@ static uint32_t immd_evt_proc_immnd_intr
                        cb->mRulingEpoch = node_info->epoch;
                        LOG_NO("Ruling epoch changed to:%u", cb->mRulingEpoch);
                }
+
+               if (node_info->isCoord) {
+                       if((evt->info.ctrl_msg.pbeEnabled == 4) && (cb->mRim == 
SA_IMM_INIT_FROM_FILE)) {
+                               cb->mRim = SA_IMM_KEEP_REPOSITORY;
+                               LOG_NO("ACT: SaImmRepositoryInitModeT changed 
and noted as being: SA_IMM_KEEP_REPOSITORY");
+                       } else if((evt->info.ctrl_msg.pbeEnabled <= 3) && 
(evt->info.ctrl_msg.pbeEnabled != 1)
+                               && (cb->mRim == SA_IMM_KEEP_REPOSITORY)) {
+                               cb->mRim = SA_IMM_INIT_FROM_FILE;
+                               LOG_NO("ACT: SaImmRepositoryInitModeT changed 
and noted as being: SA_IMM_INIT_FROM_FILE");
+                       }
+               }
+
                immd_accept_node(cb, node_info, false);
                goto done;
-       } 
+       }
 
        /* Determine type of node. */
        if (sinfo->dest == cb->loc_immnd_dest) {
@@ -1331,11 +1353,20 @@ static uint32_t immd_evt_proc_immnd_intr
 
        /* Check for consistent file/dir/pbe configuration. If problem is found
           then node is not accepted and no reply is sent for the intro request
-          from that node. 
+          from that node. But first check if node to be introduced is of older
+          version => upgrade is ingoing, accept the old version node without 
checks.
         */
 
-       if(evt->info.ctrl_msg.pbeEnabled == 2) { /* extended intro */
-               TRACE("Extended intro");
+       if(evt->info.ctrl_msg.pbeEnabled < 2) { /* Node running old pre 4.4 
OpenSAF */
+               LOG_NO("Intro from pre 4.4 node %x", node_info->immnd_key);
+               node_info->pbeConfigured = (evt->info.ctrl_msg.pbeEnabled == 
1); /* dangerous ?*/
+               goto accept_node;
+       } else if(evt->info.ctrl_msg.pbeEnabled == 2) {
+               /* The value 2 means pbe is not configured in an IMMND running 
OpenSAF 4.4 or later. */
+               LOG_IN("4.4 intro pbeEnabled adjusted to be zero for node %x", 
node_info->immnd_key);
+               evt->info.ctrl_msg.pbeEnabled = 0;
+       } else if(evt->info.ctrl_msg.pbeEnabled >= 3) { /* extended intro */
+               LOG_NO("Extended intro from node %x", node_info->immnd_key);
                osafassert(evt->info.ctrl_msg.dir.size > 1); /* xml & dir 
ensured by immnd_initialize() */
                osafassert(evt->info.ctrl_msg.xmlFile.size > 1);
                if(evt->info.ctrl_msg.pbeFile.size > 1) {
@@ -1346,7 +1377,7 @@ static uint32_t immd_evt_proc_immnd_intr
        if(!(node_info->pbeConfigured)) { /* New node does not have pbe 
configured. */
                if(cb->mIs2Pbe) {
                        /* 2PBE configured at IMMD => all nodes *must* have pbe 
file defined. @@@ */
-                       LOG_ER("2PBE is configured in immd.conf, but no Pbe 
file "
+                       LOG_WA("2PBE is configured in immd.conf, but no Pbe 
file "
                                "is configured for node %x - rejecting node", 
node_info->immnd_key);
                        immd_kill_node(cb, node_info);
                        proc_rc = NCSCC_RC_FAILURE;
@@ -1354,9 +1385,7 @@ static uint32_t immd_evt_proc_immnd_intr
                }
 
                if(cb->mPbeFile) {
-                       /* This may need modification for upgrade 4.x -> 4.4.
-                          Any non 4.4 -IMMND that crashes and restarts will 
not get synced. */
-                       LOG_ER("PBE is configured at first attached SC-immnd, 
but no Pbe file "
+                       LOG_WA("PBE is configured at first attached SC-immnd, 
but no Pbe file "
                                "is configured for immnd at node %x - rejecting 
node", node_info->immnd_key);
                        immd_kill_node(cb, node_info);
                        proc_rc = NCSCC_RC_FAILURE;
@@ -1385,7 +1414,7 @@ static uint32_t immd_evt_proc_immnd_intr
                                        cb->mPbeFile, 
evt->info.ctrl_msg.pbeFile.buf);
                        } else {
                                /* Shared filesystem */
-                               LOG_ER("Unacceptable difference in PBE file 
name "
+                               LOG_WA("Unacceptable difference in PBE file 
name "
                                        "between nodes: (%s)!=(%s) - rejecting 
node %x.",
                                        cb->mPbeFile, 
evt->info.ctrl_msg.pbeFile.buf,
                                        node_info->immnd_key);
@@ -1401,7 +1430,7 @@ static uint32_t immd_evt_proc_immnd_intr
                                LOG_WA("Pbe directory name differ on SCs (%s) 
!= (%s)."
                                        "Allowed for 2PBE.", cb->mDir, 
evt->info.ctrl_msg.dir.buf);
                        } else {
-                               LOG_ER("Unacceptable difference in PBE 
directory name "
+                               LOG_WA("Unacceptable difference in PBE 
directory name "
                                        "on shared fs between nodes: (%s)!=(%s) 
- rejecting node %x.",
                                        cb->mDir, evt->info.ctrl_msg.dir.buf,
                                        node_info->immnd_key);
@@ -1418,7 +1447,7 @@ static uint32_t immd_evt_proc_immnd_intr
                                        "Allowed for 2PBE.",
                                        cb->mFile, 
evt->info.ctrl_msg.xmlFile.buf);
                        } else {
-                               LOG_ER("Unacceptable difference in XML file 
name "
+                               LOG_WA("Unacceptable difference in XML file 
name "
                                        "on shared fs between nodes: (%s)!=(%s) 
- rejecting node %x.",
                                        cb->mFile, 
evt->info.ctrl_msg.xmlFile.buf,
                                        node_info->immnd_key);
@@ -1440,20 +1469,10 @@ static uint32_t immd_evt_proc_immnd_intr
                /* First SC IMMND already arrived earlier with PBE *not* 
configured.
                   It would then immediately have been chosen as coord IMMND.
                 */
-               if(evt->info.ctrl_msg.pbeFile.buf) {
-                       LOG_ER("PBE not configured at first attached SC-immnd, 
but Pbe "
-                               "is configured for immnd at %x - rejecting 
node", 
+               if(evt->info.ctrl_msg.pbeFile.buf && 
(evt->info.ctrl_msg.pbeEnabled >= 2)) {
+                       LOG_WA("PBE not configured at first attached SC-immnd, 
but Pbe "
+                               "is configured for immnd at %x - possible 
upgrade from pre 4.4", 
                                node_info->immnd_key);
-                       immd_kill_node(cb, node_info);
-                       proc_rc = NCSCC_RC_FAILURE;
-                       goto done;
-               }
-               goto accept_node;
-       } else if(node_info->isOnController) {
-               /* No IMMND at SC has attached earlier, this is the first one. 
*/
-               LOG_NO("First SC IMMND attached %x", node_info->immnd_key);
-
-               if(evt->info.ctrl_msg.pbeEnabled ==2) {
                        cb->mDir = evt->info.ctrl_msg.dir.buf;
                        evt->info.ctrl_msg.dir.buf = NULL; /*steal*/
                        evt->info.ctrl_msg.dir.size = 0;
@@ -1465,6 +1484,36 @@ static uint32_t immd_evt_proc_immnd_intr
                        cb->mPbeFile = evt->info.ctrl_msg.pbeFile.buf; 
                        evt->info.ctrl_msg.pbeFile.buf = NULL; /*steal*/
                        evt->info.ctrl_msg.pbeFile.size = 0;
+
+                       cb->mRim = (evt->info.ctrl_msg.pbeEnabled > 3)?
+                               SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
+                       LOG_IN("Initial SaImmRepositoryInitModeT noted as 
being: %s", 
+                               (cb->mRim == SA_IMM_KEEP_REPOSITORY)?
+                               
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
+               }
+               goto accept_node;
+       } else if(node_info->isOnController) {
+               /* No IMMND at SC has attached earlier, this is the first one. 
*/
+               LOG_NO("First SC IMMND (OpenSAF 4.4 or later) attached %x", 
node_info->immnd_key);
+
+               if(evt->info.ctrl_msg.pbeEnabled >= 3) {
+                       cb->mDir = evt->info.ctrl_msg.dir.buf;
+                       evt->info.ctrl_msg.dir.buf = NULL; /*steal*/
+                       evt->info.ctrl_msg.dir.size = 0;
+
+                       cb->mFile = evt->info.ctrl_msg.xmlFile.buf;
+                       evt->info.ctrl_msg.xmlFile.buf = NULL; /*steal*/
+                       evt->info.ctrl_msg.xmlFile.size = 0;
+
+                       cb->mPbeFile = evt->info.ctrl_msg.pbeFile.buf; 
+                       evt->info.ctrl_msg.pbeFile.buf = NULL; /*steal*/
+                       evt->info.ctrl_msg.pbeFile.size = 0;
+
+                       cb->mRim = (evt->info.ctrl_msg.pbeEnabled > 3)?
+                               SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
+                       LOG_IN("Initial SaImmRepositoryInitModeT noted as 
being: %s", 
+                               (cb->mRim == SA_IMM_KEEP_REPOSITORY)?
+                               
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
                }
 
                if(cb->mPbeFile == NULL) {
@@ -1487,8 +1536,9 @@ static uint32_t immd_evt_proc_immnd_intr
                                TRACE("Node:%x pid.%u pbeConf:%d", 
other_node_info->immnd_key,
                                        other_node_info->immnd_execPid, 
other_node_info->pbeConfigured);
                                if(other_node_info->immnd_execPid && 
!(other_node_info->pbeConfigured)) {
+                                       /* Must not match file/dir info here 
because of upgrade tolerance. */
                                        osafassert(other_node_info != 
node_info); /* cant be self */
-                                       LOG_ER("PBE is configured at first SC, 
but no Pbe file is "
+                                       LOG_WA("PBE is configured at first SC, 
but no Pbe file is "
                                                "configured for introduced node 
%x - "
                                                "terminating that node", 
other_node_info->immnd_key);
                                        immd_kill_node(cb, other_node_info);
@@ -1508,7 +1558,7 @@ static uint32_t immd_evt_proc_immnd_intr
 
  done:
 
-       if(evt->info.ctrl_msg.pbeEnabled == 2) { /* extended intro */
+       if(evt->info.ctrl_msg.pbeEnabled >= 3) { /* extended intro */
                free(evt->info.ctrl_msg.xmlFile.buf);
                evt->info.ctrl_msg.xmlFile.buf=NULL;
                evt->info.ctrl_msg.xmlFile.size=0;
diff --git a/osaf/services/saf/immsv/immd/immd_mbcsv.c 
b/osaf/services/saf/immsv/immd/immd_mbcsv.c
--- a/osaf/services/saf/immsv/immd/immd_mbcsv.c
+++ b/osaf/services/saf/immsv/immd/immd_mbcsv.c
@@ -566,8 +566,8 @@ static uint32_t mbcsv_enc_async_update(I
                ncs_encode_8bit(&uns8_ptr, immd_msg->info.ctrl.pbeEnabled);
 
                if((arg->info.encode.io_reo_type == IMMD_A2S_MSG_INTRO_RSP)
-                       && (immd_msg->info.ctrl.pbeEnabled==2)) {  /* extended 
intro */
-                       LOG_NO("Encoding Fs params for mbcp to standy immd");
+                       && (immd_msg->info.ctrl.pbeEnabled>=3)) {  /* extended 
intro */
+                       TRACE("Encoding Fs params for mbcp to standy immd");
                        
                        uns32_ptr = 
ncs_enc_reserve_space(&arg->info.encode.io_uba, sizeof(uint32_t));
                        osafassert(uns32_ptr);
@@ -971,7 +971,7 @@ static uint32_t mbcsv_dec_async_update(I
                immd_msg->info.ctrl.pbeEnabled = ncs_decode_8bit(&ptr);
                ncs_dec_skip_space(&arg->info.decode.i_uba, sizeof(uint8_t));
 
-               if((evt_type == IMMD_A2S_MSG_INTRO_RSP) && 
(immd_msg->info.ctrl.pbeEnabled==2)) {
+               if((evt_type == IMMD_A2S_MSG_INTRO_RSP) && 
(immd_msg->info.ctrl.pbeEnabled>=3)) {
                        TRACE("Decoding Fs params for mbcp to standy immd");
 
                        IMMSV_OCTET_STRING *os = &(immd_msg->info.ctrl.dir);
diff --git a/osaf/services/saf/immsv/immd/immd_sbevt.c 
b/osaf/services/saf/immsv/immd/immd_sbevt.c
--- a/osaf/services/saf/immsv/immd/immd_sbevt.c
+++ b/osaf/services/saf/immsv/immd/immd_sbevt.c
@@ -138,9 +138,11 @@ uint32_t immd_process_node_accept(IMMD_C
 
        if (cb->mRulingEpoch < ctrl->rulingEpoch) {
                cb->mRulingEpoch = ctrl->rulingEpoch;
-               LOG_NO("Ruling epoch noted as:%u on IMMD standby", 
cb->mRulingEpoch);
+               LOG_NO("SBY: Ruling epoch noted as:%u", cb->mRulingEpoch);
        }
 
+       if(ctrl->pbeEnabled == 2) {ctrl->pbeEnabled = 0;} 
+
        osafassert(cb->is_immnd_tree_up);
        memset(&key, 0, sizeof(MDS_DEST));
        immd_immnd_info_node_getnext(&cb->immnd_tree, &key, &immnd_info_node);
@@ -168,17 +170,20 @@ uint32_t immd_process_node_accept(IMMD_C
 
                immnd_info_node->isCoord = ctrl->isCoord;
 
-               if (ctrl->isCoord) {
-                       SaImmRepositoryInitModeT oldRim = cb->mRim;
+               if(immnd_info_node->isCoord) {
                        cb->immnd_coord = immnd_info_node->immnd_key;
+                       immnd_info_node->syncStarted = ctrl->syncStarted;
                        LOG_NO("IMMND coord at %x", immnd_info_node->immnd_key);
-                       immnd_info_node->syncStarted = ctrl->syncStarted;
-                       cb->mRim = 
(ctrl->pbeEnabled)?SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
-                       if(cb->mRim != oldRim) {
-                               LOG_NO("SaImmRepositoryInitModeT noted as '%s' 
at IMMD standby",
-                                       (ctrl->pbeEnabled)?
-                                       
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
-                       }                       
+               }
+
+               SaImmRepositoryInitModeT oldRim = cb->mRim;
+               cb->mRim = 
(ctrl->pbeEnabled==4)?SA_IMM_KEEP_REPOSITORY:SA_IMM_INIT_FROM_FILE;
+               if(cb->mRim != oldRim) {
+                       LOG_NO("SBY: SaImmRepositoryInitModeT changed and noted 
as '%s'",
+                               (ctrl->pbeEnabled)?
+                               
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
+               } else {
+                       TRACE("SBY: SaImmRepositoryInitModeT stable as %u 
ctrl->pbeEnabled:%u", oldRim, ctrl->pbeEnabled);
                }
 
                int oldPid = immnd_info_node->immnd_execPid;
@@ -216,28 +221,29 @@ uint32_t immd_process_node_accept(IMMD_C
                LOG_IN("Standby IMMD could not find node with nodeId:%x", 
ctrl->nodeId);
        }
 
-       if(ctrl->pbeEnabled == 2) { /* Extended intro. */
+       if(ctrl->pbeEnabled >= 3) { /* Extended intro. */
                TRACE("Standby receiving FS params: %s %s %s", 
                        ctrl->dir.buf, ctrl->xmlFile.buf, ctrl->pbeFile.buf);
 
-               if(ctrl->dir.size && cb->mDir==NULL) {
+               if(ctrl->dir.size && cb->mDir==NULL && ctrl->canBeCoord) {
+                       TRACE("cb->mDir set to %s in standby", ctrl->dir.buf);
                        cb->mDir = ctrl->dir.buf; /*steal*/
-               } else {
+               } else if(ctrl->dir.size && cb->mDir) {
                        /* Should not get here since fs params sent only once.*/
                        if(strcmp(cb->mDir, ctrl->dir.buf)) {
                                LOG_WA("SBY: Discrepancy on IMM directory: %s 
!= %s",
                                        cb->mDir, ctrl->dir.buf);
                        }
                        free(ctrl->dir.buf);
-
                }
                ctrl->dir.buf=NULL;
                ctrl->dir.size=0;
 
 
-               if(ctrl->xmlFile.size && cb->mFile==NULL) {
+               if(ctrl->xmlFile.size && cb->mFile==NULL && ctrl->canBeCoord) {
+                       TRACE("cb->mFile set to %s in 
standby",ctrl->xmlFile.buf );
                        cb->mFile = ctrl->xmlFile.buf; /*steal*/
-               } else {
+               } else if(ctrl->xmlFile.size && cb->mFile) {
                        /* Should not get here since fs params sent only once.*/
                        if(strcmp(cb->mFile, ctrl->xmlFile.buf)) {
                                LOG_WA("SBY: Discrepancy on IMM XML file: %s != 
%s",
@@ -249,9 +255,10 @@ uint32_t immd_process_node_accept(IMMD_C
                ctrl->xmlFile.size=0;
 
 
-               if(ctrl->pbeFile.size && cb->mPbeFile==NULL) {
+               if(ctrl->pbeFile.size && cb->mPbeFile==NULL && 
ctrl->canBeCoord) {
+                       TRACE("cb->mPbeFile set to %s in standby", 
ctrl->pbeFile.buf);
                        cb->mPbeFile = ctrl->pbeFile.buf; /*steal*/
-               } else {
+               } else if(ctrl->pbeFile.size && cb->mPbeFile) {
                        /* Should not get here since fs params sent only once.*/
                        if(strcmp(cb->mPbeFile, ctrl->pbeFile.buf)) {
                                LOG_WA("SBY: Discrepancy on IMM PBE file: %s != 
%s",
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
@@ -3236,8 +3236,8 @@ static SaAisErrorT immnd_fevs_local_chec
                        send_evt.info.immd.type = 
IMMD_EVT_ND2D_LOADING_COMPLETED;
                        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
                        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-                       send_evt.info.immd.info.ctrl_msg.pbeEnabled =
-                               cb->mPbeFile && (cb->mRim == 
SA_IMM_KEEP_REPOSITORY);
+                       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see 
immsv_d2nd_control in immsv_ev.h*/
+                               (cb->mPbeFile)?((cb->mRim == 
SA_IMM_KEEP_REPOSITORY)?4:3):2; 
 
                        error = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt);
 
@@ -8398,6 +8398,13 @@ static void immnd_evt_proc_admo_finalize
        err = immModel_adminOwnerDelete(cb, evt->info.admFinReq.adm_owner_id, 
0);
 
        if(wasLoading && (immModel_getLoader(cb) == 0)) {
+
+               if (cb->mPbeFile) {/* Pbe configured */
+                       cb->mRim = immModel_getRepositoryInitMode(cb);
+                       TRACE("RepositoryInitMode: %s", 
(cb->mRim==SA_IMM_KEEP_REPOSITORY)?
+                               
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
+               }
+
                TRACE("Adjusting epoch directly after loading has completed");
                immnd_adjustEpoch(cb, SA_TRUE); /* Moved to here from 
immnd_proc.c #1987 */
        }
diff --git a/osaf/services/saf/immsv/immnd/immnd_proc.c 
b/osaf/services/saf/immsv/immnd/immnd_proc.c
--- a/osaf/services/saf/immsv/immnd/immnd_proc.c
+++ b/osaf/services/saf/immsv/immnd/immnd_proc.c
@@ -371,19 +371,26 @@ uint32_t immnd_introduceMe(IMMND_CB *cb)
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
        if(cb->mIntroduced) {
                send_evt.info.immd.info.ctrl_msg.refresh = SA_TRUE;
+               send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see 
immsv_d2nd_control in immsv_ev.h*/
+                       (cb->mPbeFile)?((cb->mRim == 
SA_IMM_KEEP_REPOSITORY)?4:3):2;
+               TRACE("Refresher immnd_introduceMe pbeEnabled:%u NOT with file 
params",
+                       send_evt.info.immd.info.ctrl_msg.pbeEnabled);
+       } else if(cb->mPbeFile) {
+               /* OpenSAF 4.4: First time send dir/file/pbe-file info so that 
IMMD can
+                  verify cluster consistent file setup. Pbe is by default 
disabled.
+                  May turn out to be enabled after loading/sync. 
+                  OpenSAF 4.4 uses an extension of the intro protocol that is 
+                  backwards compatible. By setting msg.pbeEnabled to 2, 3 or 4
+                  an IMMD executing 4.4 is aware of the potential extension 
and will
+                  act on the added info. Old implementaitons simply test on 
pbeEnabled
+                  being zero or non-zero, discarding the trailing file params 
in the message.
+                  OpenSAF 4.4 will not verify file params for nodes 
introducing themselves
+                  using 0/1 for pbeEnabled (i.e. pre 4.4 nodes), to allow 
upgrade to 4.4.
+               */
                send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-                       cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
-       } else if(cb->mPbeFile) {
-               /* First time send dir/file/pbe-file info so that IMMD can
-                  verify cluster consistent file setup. Pbe is tentatively
-                  enabled. May turn out to be disabled after loading.
-                  This uses an extension of the intro protocol that is 
-                  backwards compatible. By setting msg.pbeEnabled to 2
-                  receivers that are aware of the extension will act on
-                  the added info. Old implementaitons simply test on 
-                  pbeEnabled being zero or not.
-               */
-               send_evt.info.immd.info.ctrl_msg.pbeEnabled = 2; 
+                       (cb->mPbeFile)?((cb->mRim == 
SA_IMM_KEEP_REPOSITORY)?4:3):2;
+               TRACE("First immnd_introduceMe, sending pbeEnabled:%u WITH 
params",
+                       send_evt.info.immd.info.ctrl_msg.pbeEnabled);
                send_evt.info.immd.info.ctrl_msg.dir.size = strlen(cb->mDir)+1;
                send_evt.info.immd.info.ctrl_msg.dir.buf = (char *) cb->mDir;
                send_evt.info.immd.info.ctrl_msg.xmlFile.size = 
strlen(cb->mFile)+1;
@@ -396,8 +403,15 @@ uint32_t immnd_introduceMe(IMMND_CB *cb)
                        send_evt.info.immd.info.ctrl_msg.pbeFile.size = 0;
                }
                */
+       } else {
+               send_evt.info.immd.info.ctrl_msg.pbeEnabled = 2; 
+               /* Pbe not configured and then of course can not be enabled */
        }
 
+       TRACE("Possibly extended intro from this IMMND pbeEnabled: %u  
dirsize:%u",
+               send_evt.info.immd.info.ctrl_msg.pbeEnabled,
+               send_evt.info.immd.info.ctrl_msg.dir.size);
+
        if (!immnd_is_immd_up(cb)) {
                return NCSCC_RC_FAILURE;
        }
@@ -470,8 +484,8 @@ static uint32_t immnd_announceLoading(IM
        send_evt.info.immd.type = IMMD_EVT_ND2D_ANNOUNCE_LOADING;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = newEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
 
        if (immnd_is_immd_up(cb)) {
                rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt);
@@ -500,8 +514,8 @@ static uint32_t immnd_requestSync(IMMND_
        send_evt.info.immd.type = IMMD_EVT_ND2D_REQ_SYNC;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
        if (immnd_is_immd_up(cb)) {
                rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt);
        } else {
@@ -519,8 +533,8 @@ void immnd_announceDump(IMMND_CB *cb)
        send_evt.info.immd.type = IMMD_EVT_ND2D_ANNOUNCE_DUMP;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
        if (immnd_is_immd_up(cb)) {
                (void)immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt);
        }
@@ -571,8 +585,8 @@ static uint32_t immnd_announceSync(IMMND
        send_evt.info.immd.type = IMMD_EVT_ND2D_SYNC_START;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = newEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
 
        if (immnd_is_immd_up(cb)) {
                rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt);
@@ -731,8 +745,8 @@ static void immnd_abortLoading(IMMND_CB 
        send_evt.info.immd.type = IMMD_EVT_ND2D_LOADING_FAILED;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
 
        rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, cb->immd_mdest_id, 
&send_evt);
 
@@ -841,8 +855,8 @@ void immnd_abortSync(IMMND_CB *cb)
        send_evt.info.immd.type = IMMD_EVT_ND2D_SYNC_ABORT;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
 
        LOG_NO("Coord broadcasting ABORT_SYNC, epoch:%u", cb->mRulingEpoch);
        rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, cb->immd_mdest_id, 
&send_evt);
@@ -889,8 +903,8 @@ static void immnd_pbePrtoPurgeMutations(
        send_evt.info.immd.type = IMMD_EVT_ND2D_PBE_PRTO_PURGE_MUTATIONS;
        send_evt.info.immd.info.ctrl_msg.ndExecPid = cb->mMyPid;
        send_evt.info.immd.info.ctrl_msg.epoch = cb->mMyEpoch;
-       send_evt.info.immd.info.ctrl_msg.pbeEnabled = 
-               cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY);
+       send_evt.info.immd.info.ctrl_msg.pbeEnabled = /*see immsv_d2nd_control 
in immsv_ev.h*/
+               (cb->mPbeFile)?((cb->mRim == SA_IMM_KEEP_REPOSITORY)?4:3):2;
 
        LOG_NO("Coord broadcasting PBE_PRTO_PURGE_MUTATIONS, epoch:%u", 
cb->mRulingEpoch);
        rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, cb->immd_mdest_id, 
&send_evt);
@@ -1727,7 +1741,7 @@ uint32_t immnd_proc_server(uint32_t *tim
                        cb->mState = IMM_SERVER_READY;
                        cb->mJobStart = now;
                        LOG_NO("SERVER STATE: IMM_SERVER_LOADING_CLIENT --> 
IMM_SERVER_READY");
-                       if (cb->mPbeFile) {/* Pbe enabled */
+                       if (cb->mPbeFile) {/* Pbe configured */
                                cb->mRim = immModel_getRepositoryInitMode(cb);
 
                                TRACE("RepositoryInitMode: %s", 
(cb->mRim==SA_IMM_KEEP_REPOSITORY)?

------------------------------------------------------------------------------
Android is increasing in popularity, but the open development platform that
developers love is also attractive to malware creators. Download this white
paper to learn more about secure code signing practices that can help keep
Android apps secure.
http://pubads.g.doubleclick.net/gampad/clk?id=65839951&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to