forked from apache/incubator-livy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LIVY-735][RSC] Fix rpc channel closed when multi clients connect to …
…one driver ## What changes were proposed in this pull request? Currently, the driver tries to support communicating with multi-clients, by registering each client at https://github.com/apache/incubator-livy/blob/master/rsc/src/main/java/org/apache/livy/rsc/driver/RSCDriver.java#L220. But actually, if multi-clients connect to one driver, the rpc channel will close, the reason are as follows. 1. In every communication, client sends two packages to driver: header{type, id}, and payload at https://github.com/apache/incubator-livy/blob/master/rsc/src/main/java/org/apache/livy/rsc/rpc/RpcDispatcher.java#L144. 2. If client1 sends header1, payload1, and client2 sends header2, payload2 at the same time. The driver receives the package in the order: header1, header2, payload1, payload2. 3. When driver receives header1, driver assigns lastHeader at https://github.com/apache/incubator-livy/blob/master/rsc/src/main/java/org/apache/livy/rsc/rpc/RpcDispatcher.java#L73. 4. Then driver receives header2, driver process it as a payload at https://github.com/apache/incubator-livy/blob/master/rsc/src/main/java/org/apache/livy/rsc/rpc/RpcDispatcher.java#L78 which cause exception and rpc channel closed. In the muti-active HA mode, the design doc is at: https://docs.google.com/document/d/1bD3qYZpw14_NuCcSGUOfqQ0pqvSbCQsOLFuZp26Ohjc/edit?usp=sharing, the session is allocated among servers by consistent hashing. If a new livy joins, some session will be migrated from old livy to new livy. If the session client in new livy connect to driver before stoping session client in old livy, then two session clients will both connect to driver, and rpc channel close. In this case, it's hard to ensure only one client connect to one driver at any time. So it's better to support multi-clients connect to one driver, which has no side effects. How to fix: 1. Move the code of processing client message from `RpcDispatcher` to each `Rpc`. 2. Each `Rpc` registers itself to `channelRpc` in RpcDispatcher. 3. `RpcDispatcher` dispatches each message to `Rpc` according to `ctx.channel()`. ## How was this patch tested? Existed UT and IT Author: runzhiwang <[email protected]> Closes apache#268 from runzhiwang/multi-client-one-driver.
- Loading branch information
1 parent
40ea8cc
commit 66b5833
Showing
3 changed files
with
196 additions
and
157 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.