This is explained in the commit message of the changeset.
The function  immnd_evt_proc_rt_object_create is a fevs receiver function,
i.e. The message is received from the IMMD not the originating client which
is only local to one of the IMMNDs receiving the message. 

But that rt-object-create, that you are worried about, initially arrives from
the client (AMFD in this case) as an invoke of immnd_evt_proc_fevs_forward at
the local IMMND. And if you look into the code, it already catches the missing
Client case and handles it correctly.

But should the client node dissapear at the local IMMND after 
immnd_evt_proc_fevs_forward
has been successfully processed (the client node existed at the local IMMND at 
that time,
But dissapeared after the fevs message was forwarded to the IMMD) then when the 
fevs message
(the rt-object-create in this case) arrives back to the IMMNDs, including the 
originating
IMMND, then that IMMND can not send any BAD_HANDLE to the client if the client 
node is gone,
Because that cliend-node was the only heap structure available having the 
clients respose
address. 


/AndersBj

-----Original Message-----
From: Hans Feldt 
Sent: den 27 november 2013 15:53
To: Anders Björnerstedt; reddy.neelaka...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: RE: [PATCH 1 of 1] IMMND replies BAD_HANDLE if client node is missing 
for non fevs request [#637]

Hi,

A question, I can see the log message " Client %llu went down so no response " 
in many places in immnd. The patch only changes four locations. What about for 
example immnd_evt_proc_rt_object_create?

Thanks,
Hans 

> -----Original Message-----
> From: Anders Björnerstedt
> Sent: den 27 november 2013 15:06
> To: reddy.neelaka...@oracle.com; Hans Feldt
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: [PATCH 1 of 1] IMMND replies BAD_HANDLE if client node is 
> missing for non fevs request [#637]
> 
>  osaf/services/saf/immsv/immnd/immnd_evt.c |  22 
> ++++++++++++----------
>  1 files changed, 12 insertions(+), 10 deletions(-)
> 
> 
> For non fevs requests, if the local IMMND can not find the client node 
> corresponding to the imm-handle sent by the client, then the local 
> IMMND replies directly with SA_AIS_ERR_BAD_HANDLE, instead of just 
> dropping the request and causing client to timeout.
> 
> This short circuited behavior is not possible for fevs requests, 
> because such requests are forwarded to the IMMD and broadcast back to 
> all IMMNDs including the originating node. The originating node's 
> IMMND then no longer has the reply information on the stack. It 
> expects to find it in the client node on the heap. If the client node 
> does not exist, then no reply, not even ERR_BAD_HANDLE, can be sent to the 
> client of that fevs request.
> 
> 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
> @@ -1913,8 +1913,9 @@ static uint32_t immnd_evt_proc_admowner_
>       client_hdl = evt->info.adminitReq.client_hdl;
>       immnd_client_node_get(cb, client_hdl, &cl_node);
>       if (cl_node == NULL || cl_node->mIsStale) {
> -             LOG_WA("IMMND - Client %llu went down so no response", 
> client_hdl);
> -             return rc;
> +             LOG_WA("ERR_BAD_HANDLE: Client not found in server");
> +             send_evt.info.imma.info.admInitRsp.error = 
> SA_AIS_ERR_BAD_HANDLE;
> +             goto agent_rsp;
>       }
> 
>       if (!immnd_is_immd_up(cb)) {
> @@ -2018,8 +2019,9 @@ static uint32_t immnd_evt_proc_impl_set(
>       client_hdl = evt->info.implSet.client_hdl;
>       immnd_client_node_get(cb, client_hdl, &cl_node);
>       if (cl_node == NULL || cl_node->mIsStale) {
> -             LOG_WA("IMMND - Client went down so no response");
> -             return rc;
> +             LOG_WA("ERR_BAD_HANDLE: Client not found in server");
> +             send_evt.info.imma.info.implSetRsp.error = 
> SA_AIS_ERR_BAD_HANDLE;
> +             goto agent_rsp;
>       }
> 
>       if (!immnd_is_immd_up(cb)) {
> @@ -2141,9 +2143,9 @@ static uint32_t immnd_evt_proc_ccb_init(
>       client_hdl = evt->info.ccbinitReq.client_hdl;
>       immnd_client_node_get(cb, client_hdl, &cl_node);
>       if (cl_node == NULL || cl_node->mIsStale) {
> -             LOG_WA("IMMND - Client went down so no response");
> -             TRACE_LEAVE();
> -             return rc;
> +             LOG_WA("ERR_BAD_HANDLE: Client not found in server");
> +             send_evt.info.imma.info.ccbInitRsp.error = 
> SA_AIS_ERR_BAD_HANDLE;
> +             goto agent_rsp;
>       }
> 
>       if (!immnd_is_immd_up(cb)) {
> @@ -2256,9 +2258,9 @@ static uint32_t immnd_evt_proc_rt_update
>       client_hdl = evt->info.objModify.immHandle;
>       immnd_client_node_get(cb, client_hdl, &cl_node);
>       if (cl_node == NULL || cl_node->mIsStale) {
> -             LOG_WA("IMMND - Client went down so no response");
> -             TRACE_LEAVE();
> -             return rc;
> +             LOG_WA("ERR_BAD_HANDLE: Client not found in server");
> +             err = SA_AIS_ERR_BAD_HANDLE;
> +             goto agent_rsp;
>       }
> 
>       /* Do broadcast checks BEFORE updating model because we dont want

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to