예제 #1
0
uint32_t tet_glnd_testcase_3(SaNameT rscName)
{

  GLSV_GLD_EVT            gld_evt;
  uint32_t                   ret;
  GLND_CB       *glnd_cb=0;
  
  glnd_cb = (GLND_CB *)ncshm_take_hdl(NCS_SERVICE_ID_GLND,gl_glnd_hdl);
  if (!glnd_cb)
  {
    printf(" Unable to retrieve GLND_CB ..\n");
    return NCSCC_RC_FAILURE;
  }

  memset(&gld_evt,0,sizeof(GLSV_GLD_EVT)); 
  gld_evt.evt_type = GLSV_GLD_EVT_RSC_OPEN;

  memcpy(&gld_evt.info.rsc_open_info.rsc_name, \
                &rscName,sizeof(SaNameT));

  ret=glnd_mds_msg_send_gld(glnd_cb,&gld_evt,glnd_cb->gld_mdest_id);
  if ( ret != NCSCC_RC_SUCCESS) {
     printf(" Unable to send GLSV_GLD_EVT_RSC_OPEN message \n");
  }

}
예제 #2
0
/*****************************************************************************
  PROCEDURE NAME : glnd_client_node_del

  DESCRIPTION    : Deletes the client node from the tree.

  ARGUMENTS      :glnd_cb      - ptr to the GLND control block
                  agent_mds_dest   - mds dest id for the agent.
                 

  RETURNS        :NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE

  NOTES         : None
*****************************************************************************/
uns32 glnd_client_node_del(GLND_CB *glnd_cb, GLND_CLIENT_INFO *client_info)
{
	GLND_CLIENT_LIST_RESOURCE *res_list, *tmp_res_list;
	GLND_RESOURCE_INFO *res_info;
	SaLckLockModeT mode;
	GLSV_GLD_EVT gld_evt;
	NCS_BOOL orphan = FALSE;

	/* delete from the tree */
	if (ncs_patricia_tree_del(&glnd_cb->glnd_client_tree, &client_info->patnode) != NCSCC_RC_SUCCESS) {
		m_LOG_GLND_API(GLND_CLIENT_TREE_DEL_FAILED, NCSFL_SEV_ERROR, __FILE__, __LINE__);
		return NCSCC_RC_FAILURE;
	}
	/* free up all the resource requests */
	for (res_list = client_info->res_list; res_list != NULL;) {
		res_info = res_list->rsc_info;
		tmp_res_list = res_list;
		res_list = res_list->next;
		if (res_info) {
			glnd_set_orphan_state(glnd_cb, res_info);
			glnd_client_node_resource_del(glnd_cb, client_info, res_info);
			if (!res_info->lck_master_info.grant_list) {
				/* do the re sync of the grant list */
				glnd_resource_master_lock_resync_grant_list(glnd_cb, res_info);
			}
			if (res_info->lcl_ref_cnt > 0) {

				memset(&gld_evt, 0, sizeof(GLSV_GLD_EVT));

				gld_evt.evt_type = GLSV_GLD_EVT_RSC_CLOSE;
				gld_evt.info.rsc_details.rsc_id = res_info->resource_id;
				gld_evt.info.rsc_details.lcl_ref_cnt = res_info->lcl_ref_cnt;
				glnd_mds_msg_send_gld(glnd_cb, &gld_evt, glnd_cb->gld_mdest_id);

				res_info->lcl_ref_cnt--;
			}

			glnd_restart_resource_info_ckpt_overwrite(glnd_cb, res_info);

			if (tmp_res_list->open_ref_cnt > 1) {
				memset(&gld_evt, 0, sizeof(GLSV_GLD_EVT));

				gld_evt.evt_type = GLSV_GLD_EVT_RSC_CLOSE;
				gld_evt.info.rsc_details.rsc_id = res_info->resource_id;
				gld_evt.info.rsc_details.lcl_ref_cnt = tmp_res_list->open_ref_cnt;
				glnd_mds_msg_send_gld(glnd_cb, &gld_evt, glnd_cb->gld_mdest_id);

			}
			if (res_info->lcl_ref_cnt == 0
			    && glnd_resource_grant_list_orphan_locks(res_info, &mode) == FALSE) {
				glnd_resource_node_destroy(glnd_cb, res_info, orphan);
			}
		}
	}

	/* free up any stale res_requests from this finalized client ... */
	while (glnd_cb->res_req_list != NULL) {
		if (client_info->app_handle_id == glnd_cb->res_req_list->client_handle_id)
			glnd_resource_req_node_del(glnd_cb, glnd_cb->res_req_list->res_req_hdl_id);
	}

	/* free the memory */
	m_MMGR_FREE_GLND_CLIENT_INFO(client_info);

	return NCSCC_RC_SUCCESS;
}