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
<hiranya...@gmail.com>wrote:

>
>
> On Thu, Aug 30, 2012 at 8:45 AM, Andun Sameera <an...@wso2.com> 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 <dus...@wso2.com>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 <an...@wso2.com> 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
>> Dev@wso2.org
>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>
>>
>
>
> --
> Hiranya Jayathilaka
> Associate Technical Lead;
> WSO2 Inc.;  http://wso2.org
> E-mail: hira...@wso2.com;  Mobile: +94 77 633 3491
> Blog: http://techfeast-hiranya.blogspot.com
>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to