osaf/libs/core/mds/include/mds_core.h |   7 +++--
 osaf/libs/core/mds/mds_c_api.c        |  27 +++++++++++++++++--------
 osaf/libs/core/mds/mds_c_db.c         |  37 +++++++++++++++++++++++++++++-----
 osaf/libs/core/mds/mds_dt_common.c    |   5 ++-
 osaf/libs/core/mds/mds_main.c         |  17 +++++++++++++--
 5 files changed, 70 insertions(+), 23 deletions(-)


The process_info_db needs to be available early before MDS is initialized. So
its initialization is moved to mds_auth_server_create(). The patricia tree
cannot be located in the control block which is dynamically created so it is
now statically allocated.

Create process info upon two events, SVC UP and registration using connected
socket. In case SVC UP comes first, credentials are left empty until socket
registration fills them in.

diff --git a/osaf/libs/core/mds/include/mds_core.h 
b/osaf/libs/core/mds/include/mds_core.h
--- a/osaf/libs/core/mds/include/mds_core.h
+++ b/osaf/libs/core/mds/include/mds_core.h
@@ -288,7 +288,6 @@ typedef struct mds_mcm_cb {
        NCS_PATRICIA_TREE subtn_results;
        NCS_PATRICIA_TREE svc_list;     /* Tree of MDS_SVC_INFO information */
        NCS_PATRICIA_TREE vdest_list;   /* Tree of MDS_VDEST_INFO information */
-       NCS_PATRICIA_TREE process_info_db; /* all known local MDS dests */
 } MDS_MCM_CB;
 
 /* Global MDSCB */
@@ -308,13 +307,15 @@ typedef struct mds_process_info {
        uid_t uid;
        gid_t gid;
        pid_t pid;
-       int count;
+       int count;  // ref count, entry deleted at zero
 } MDS_PROCESS_INFO;
 
 MDS_PROCESS_INFO *mds_process_info_get(MDS_DEST mds_dest);
 int mds_process_info_add(MDS_PROCESS_INFO *info);
 int mds_process_info_del(MDS_PROCESS_INFO *info);
-int mds_process_info_cnt(void);
+int mds_process_info_db_init(void);
+int mds_process_info_enabled(void);
+
 
 /* ******************************************** */
 /* ******************************************** */
diff --git a/osaf/libs/core/mds/mds_c_api.c b/osaf/libs/core/mds/mds_c_api.c
--- a/osaf/libs/core/mds/mds_c_api.c
+++ b/osaf/libs/core/mds/mds_c_api.c
@@ -1601,7 +1601,23 @@ else (entry exists)
        MDS_PROCESS_INFO *info = mds_process_info_get(adest);
        if (info != NULL) {
                info->count++;
-               TRACE("svc %d up cnt:%d, db cnt:%d", svc_id, info->count, 
mds_process_info_cnt());
+               TRACE("svc UP process_info EXIST, svc:%d cnt:%d, adest:%lx",
+                               svc_id, info->count, adest);
+       } else if (mds_process_info_enabled()) {
+               /* If process_info does not exist, create and fill in what we 
have.
+                * Especially count is later needed to garbage collect.
+                */
+               MDS_PROCESS_INFO *info = calloc(1, sizeof(MDS_PROCESS_INFO));
+               osafassert(info);
+               info->mds_dest = adest;
+               info->count = 1;
+               TRACE("svc UP process_info NOTEXIST, svc:%d, adest:%lx", 
svc_id, adest);
+               int rc = mds_process_info_add(info);
+               osafassert(rc == NCSCC_RC_SUCCESS);
+       } else {
+               /* do nothing, this happens in library code or in servers not 
using
+                * the authentication service in MDS. */
+               ;
        }
 
        status = 
mds_svc_tbl_query(m_MDS_GET_PWE_HDL_FROM_SVC_HDL(local_svc_hdl),
@@ -2656,7 +2672,7 @@ else (entry exists)
        MDS_PROCESS_INFO *info = mds_process_info_get(adest);
        if (info != NULL) {
                info->count--;
-               TRACE("svc %d down cnt:%d, db cnt:%d", svc_id, info->count, 
mds_process_info_cnt());
+               TRACE("svc %d DOWN cnt:%d, adest:%lx", svc_id, info->count, 
adest);
                if (info->count == 0) {
                        mds_process_info_del(info);
                        free(info);
@@ -3823,13 +3839,6 @@ uint32_t mds_mcm_init(void)
 
        ncs_patricia_tree_add(&gl_mds_mcm_cb->vdest_list, (NCS_PATRICIA_NODE 
*)vdest_for_adest_node);
 
-       memset(&pat_tree_params, 0, sizeof(pat_tree_params));
-       pat_tree_params.key_size = sizeof(MDS_DEST);
-       if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_init(&gl_mds_mcm_cb->process_info_db, &pat_tree_params)) {
-               m_MDS_LOG_ERR("MCM_API : patricia_tree_init:proc_info :failure, 
L mds_mcm_init");
-               return NCSCC_RC_FAILURE;
-       }
-
        return NCSCC_RC_SUCCESS;
 }
 
diff --git a/osaf/libs/core/mds/mds_c_db.c b/osaf/libs/core/mds/mds_c_db.c
--- a/osaf/libs/core/mds/mds_c_db.c
+++ b/osaf/libs/core/mds/mds_c_db.c
@@ -2331,17 +2331,27 @@ uint32_t mds_subtn_res_tbl_cleanup(void)
        return NCSCC_RC_SUCCESS;
 }
 
+/****************************************************************************/
+/* Process info database, stores mapping between mdsdest and pid
+ * Only used by some services. Tree itself cannot be located in control block
+ * which is dynamically allocated.
+ */
+
+static NCS_PATRICIA_TREE process_info_db; /* all known local MDS dests */
+
 MDS_PROCESS_INFO *mds_process_info_get(MDS_DEST mds_dest)
 {
-       return (MDS_PROCESS_INFO *) 
ncs_patricia_tree_get(&gl_mds_mcm_cb->process_info_db,
-               (uint8_t *)&mds_dest);
+       if (process_info_db.n_nodes > 0)
+               return (MDS_PROCESS_INFO *) 
ncs_patricia_tree_get(&process_info_db,
+                               (uint8_t *)&mds_dest);
+       return NULL;
 }
 
 int mds_process_info_add(MDS_PROCESS_INFO *info)
 {
        TRACE_ENTER2("dest:%lx, pid:%d", info->mds_dest, info->pid);
        info->patnode.key_info = (uint8_t *)&info->mds_dest;
-       int rc = ncs_patricia_tree_add(&gl_mds_mcm_cb->process_info_db,
+       int rc = ncs_patricia_tree_add(&process_info_db,
                   (NCS_PATRICIA_NODE *)&info->patnode);
        return rc;
 }
@@ -2349,14 +2359,29 @@ int mds_process_info_add(MDS_PROCESS_INF
 int mds_process_info_del(MDS_PROCESS_INFO *info)
 {
        TRACE_ENTER2("dest:%lx, pid:%d", info->mds_dest, info->pid);
-       int rc = ncs_patricia_tree_del(&gl_mds_mcm_cb->process_info_db,
+       int rc = ncs_patricia_tree_del(&process_info_db,
                   (NCS_PATRICIA_NODE *)&info->patnode);
        return rc;
 }
 
-int mds_process_info_cnt(void)
+int mds_process_info_db_init(void)
 {
-       return gl_mds_mcm_cb->process_info_db.n_nodes;
+       NCS_PATRICIA_PARAMS pat_tree_params = {0};
+
+       /* locking not needed */
+       pat_tree_params.key_size = sizeof(MDS_DEST);
+       if (NCSCC_RC_SUCCESS != ncs_patricia_tree_init(
+                       &process_info_db, &pat_tree_params)) {
+               syslog(LOG_ERR, "%s: patricia_tree_init failed", __FUNCTION__);
+               return NCSCC_RC_FAILURE;
+       }
+
+       return NCSCC_RC_SUCCESS;
+}
+
+int mds_process_info_enabled(void)
+{
+       return process_info_db.params.key_size > 0;
 }
 
 /*********************************************************
diff --git a/osaf/libs/core/mds/mds_dt_common.c 
b/osaf/libs/core/mds/mds_dt_common.c
--- a/osaf/libs/core/mds/mds_dt_common.c
+++ b/osaf/libs/core/mds/mds_dt_common.c
@@ -270,8 +270,6 @@ uint32_t mdtm_process_recv_message_commo
                abort();
        }
 
-       MDS_PROCESS_INFO *info = mds_process_info_get(adest);
-
        if (MDTM_DIRECT == flag) {
                uint32_t xch_id = 0;
                uint8_t prot_ver = 0;
@@ -429,6 +427,9 @@ uint32_t mdtm_process_recv_message_commo
                reassem_queue->recv.pri = (prot_ver & MDTM_PRI_MASK) + 1;
                reassem_queue->recv.snd_type = msg_snd_type;
                reassem_queue->recv.src_seq_num = svc_seq_num;
+
+               /* fill in credentials (if any) */
+               MDS_PROCESS_INFO *info = mds_process_info_get(adest);
                if (info != NULL) {
                        reassem_queue->recv.pid = info->pid;
                        reassem_queue->recv.uid = info->uid;
diff --git a/osaf/libs/core/mds/mds_main.c b/osaf/libs/core/mds/mds_main.c
--- a/osaf/libs/core/mds/mds_main.c
+++ b/osaf/libs/core/mds/mds_main.c
@@ -153,8 +153,9 @@ static void mds_register_callback(int fd
 
        osaf_mutex_lock_ordie(&gl_mds_library_mutex);
 
-       if (mds_process_info_get(mds_dest) == NULL) {
-               MDS_PROCESS_INFO *info = malloc(sizeof(MDS_PROCESS_INFO));
+       MDS_PROCESS_INFO *info = mds_process_info_get(mds_dest);
+       if (info == NULL) {
+               MDS_PROCESS_INFO *info = calloc(1, sizeof(MDS_PROCESS_INFO));
                osafassert(info);
                info->mds_dest = mds_dest;
                info->uid = creds->uid;
@@ -165,6 +166,10 @@ static void mds_register_callback(int fd
        } else {
                /* this happens in clients that uses both OM and OI */
                TRACE("dest %lx already exist", mds_dest);
+               // just update credentials
+               info->uid = creds->uid;
+               info->pid = creds->pid;
+               info->gid = creds->gid;
        }
 
        osaf_mutex_unlock_ordie(&gl_mds_library_mutex);
@@ -188,8 +193,13 @@ static void mds_register_callback(int fd
  */
 int mds_auth_server_create(const char *name)
 {
+       if (mds_process_info_db_init() != NCSCC_RC_SUCCESS) {
+               syslog(LOG_ERR, "%s: mds_process_info_db_init failed", 
__FUNCTION__);
+               return NCSCC_RC_FAILURE;
+       }
+
        if (osaf_auth_server_create(name, mds_register_callback) != 0) {
-               syslog(LOG_ERR, "MDS_LIB_CREATE: osaf_auth_server_create 
failed");
+               syslog(LOG_ERR, "%s: osaf_auth_server_create failed", 
__FUNCTION__);
                return NCSCC_RC_FAILURE;
        }
 
@@ -233,6 +243,7 @@ int mds_auth_server_connect(const char *
                if (type != MDS_REGISTER_RESP) {
                        TRACE_3("wrong type %d", type);
                        rc = NCSCC_RC_FAILURE;
+                       goto fail;
                }
                int status = ncs_decode_32bit(&p);
                TRACE("received type:%d, status:%d", type, status);

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to