Hi,
The logic worked. Test case is added to ESB. Thanks for all the help.
AndubSLG
On Aug 30, 2012 11:22 AM, "Andun Sameera" <[email protected]> wrote:

> Hi Hiranya,
>
> Thanks for looking in to this. I don't understand a way to Assert to check 
> takes
> >= 3 errors. So after discussing with Miyuru I thought a another
> alternative.
>
>    - Specify Non Retry codes for all error codes expect 101504
>    - Generate a 101505
>    - So client will timeout without getting a response and we can assert
>    that.
>    - Then generate a 101504, so failover will eecuted and reply will come
>    from second endpoint and we can assert that.
>
> I will try this logic and let you know.
>
> Thanks
> AndunSLG
>
>
>
> On Thu, Aug 30, 2012 at 10:51 AM, Hiranya Jayathilaka <
> [email protected]> wrote:
>
>>
>>
>> On Thu, Aug 30, 2012 at 8:45 AM, Andun Sameera <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> I have tried int the way which Dushan explained. So I have change my
>>> proxy config like this,
>>>
>>> <proxy name="failoverEndPoint_Specific_Errors"
>>>           transports="http https"
>>>           startOnLoad="true">
>>>       <target>
>>>          <inSequence>
>>>             <send>
>>>                <endpoint>
>>>                   <failover>
>>>                      <endpoint name="9001 Server">
>>>                         <address uri="
>>> http://localhost:9001/services/LBService1";>
>>>                            <timeout>
>>>                               <duration>2000</duration>
>>>                            </timeout>
>>>                            <suspendOnFailure>
>>>                               <initialDuration>60000</initialDuration>
>>>                               <progressionFactor>2.0</progressionFactor>
>>>                            </suspendOnFailure>
>>>                            <markForSuspension>
>>>
>>> <errorCodes>101000,101500,101501,101503,101505,101506,101507,101509</errorCodes>
>>>
>>> <retriesBeforeSuspension>3</retriesBeforeSuspension>
>>>                            </markForSuspension>
>>>                          </address>
>>>                      </endpoint>
>>>                      <endpoint name="9002 Server">
>>>                         <address uri="
>>> http://localhost:9002/services/LBService1"/>
>>>                       </endpoint>
>>>                   </failover>
>>>                </endpoint>
>>>             </send>
>>>          </inSequence>
>>>          <outSequence>
>>>             <send/>
>>>          </outSequence>
>>>       </target>
>>>    </proxy>
>>>
>>> Here the endpoint "9001 Server" is marked for suspension for all the
>>> error codes but the 101504. Target of doing that is to verify that the
>>> endpoint will go to suspend state only if 101504 happens. But my argument
>>> is wrong.
>>> Because Let say if I generate 101505, then  "9001 Server" will be
>>> timeout. But Failover will retry same "9001 Server" for three times again.
>>> Because it is marked as timeout and eligible for send a message. After
>>> three retires "9001 Server" will be suspended. So my argument of "The
>>> endpoint will go to suspend state only if 101504 happens" is wrong.
>>>
>>
>> Why don't you alter you test? If it fails immediately, then you know it's
>> due to a 101504 immediate suspension. If it takes >= 3 errors to fail then
>> it's some other error.
>>
>> Thanks,
>> Hiranya
>>
>>
>>>
>>> So Is there a way to verify that the failover logic is working fine for
>>> specific error codes?
>>>
>>> Thanks
>>> AndunSLG
>>>
>>>
>>> On Wed, Aug 29, 2012 at 10:14 PM, Dushan Abeyruwan <[email protected]>wrote:
>>>
>>>> Hi
>>>>
>>>>  AFAIU, the failover logic is working as follows, In your endpoint if
>>>> its defines as
>>>>                                     <timeout>
>>>>                                         <duration>2000</duration>
>>>>                                     </timeout>
>>>>
>>>>                                     <markForSuspension>
>>>>
>>>> <errorCodes>101504,101508</errorCodes>
>>>>
>>>> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>>>>                                         <retryDelay>0</retryDelay>
>>>>                                     </markForSuspension>
>>>>
>>>>             based on 101504,101508 errocodes always the endpoint will
>>>> get marked as TIMEOUT and it wont try  and IF the endpoints are failover
>>>> then the FAILOVER will be invoked the next NONSUSPENDED endpoint.. actually
>>>> the point you need to Note that the FAILOVER will be working only
>>>> for 101504,101508,(according to your current configuration) so In your case
>>>> let say need to invoke next NONSUSPNEDED endpoint when CONNECTION CLOSED.(
>>>> *101505)*. then you should include that in MarkForSuspence, so please
>>>> try with following
>>>>
>>>>                                 <markForSuspension>
>>>>                                         <errorCodes>101504,101508,*
>>>> 101505*</errorCodes>
>>>>
>>>> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>>>>                                         <retryDelay>0</retryDelay>
>>>>                                     </markForSuspension>
>>>>
>>>>          so what will happen now the IF BE is closed then the EP will
>>>> be marked as TIMEOUT for 101504,101508,*101505 then as I
>>>> explained earlier it will invoke next active NONSUSPNEDED endpoint,*
>>>> *                    *
>>>> *   *        Persoally i havent try this out but if looking
>>>> http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling
>>>> the logic is clearly explained please give more attention to
>>>> the highlighted text
>>>>
>>>> e.g
>>>>
>>>> <endpoint name="SampleFailover">
>>>>     <failover>
>>>>         <endpoint name="Sample_First" statistics="enable" >
>>>>             <address uri="http://localhost/myendpoint"; statistics="enable" 
>>>> trace="disable">
>>>>                 <timeout>
>>>>                     <duration>60000</duration>
>>>>                 </timeout>
>>>>
>>>>                 <markForSuspension>
>>>>                     <errorCodes>101504, 101505, 101500</errorCodes>
>>>>                     <retriesBeforeSuspension>3</retriesBeforeSuspension>
>>>>                     <retryDelay>1</retryDelay>
>>>>                 </markForSuspension>
>>>>
>>>>                 <suspendOnFailure>
>>>>                     <initialDuration>1000</initialDuration>
>>>>                     <progressionFactor>2</progressionFactor>
>>>>                     <maximumDuration>64000</maximumDuration>
>>>>                 </suspendOnFailure>
>>>>
>>>>             </address>
>>>>         </endpoint>
>>>>     </failover>
>>>> </endpoint>
>>>>
>>>>
>>>> "Here the Sample_First endpoint is marked as *TIMEOUT if a connection runs 
>>>> out of time, a connection close or sends IO errors. For all the other 
>>>> errors*, it will be marked as suspended. *When this error occurs the fail 
>>>> over will retry using the first non SUSPENDED endpoint.* In this case, it 
>>>> is the same endpoint (Sample_First). It will retry until the retry count 
>>>> becomes 0. The retry happens in parrellel. Since messages do come to this 
>>>> endpoint using many threads, the same message may not be retired 3 times. 
>>>> Another message may fail and can reduce the retry count. So it is 
>>>> important to note that the retry count is not a per message based setting, 
>>>> it is a per endpoint based setting."
>>>>
>>>>
>>>>
>>>> cheers
>>>> Dushan
>>>>
>>>>
>>>>
>>>> On Wed, Aug 29, 2012 at 7:57 PM, Andun Sameera <[email protected]> wrote:
>>>>
>>>>> Hi All,
>>>>>
>>>>> I am trying to check the functionality of the Fail Over Endpoint. I
>>>>> want to verify that the failover logic is happening to specific error
>>>>> codes. I used  proxy given below for that,
>>>>>
>>>>> According to 
>>>>> [1]<http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling>,
>>>>> error code 101504,101508 for timeouts. So I used following test case
>>>>> to produce the scenario,
>>>>>
>>>>> My logic was this,
>>>>>
>>>>>    1. Send a request to proxy to check it is functioning.
>>>>>    2. Shutdown http://localhost:9001 server.
>>>>>    3. Then send Send a request to proxy again. So the first endpoint
>>>>>    should be failed. But it cant be suspend. Because it is only 
>>>>> suspending for
>>>>>    timeouts.
>>>>>    4. Response should come from second server.
>>>>>    5. Then Start the http://localhost:9001 server.
>>>>>    6. Then send Send a request to proxy again. Response should come
>>>>>    from server1. Because it is not suspended.( I am trying this with in 
>>>>> the
>>>>>    suspend time period of 9001-server endpoint, so if is suspended, 
>>>>> response
>>>>>    should come from server2)
>>>>>
>>>>> But when I tried this, in the 3rd step of the logic
>>>>> (Red Highlighted line of the code) it fails. The endpoint is suspending 
>>>>> for
>>>>> connection refused created by shutting down the server. According to spec
>>>>> it cant be. Is this a bug or am I doing something wrong here? Please look
>>>>> at this ASAP we need this to wind up Test Automation Hackathon tomorrow.
>>>>>
>>>>> Thanks
>>>>> AndunSLG
>>>>>
>>>>> [1] -
>>>>> http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling
>>>>>
>>>>> Proxy Service :
>>>>>
>>>>> <proxy name="failoverEndPoint_Specific_Errors" transports="http,https">
>>>>>         <target>
>>>>>             <inSequence>
>>>>>                 <send>
>>>>>                     <endpoint>
>>>>>                         <failover>
>>>>>                             <endpoint name="9001 Server">
>>>>>                                 <address uri="
>>>>> http://localhost:9001/services/LBService1";>
>>>>>                                     <timeout>
>>>>>                                         <duration>2000</duration>
>>>>>                                     </timeout>
>>>>>
>>>>>                                     <markForSuspension>
>>>>>
>>>>> <errorCodes>101504,101508</errorCodes>
>>>>>
>>>>> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>>>>>                                         <retryDelay>0</retryDelay>
>>>>>                                     </markForSuspension>
>>>>>
>>>>>                                     <suspendOnFailure>
>>>>>
>>>>> <initialDuration>60000</initialDuration>
>>>>>
>>>>> <progressionFactor>2</progressionFactor>
>>>>>                                     </suspendOnFailure>
>>>>>                                 </address>
>>>>>                             </endpoint>
>>>>>                             <endpoint name="9002 Server">
>>>>>                                 <address uri="
>>>>> http://localhost:9002/services/LBService1";>
>>>>>                                     <timeout>
>>>>>                                         <duration>2000</duration>
>>>>>                                     </timeout>
>>>>>
>>>>>                                     <markForSuspension>
>>>>>                                         <errorCodes>101509</errorCodes>
>>>>>
>>>>> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>>>>>                                         <retryDelay>0</retryDelay>
>>>>>                                     </markForSuspension>
>>>>>
>>>>>                                     <suspendOnFailure>
>>>>>
>>>>> <initialDuration>60000</initialDuration>
>>>>>
>>>>> <progressionFactor>2</progressionFactor>
>>>>>                                     </suspendOnFailure>
>>>>>                                 </address>
>>>>>                             </endpoint>
>>>>>                         </failover>
>>>>>                     </endpoint>
>>>>>                 </send>
>>>>>             </inSequence>
>>>>>             <outSequence>
>>>>>                 <send/>
>>>>>             </outSequence>
>>>>>         </target>
>>>>>     </proxy>
>>>>>
>>>>> Test Case :
>>>>>
>>>>> @Test(groups = "wso2.esb", description = "Test sending request to Fail
>>>>> Over Endpoint which Suspend Endpoints to Specific Errors")
>>>>>     public void testSendingFailOverEndpoint_With_Specific_Errors()
>>>>> throws IOException, InterruptedException {
>>>>>         //Check the fail over endpoint is functioning well
>>>>>         String response =
>>>>> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>>>>>                 null);
>>>>>         Assert.assertNotNull(response);
>>>>>         Assert.assertTrue(response.toString().contains("Response from
>>>>> server: Server_1"));
>>>>>
>>>>>         //Stop one server to generate a failure in one endpoint
>>>>>         //But the suspend cant be triggered here. because suspend the
>>>>> endpoint happen only for Timeouts 101504,101508
>>>>>         axis2Server1.stop();
>>>>>
>>>>>         response =
>>>>> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>>>>>                 null);
>>>>>         Assert.assertNotNull(response);
>>>>>         Assert.assertTrue(response.toString().contains("Response from
>>>>> server: Server_2"));
>>>>>
>>>>>         axis2Server1.start();
>>>>>
>>>>>         int counter=0;
>>>>>         while(!AxisServiceClientUtils.isServiceAvailable("
>>>>> http://localhost:9001/services/LBService1";)) {
>>>>>             if(counter>100){
>>>>>                 break;
>>>>>             }
>>>>>             counter++;
>>>>>         }
>>>>>
>>>>>         if(counter>100){
>>>>>             throw new AssertionError("Axis2 Server didn't started with
>>>>> in expected time period.") ;
>>>>>         }
>>>>>         else{
>>>>>             //Checaxiaxis2Server1.start()s2Server1.stop()k that the
>>>>> endpoint one is not suspended.
>>>>>             //If reply comes that means not suspended.
>>>>>             //Because suspend duration of the endpoint is 20 seconds.
>>>>> So reply cant come in this time.
>>>>>             response =
>>>>> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>>>>>                     null);
>>>>>             Assert.assertNotNull(response);
>>>>>             Assert.assertTrue(response.toString().contains("Response
>>>>> from server: Server_1"));
>>>>>
>>>>>             //Invoke a web service method which will invoke a time out
>>>>> and cause the endpoint to suspend.
>>>>>             response =
>>>>> lbClient.sendSleepRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),"4000");
>>>>>             Assert.assertNotNull(response);
>>>>>             Assert.assertTrue(response.toString().contains("Response
>>>>> from server: Server_2"));
>>>>>
>>>>>             //Invoke a web service method which will invoke a time out
>>>>> and cause the endpoint to suspend.
>>>>>             response =
>>>>> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>>>>>                     null);
>>>>>             Assert.assertNotNull(response);
>>>>>             Assert.assertTrue(response.toString().contains("Response
>>>>> from server: Server_2"));
>>>>>
>>>>>         }
>>>>>     }
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Dushan Abeyruwan
>>>> *Senior Software Engineer*
>>>> *Integration Technologies Team*
>>>> *WSO2 Inc. http://wso2.com/*
>>>> *Mobile:(+94)714408632*
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> [email protected]
>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>
>>>
>>
>>
>> --
>> Hiranya Jayathilaka
>> Associate Technical Lead;
>> WSO2 Inc.;  http://wso2.org
>> E-mail: [email protected];  Mobile: +94 77 633 3491
>> Blog: http://techfeast-hiranya.blogspot.com
>>
>
>
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to