| java.lang.Object org.jgroups.blocks.GroupRequest
GroupRequest | public class GroupRequest implements RspCollector,Command(Code) | | Sends a message to all members of the group and waits for all responses (or timeout). Returns a
boolean value (success or failure). Results (if any) can be retrieved when done.
The supported transport to send requests is currently either a RequestCorrelator or a generic
Transport. One of them has to be given in the constructor. It will then be used to send a
request. When a message is received by either one, the receiveResponse() of this class has to
be called (this class does not actively receive requests/responses itself). Also, when a view change
or suspicion is received, the methods viewChange() or suspect() of this class have to be called.
When started, an array of responses, correlating to the membership, is created. Each response
is added to the corresponding field in the array. When all fields have been set, the algorithm
terminates.
This algorithm can optionally use a suspicion service (failure detector) to detect (and
exclude from the membership) fauly members. If no suspicion service is available, timeouts
can be used instead (see execute() ). When done, a list of suspected members
can be retrieved.
Because a channel might deliver requests, and responses to different requests, the
GroupRequest class cannot itself receive and process requests/responses from the
channel. A mechanism outside this class has to do this; it has to determine what the responses
are for the message sent by the execute() method and call receiveResponse()
to do so.
Requirements: lossless delivery, e.g. acknowledgment-based message confirmation.
author: Bela Ban version: $Revision: 1.21.2.2 $ |
Constructor Summary | |
public | GroupRequest(Message m, RequestCorrelator corr, Vector members, int rsp_mode) Parameters: m - The message to be sent Parameters: corr - The request correlator to be used. | public | GroupRequest(Message m, RequestCorrelator corr, Vector members, int rsp_mode, long timeout, int expected_mbrs) Parameters: timeout - Time to wait for responses (ms). | public | GroupRequest(Message m, Transport transport, Vector members, int rsp_mode) | public | GroupRequest(Message m, Transport transport, Vector members, int rsp_mode, long timeout, int expected_mbrs) Parameters: timeout - Time to wait for responses (ms). |
Method Summary | |
public boolean | execute() | public boolean | execute(boolean use_anycasting) Sends the message. | public Address | getCaller() | public int | getNumSuspects() | public RspList | getResults() | public Vector | getSuspects() | public boolean | isDone() | public void | receiveResponse(Object response_value, Address sender) Callback (called by RequestCorrelator or Transport).
Adds a response to the response table. | final public void | reset(Vector mbrs) This method sets the membership variable to the value of
members . | public void | setCaller(Address caller) | public void | suspect(Address suspected_member) Callback (called by RequestCorrelator or Transport).
Report to GroupRequest that a member is reported as faulty (suspected).
This method would probably be called when getting a suspect message from a failure detector
(where available). | public String | toString() | public void | viewChange(View new_view) Any member of 'membership' that is not in the new view is flagged as
SUSPECTED. |
GET_ABS_MAJORITY | final public static int GET_ABS_MAJORITY(Code) | | return majority (of all members, may block)
|
GET_ALL | final public static int GET_ALL(Code) | | return all responses
|
GET_FIRST | final public static int GET_FIRST(Code) | | return only first response
|
GET_MAJORITY | final public static int GET_MAJORITY(Code) | | return majority (of all non-faulty members)
|
GET_N | final public static int GET_N(Code) | | return n responses (may block)
|
GET_NONE | final public static int GET_NONE(Code) | | return no response (async call)
|
done | protected boolean done(Code) | | |
expected_mbrs | protected int expected_mbrs(Code) | | |
rsp_mode | protected int rsp_mode(Code) | | |
timeout | protected long timeout(Code) | | |
GroupRequest | public GroupRequest(Message m, RequestCorrelator corr, Vector members, int rsp_mode)(Code) | | Parameters: m - The message to be sent Parameters: corr - The request correlator to be used. A request correlator sends requests tagged witha unique ID and notifies the sender when matching responses are received. Thereason GroupRequest uses it instead of a Transport isthat multiple requests/responses might be sent/received concurrently. Parameters: members - The initial membership. This value reflects the membership to which the requestis sent (and from which potential responses are expected). Is reset by reset(). Parameters: rsp_mode - How many responses are expected. Can beGET_ALL : wait for all responses from non-suspected members.A suspicion service might warnus when a member from which a response is outstanding has crashed, so it canbe excluded from the responses. If no suspision service is available, atimeout can be used (a value of 0 means wait forever). If a timeout of0 is used, no suspicion service is available and a member from which weexpect a response has crashed, this methods blocks forever !.GET_FIRST : wait for the first available response.GET_MAJORITY : wait for the majority of all responses. Themajority is re-computed when a member is suspected.GET_ABS_MAJORITY : wait for the majority ofall members.This includes failed members, so it may block if no timeout is specified.GET_N : wait for N members.Return if n is >= membership+suspects.GET_NONE : don't wait for any response. Essentially send anasynchronous message to the group members.
|
GroupRequest | public GroupRequest(Message m, RequestCorrelator corr, Vector members, int rsp_mode, long timeout, int expected_mbrs)(Code) | | Parameters: timeout - Time to wait for responses (ms). A value of <= 0 means wait indefinitely(e.g. if a suspicion service is available; timeouts are not needed). |
GroupRequest | public GroupRequest(Message m, Transport transport, Vector members, int rsp_mode, long timeout, int expected_mbrs)(Code) | | Parameters: timeout - Time to wait for responses (ms). A value of <= 0 means wait indefinitely(e.g. if a suspicion service is available; timeouts are not needed). |
execute | public boolean execute(boolean use_anycasting) throws Exception(Code) | | Sends the message. Returns when n responses have been received, or a
timeout has occurred. n can be the first response, all
responses, or a majority of the responses.
|
getNumSuspects | public int getNumSuspects()(Code) | | |
getResults | public RspList getResults()(Code) | | Returns the results as a RspList
|
isDone | public boolean isDone()(Code) | | |
receiveResponse | public void receiveResponse(Object response_value, Address sender)(Code) | | Callback (called by RequestCorrelator or Transport).
Adds a response to the response table. When all responses have been received,
execute() returns.
|
reset | final public void reset(Vector mbrs)(Code) | | This method sets the membership variable to the value of
members . It requires that the caller already hold the
rsp_mutex lock.
Parameters: mbrs - The new list of members |
suspect | public void suspect(Address suspected_member)(Code) | | Callback (called by RequestCorrelator or Transport).
Report to GroupRequest that a member is reported as faulty (suspected).
This method would probably be called when getting a suspect message from a failure detector
(where available). It is used to exclude faulty members from the response list.
|
viewChange | public void viewChange(View new_view)(Code) | | Any member of 'membership' that is not in the new view is flagged as
SUSPECTED. Any member in the new view that is not in the
membership (ie, the set of responses expected for the current RPC) will
not be added to it. If we did this we might run into the
following problem:
- Membership is {A,B}
- A sends a synchronous group RPC (which sleeps for 60 secs in the
invocation handler)
- C joins while A waits for responses from A and B
- If this would generate a new view {A,B,C} and if this expanded the
response set to {A,B,C}, A would wait forever on C's response because C
never received the request in the first place, therefore won't send a
response.
|
|
|