ACK.

Fabio

On 03/01/2012 12:53 AM, Lon Hohberger wrote:
> [This patch is already in RHEL5]
> 
> If you add a service to rgmanager v1 or v2 and that
> service fails to start on the first node but succeeds
> in its initial stop operation, there is a chance that
> the remote instance of rgmanager has not yet reread
> the configuration, causing the service to be placed
> into the 'recovering' state without further action.
> 
> This patch causes the originator of the request to
> retry the operation.
> 
> Later versions of rgmanager (ex STABLE3 branch and
> derivatives) are unlikely to have this problem since
> configuration updates are not polled, but rather
> delivered to clients.
> 
> Update 22-Feb-2012: The above is incorrect, this was
> reproduced a rgmanager v3 installation.
> 
> Resolves: rhbz#796272
> 
> Signed-off-by: Lon Hohberger <l...@redhat.com>
> ---
>  rgmanager/src/daemons/rg_state.c |   19 +++++++++++++++++++
>  1 files changed, 19 insertions(+), 0 deletions(-)
> 
> diff --git a/rgmanager/src/daemons/rg_state.c 
> b/rgmanager/src/daemons/rg_state.c
> index 23a4bec..8c5af5b 100644
> --- a/rgmanager/src/daemons/rg_state.c
> +++ b/rgmanager/src/daemons/rg_state.c
> @@ -1801,6 +1801,7 @@ handle_relocate_req(char *svcName, int orig_request, 
> int preferred_target,
>       rg_state_t svcStatus;
>       int target = preferred_target, me = my_id();
>       int ret, x, request = orig_request;
> +     int retries;
>       
>       get_rg_state_local(svcName, &svcStatus);
>       if (svcStatus.rs_state == RG_STATE_DISABLED ||
> @@ -1933,6 +1934,8 @@ handle_relocate_req(char *svcName, int orig_request, 
> int preferred_target,
>               if (target == me)
>                       goto exhausted;
>  
> +             retries = 0;
> +retry:
>               ret = svc_start_remote(svcName, request, target);
>               switch (ret) {
>               case RG_ERUN:
> @@ -1942,6 +1945,22 @@ handle_relocate_req(char *svcName, int orig_request, 
> int preferred_target,
>                       *new_owner = svcStatus.rs_owner;
>                       free_member_list(allowed_nodes);
>                       return 0;
> +             case RG_ENOSERVICE:
> +                     /*
> +                      * Configuration update pending on remote node?  Give it
> +                      * a few seconds to sync up.  rhbz#568126
> +                      *
> +                      * Configuration updates are synchronized in later 
> releases
> +                      * of rgmanager; this should not be needed.
> +                      */
> +                     if (retries++ < 4) {
> +                             sleep(3);
> +                             goto retry;
> +                     }
> +                     logt_print(LOG_WARNING, "Member #%d has a different "
> +                                "configuration than I do; trying next "
> +                                "member.", target);
> +                     /* Deliberate */
>               case RG_EDEPEND:
>               case RG_EFAIL:
>                       /* Uh oh - we failed to relocate to this node.

Reply via email to