osaf/libs/common/glsv/glsv_edu.c | 2 +
osaf/libs/common/glsv/include/glnd_evt.h | 1 +
osaf/libs/common/glsv/include/glnd_res.h | 7 +++--
osaf/services/saf/glsv/glnd/glnd_cb.c | 12 +++++-----
osaf/services/saf/glsv/glnd/glnd_evt.c | 4 ++-
osaf/services/saf/glsv/glnd/glnd_res.c | 34 +++++++++++++++++++++++++++++++-
6 files changed, 49 insertions(+), 11 deletions(-)
Exclusive locks which are held when the master nd reboots can never be
unlocked, and pending exclusive locks which are held when the master nd
reboots can never be given out.
When the master nd reboots and a new master nd is elected, the other nds
which have locks in use resend the lock information to the new master. But,
not all information needed by the new master is sent. "lcl_resource_id" and
"lcl_lockid" are not sent. So, when the new master sends an unlock response
to an nd which was in the middle of unlocking with the old master, the nd
is unable to find the local lock because the master didn't send all the right
data. Same when the new master send a lock response to an nd with a pending
lock.
The solution is in two parts. (1) lcl_lockid was not being put into the
GLSV_LOCK_REQ_INFO message by MDS, even though it was part of the message
structure. This is now done. And (2) add lcl_resource_id to the
GLSV_EVT_GLND_RSC_INFO message so that the new master nd can properly set up
the lock queues.
diff --git a/osaf/libs/common/glsv/glsv_edu.c b/osaf/libs/common/glsv/glsv_edu.c
--- a/osaf/libs/common/glsv/glsv_edu.c
+++ b/osaf/libs/common/glsv/glsv_edu.c
@@ -629,6 +629,7 @@ static uint32_t glsv_edp_glnd_evt_glnd_r
EDU_INST_SET glsv_glnd_create_rules[] = {
{EDU_START, glsv_edp_glnd_evt_glnd_rsc_info, 0, 0, 0,
sizeof(GLSV_EVT_GLND_RSC_INFO), 0, NULL},
{EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
(long)&((GLSV_EVT_GLND_RSC_INFO *)0)->resource_id, 0, NULL},
+ {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
(long)&((GLSV_EVT_GLND_RSC_INFO *)0)->lcl_resource_id, 0, NULL},
{EDU_EXEC, ncs_edp_mds_dest, 0, 0, 0,
(long)&((GLSV_EVT_GLND_RSC_INFO *)0)->glnd_mds_dest, 0, NULL},
{EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
(long)&((GLSV_EVT_GLND_RSC_INFO *)0)->num_requests, 0, NULL},
{EDU_EXEC, glsv_edp_glnd_lock_list_info, EDQ_POINTER, 0, 0,
@@ -998,6 +999,7 @@ static uint32_t glsv_edp_lock_req_info(E
EDU_INST_SET glsv_glnd_create_rules[] = {
{EDU_START, glsv_edp_lock_req_info, 0, 0, 0,
sizeof(GLSV_LOCK_REQ_INFO), 0, NULL},
{EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((GLSV_LOCK_REQ_INFO
*)0)->lockid, 0, NULL},
+ {EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((GLSV_LOCK_REQ_INFO
*)0)->lcl_lockid, 0, NULL},
{EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((GLSV_LOCK_REQ_INFO
*)0)->handleId, 0, NULL},
{EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((GLSV_LOCK_REQ_INFO
*)0)->invocation, 0, NULL},
{EDU_EXEC, ncs_edp_uns32, 0, 0, 0, (long)&((GLSV_LOCK_REQ_INFO
*)0)->lock_type, 0, NULL},
diff --git a/osaf/libs/common/glsv/include/glnd_evt.h
b/osaf/libs/common/glsv/include/glnd_evt.h
--- a/osaf/libs/common/glsv/include/glnd_evt.h
+++ b/osaf/libs/common/glsv/include/glnd_evt.h
@@ -166,6 +166,7 @@ typedef struct glsv_evt_glnd_lck_info_ta
typedef struct glsv_evt_glnd_rsc_info_tag {
/* list of all rsc-lck info */
SaLckResourceIdT resource_id;
+ SaLckResourceIdT lcl_resource_id;
MDS_DEST glnd_mds_dest;
uint32_t num_requests;
GLND_LOCK_LIST_INFO *list_of_req;
diff --git a/osaf/libs/common/glsv/include/glnd_res.h
b/osaf/libs/common/glsv/include/glnd_res.h
--- a/osaf/libs/common/glsv/include/glnd_res.h
+++ b/osaf/libs/common/glsv/include/glnd_res.h
@@ -52,8 +52,7 @@ uint32_t glnd_resource_node_destroy(GLND
GLND_RES_LOCK_LIST_INFO *glnd_resource_grant_lock_req_find(GLND_RESOURCE_INFO
*res_info,
GLSV_LOCK_REQ_INFO res_lock_info,
- MDS_DEST
req_mds_dest,
-
SaLckResourceIdT lcl_resource_id);
+ MDS_DEST
req_mds_dest, SaLckResourceIdT lcl_resource_id);
GLND_RES_LOCK_LIST_INFO
*glnd_resource_pending_lock_req_find(GLND_RESOURCE_INFO *res_info,
GLSV_LOCK_REQ_INFO res_lock_info,
@@ -112,7 +111,9 @@ void glnd_resource_resend_nonmaster_info
void glnd_resource_master_process_resend_lock_req(GLND_CB *glnd_cb,
GLND_RESOURCE_INFO
*res_node,
- GLSV_LOCK_REQ_INFO
lock_info, MDS_DEST req_node_mds_id);
+ GLSV_LOCK_REQ_INFO
lock_info,
+ SaLckResourceIdT
lcl_resource_id,
+ MDS_DEST
req_node_mds_id);
struct glsv_evt_glnd_dd_probe_info_tag; /* forward declaration
required. */
diff --git a/osaf/services/saf/glsv/glnd/glnd_cb.c
b/osaf/services/saf/glsv/glnd/glnd_cb.c
--- a/osaf/services/saf/glsv/glnd/glnd_cb.c
+++ b/osaf/services/saf/glsv/glnd/glnd_cb.c
@@ -364,25 +364,25 @@ void glnd_dump_cb()
TRACE("Grant list : ");
list = res_info->lck_master_info.grant_list;
while (list) {
- TRACE("Lock Id : %d Node Id : %d App Handle
: %d ",
+ TRACE("Lock Id : %d Node Id : %d App Handle
: %d Lcl Resource Id: %u",
(uint32_t)list->lock_info.lockid,
m_NCS_NODE_ID_FROM_MDS_DEST(list->req_mdest_id),
- (uint32_t)list->lock_info.handleId);
+ (uint32_t)list->lock_info.handleId,
list->lcl_resource_id);
list = list->next;
}
TRACE("Wait Ex list : ");
list = res_info->lck_master_info.wait_exclusive_list;
while (list) {
- TRACE("Lock Id : %d Node Id : %d App Handle
: %d ",
+ TRACE("Lock Id : %d Node Id : %d App Handle
: %d Lcl Resource Id: %u",
(uint32_t)list->lock_info.lockid,
m_NCS_NODE_ID_FROM_MDS_DEST(list->req_mdest_id),
- (uint32_t)list->lock_info.handleId);
+ (uint32_t)list->lock_info.handleId,
list->lcl_resource_id);
list = list->next;
}
TRACE("Wait PR list : ");
list = res_info->lck_master_info.wait_read_list;
while (list) {
- TRACE("Lock Id : %d Node Id : %d App Handle
: %d ",
+ TRACE("Lock Id : %d Node Id : %d App Handle
: %d Lcl Resource Id: %u",
(uint32_t)list->lock_info.lockid,
m_NCS_NODE_ID_FROM_MDS_DEST(list->req_mdest_id),
- (uint32_t)list->lock_info.handleId);
+ (uint32_t)list->lock_info.handleId,
list->lcl_resource_id);
list = list->next;
}
} else {
diff --git a/osaf/services/saf/glsv/glnd/glnd_evt.c
b/osaf/services/saf/glsv/glnd/glnd_evt.c
--- a/osaf/services/saf/glsv/glnd/glnd_evt.c
+++ b/osaf/services/saf/glsv/glnd/glnd_evt.c
@@ -2166,7 +2166,9 @@ static uint32_t glnd_process_glnd_send_r
for (lock_list = rsc_info->list_of_req; lock_list != NULL; lock_list =
lock_list->next) {
/* process each lock node info */
glnd_resource_master_process_resend_lock_req(glnd_cb, res_node,
-
lock_list->lock_info, rsc_info->glnd_mds_dest);
+
lock_list->lock_info,
+
rsc_info->lcl_resource_id,
+
rsc_info->glnd_mds_dest);
}
rc = NCSCC_RC_SUCCESS;
diff --git a/osaf/services/saf/glsv/glnd/glnd_res.c
b/osaf/services/saf/glsv/glnd/glnd_res.c
--- a/osaf/services/saf/glsv/glnd/glnd_res.c
+++ b/osaf/services/saf/glsv/glnd/glnd_res.c
@@ -346,14 +346,18 @@ GLND_RES_LOCK_LIST_INFO *glnd_resource_g
MDS_DEST
req_mds_dest, SaLckResourceIdT lcl_resource_id)
{
GLND_RES_LOCK_LIST_INFO *lock_info;
+ TRACE_ENTER();
for (lock_info = res_info->lck_master_info.grant_list; lock_info !=
NULL; lock_info = lock_info->next) {
+ TRACE("handleId: %llu lcl_lockid: %llu lcl_resource_id: %u res
handleId: %llu res lcl_lockid: %llu res lcl_resource_id: %u is local node: %i",
+ lock_info->lock_info.handleId,
lock_info->lock_info.lcl_lockid, lock_info->lcl_resource_id,
res_lock_info.handleId, res_lock_info.lcl_lockid, lcl_resource_id,
m_GLND_IS_LOCAL_NODE(&lock_info->req_mdest_id, &req_mds_dest));
if (lock_info->lock_info.handleId == res_lock_info.handleId &&
lock_info->lock_info.lcl_lockid == res_lock_info.lcl_lockid
&&
lock_info->lcl_resource_id == lcl_resource_id &&
m_GLND_IS_LOCAL_NODE(&lock_info->req_mdest_id,
&req_mds_dest) == 0)
return lock_info;
}
+ TRACE_LEAVE();
return NULL;
}
@@ -460,12 +464,16 @@ GLND_RES_LOCK_LIST_INFO *glnd_resource_l
SaLckHandleT
handleId, SaLckResourceIdT lcl_resource_id)
{
GLND_RES_LOCK_LIST_INFO *lock_info;
+ TRACE_ENTER();
for (lock_info = res_info->lcl_lck_req_info; lock_info != NULL;
lock_info = lock_info->next) {
+ TRACE("handleId: %llu lcl_lockid: %llu lcl_resource_id: %u res
handleId: %llu res lcl_lockid: %llu res lcl_resource_id: %u",
+ lock_info->lock_info.handleId,
lock_info->lock_info.lcl_lockid, lock_info->lcl_resource_id, handleId, lockid,
lcl_resource_id);
if (lock_info->lock_info.handleId == handleId &&
lock_info->lock_info.lcl_lockid == lockid &&
lock_info->lcl_resource_id == lcl_resource_id)
return lock_info;
}
+ TRACE_LEAVE();
return NULL;
}
@@ -1471,7 +1479,13 @@ void glnd_resource_convert_nonmaster_to_
uint32_t remaining_time = 0;
SaTimeT time;
+ TRACE_ENTER();
+
for (lck_list_nm_info = res_node->lcl_lck_req_info; lck_list_nm_info !=
NULL;) {
+ TRACE("lockStatus: %d Lock Id : %d Node Id : %d App Handle
: %d Lcl Resource Id: %u",
+ lck_list_nm_info->lock_info.lockStatus,
+ (uint32_t)lck_list_nm_info->lock_info.lockid,
m_NCS_NODE_ID_FROM_MDS_DEST(lck_list_nm_info->req_mdest_id),
(uint32_t)lck_list_nm_info->lock_info.handleId,
lck_list_nm_info->lcl_resource_id);
+
lck_list_m_info = lck_list_nm_info;
lck_list_nm_info = lck_list_nm_info->next;
@@ -1526,6 +1540,7 @@ void glnd_resource_convert_nonmaster_to_
}
res_node->lcl_lck_req_info = NULL;
+ TRACE_LEAVE();
return;
}
@@ -1546,8 +1561,11 @@ void glnd_resource_resend_nonmaster_info
GLND_RES_LOCK_LIST_INFO *lck_list_nm_info;
GLSV_GLND_EVT glnd_evt;
GLND_LOCK_LIST_INFO *lck_list_info = NULL, *new_list_info = NULL,
*tmp_list = NULL;
+ SaLckResourceIdT lcl_resource_id = 0;
uint32_t count = 0;
+ TRACE_ENTER();
+
for (lck_list_nm_info = res_node->lcl_lck_req_info; lck_list_nm_info !=
NULL;
lck_list_nm_info = lck_list_nm_info->next) {
/* prepare the lock list */
@@ -1556,7 +1574,10 @@ void glnd_resource_resend_nonmaster_info
LOG_CR("GLND lock list alloc failed: Error %s",
strerror(errno));
goto err;
}
+ lcl_resource_id = lck_list_nm_info->lcl_resource_id;
+ TRACE("setting lcl_resource_id: %u", lcl_resource_id);
new_list_info->lock_info = lck_list_nm_info->lock_info;
+ TRACE("lcl_lckid: %llu",
lck_list_nm_info->lock_info.lcl_lockid);
/* add it to the list */
new_list_info->next = lck_list_info;
lck_list_info = new_list_info;
@@ -1566,6 +1587,8 @@ void glnd_resource_resend_nonmaster_info
memset(&glnd_evt, 0, sizeof(GLSV_GLND_EVT));
glnd_evt.type = GLSV_GLND_EVT_SND_RSC_INFO;
glnd_evt.info.node_rsc_info.resource_id = res_node->resource_id;
+ glnd_evt.info.node_rsc_info.lcl_resource_id = lcl_resource_id;
+ TRACE("sending lcl_resource_id: %u", lcl_resource_id);
glnd_evt.info.node_rsc_info.num_requests = count;
glnd_evt.info.node_rsc_info.list_of_req = lck_list_info;
glnd_evt.info.node_rsc_info.glnd_mds_dest = glnd_cb->glnd_mdest_id;
@@ -1578,6 +1601,7 @@ void glnd_resource_resend_nonmaster_info
lck_list_info = lck_list_info->next;
m_MMGR_FREE_GLSV_GLND_LOCK_LIST_INFO(tmp_list,
NCS_SERVICE_ID_GLND);
}
+ TRACE_LEAVE();
return;
err:
while (lck_list_info) {
@@ -1586,6 +1610,7 @@ void glnd_resource_resend_nonmaster_info
m_MMGR_FREE_GLND_LOCK_LIST_INFO(tmp_list);
}
assert(0);
+ TRACE_LEAVE();
return;
}
@@ -1604,7 +1629,9 @@ void glnd_resource_resend_nonmaster_info
*****************************************************************************/
void glnd_resource_master_process_resend_lock_req(GLND_CB *glnd_cb,
GLND_RESOURCE_INFO *res_node,
- GLSV_LOCK_REQ_INFO lock_info,
MDS_DEST req_node_mds_id)
+ GLSV_LOCK_REQ_INFO lock_info,
+ SaLckResourceIdT
lcl_resource_id,
+ MDS_DEST req_node_mds_id)
{
GLND_RES_LOCK_LIST_INFO *lck_list_info;
@@ -1613,6 +1640,8 @@ void glnd_resource_master_process_resend
LOG_CR("GLND Rsc lock list alloc failed: Error %s",
strerror(errno));
assert(0);
}
+ TRACE_ENTER();
+
memset(lck_list_info, 0, sizeof(GLND_RES_LOCK_LIST_INFO));
lck_list_info->lck_info_hdl_id =
@@ -1620,6 +1649,8 @@ void glnd_resource_master_process_resend
lck_list_info->lock_info = lock_info;
lck_list_info->req_mdest_id = req_node_mds_id;
lck_list_info->res_info = res_node;
+ lck_list_info->lcl_resource_id = lcl_resource_id;
+ TRACE("lck_list_info->lcl_resource_id: %u", lcl_resource_id);
/* check to see the status of the lock */
if (lock_info.lockStatus == SA_LCK_LOCK_GRANTED) {
@@ -1642,6 +1673,7 @@ void glnd_resource_master_process_resend
res_node->lck_master_info.wait_read_list->prev =
lck_list_info;
res_node->lck_master_info.wait_read_list = lck_list_info;
}
+ TRACE_LEAVE();
return;
}
------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel