You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@bookkeeper.apache.org by "Sijie Guo (Commented) (JIRA)" <ji...@apache.org> on 2011/10/02 14:26:34 UTC

[jira] [Commented] (BOOKKEEPER-69) ServerRedirectLoopException when a machine (hosts bookie server & hub server) reboot, which is caused by race condition of topic manager

    [ https://issues.apache.org/jira/browse/BOOKKEEPER-69?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13118999#comment-13118999 ] 

Sijie Guo commented on BOOKKEEPER-69:
-------------------------------------

A detailed proposal:


1) introduce TopicStatus to record the status change of topic during topic acquisition/releasing.
{quote}
/** Acquire Topic with shouldClaim == true **/
CLAIMING,
CLAIMING_ENQUEUE_CALLBACK,
CLAIMING_GET_ENQUEUED_CALLBACKS,

/** Acquire topic with shouldClaim == false **/
CHOOSING,
CHOOSING_ENQUEUE_CALLBACK,
CHOOSING_GET_ENQUEUED_CALLBACKS,

/** Topic is acquired **/
ACQUIRED,

/** Topic is failed during acquisition **/
ACQUIRE_FAIL_RELEASE,

/** Release Topic **/
RELEASING,
RELEASE_ENQUEUE_CALLBACK,
RELEASE_GET_ENQUEUED_CALLBACKS
{quote}

[CLAIM/CHOOSE/RELEASE]ING : the topic is under claim/choose/release status, some one got the chance to do actual work.
[CLAIM/CHOOSE/RELEASE]_ENQUEUE_CALLBACK : there is some on doing claim/choose/release works, the op tries to queue callback.
[CLAIM/CHOOSE/RELEASE]_GET_ENQUEUED_CALLBACKS : claim/choose/release works are done. try to get all the queued callbacks and trigger them.
ACQUIRED : the topic is acquired by the hub server
ACQUIRE_FAIL_RELEASE : topic acquisition is failed due to some reason (such as NotEnoughBookiesException), enter topic releasing phase

2) change topic set to a concurrent map *ConcurrentMap<ByteString, TopicStatus>* :
this map is used for tracking topic status transition to ensure only one acquisition/release for a specific topic is executed at the same time.

3) added HashMap<ByteString, List<Callback<HedwigSocketAddress>>> to queue get owner callbacks. added HashMap<ByteString, List<Callback<Void>>> to queue release op callbacks.

4) topic status transition in get owner & release op flow:
{quote}
*             CLAMING_ENQUEUE_CALLBACK
*                  ^ |
*      enqueue     | |
*      callback    | |
*                  | >
*      claim             claim topic
* null -------> CLAMING -------------> CLAMING_GET_CALLBACKS ---------| (trigger queued callbacks)
*  ^   |                                                              |-----> ACQUIRED
*  |   -------> CHOOSING -------------> CHOOSING_GET_CALLBACKS -------|  |        |
*  |   choose      | ^   choose topic                                    |        |
*  |               | |                                                   |        |  Release
*  |               | |   enqueue callback                                |        |   topic
*  |               > |                                                   >        |
*  |          CHOOSING_ENQUEUE_CALLBACK                  ACQUIRE_FAILE_RELEASE    |
*  |                                                                     |        |
*  |                                                                     >        >
*  ---------------------------- RELEASE_GET_ENQUEUED_CALLBACKS <--------- RELEASING
*                                                                           ^ |
*                                                         enqueue callback  | |
*                                                                           | >
*                                                                RELEASE_ENQUEUE_CALLBACK
{quote}

get owner:
# check topic status
## if topic is not existed, go to 2)
## if topic is CLAIMING/CHOOSING, go to 3)
## if topic is ACQUIRED, callback immediately
## else go to 1)
# claim/choose topic: set topic status as CLAIMING/CHOOSING
## if success, go to 4)
## if false, go to 1) to check topic status again
# enqueue callback
# do get owner
## real get owner
## if get owner succeed
### get enqueued callback list
### mark topic as ACQUIRED
### trigger all the queued callbacks
## if failed
### get enqueued callback list
### mark topic as ACQUIRE_FAIL_RELEASE
### enter releasing phase, the queued callback list will be triggered at the end of topic-releasing

release: most are same as get owner.

                
> ServerRedirectLoopException when a machine (hosts bookie server & hub server) reboot, which is caused by race condition of topic manager
> ----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: BOOKKEEPER-69
>                 URL: https://issues.apache.org/jira/browse/BOOKKEEPER-69
>             Project: Bookkeeper
>          Issue Type: Bug
>          Components: hedwig-client, hedwig-server
>    Affects Versions: 3.4.0
>         Environment: 3 machines (perf8, perf9, perf10), each machine hosts a bookie server & a hub server.
> perf8 is used as default server for client 1. perf9 is used as default server for client 2.
> bookkeeper is configured as below:
> ensemble size is 3, quorum size is 2.
>            Reporter: Sijie Guo
>            Priority: Critical
>         Attachments: bookkeeper-69-testcase.patch
>
>
> 1) machine perf10 is rebooted. the bookie server & hub server are not restarted automatically after reboot.
> 2) client 1 & client 2 are still running. the topics owned in perf10 will be re-assigned to perf8/perf9. but they would fail because not enough bookie servers are available.
> 3) after 2 hours, we found that perf10 is rebooted. we restarted bookie server & hub server on perf10
> 4) then we got ServerRedirectLoopException in client.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira