|
|
|
Connection Backoff Interop Test Descriptions
|
|
|
|
===============================================
|
|
|
|
|
|
|
|
This test is to verify the client is reconnecting the server with correct
|
|
|
|
backoffs as specified in
|
|
|
|
[the spec](https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md).
|
|
|
|
The test server has a port (control_port) running a rpc service for controlling
|
|
|
|
the server and another port (retry_port) to close any incoming tcp connections.
|
|
|
|
The test has the following flow:
|
|
|
|
|
|
|
|
1. The server starts listening on control_port.
|
|
|
|
2. The client calls Start rpc on server control_port.
|
|
|
|
3. The server starts listening on retry_port.
|
|
|
|
4. The client connects to server retry_port and retries with backoff for 540s,
|
|
|
|
which translates to about 13 retries.
|
|
|
|
5. The client calls Stop rpc on server control port.
|
|
|
|
6. The client checks the response to see whether the server thinks the backoffs
|
|
|
|
are conforming the spec or do its own check on the backoffs in the response.
|
|
|
|
|
|
|
|
Client and server use
|
|
|
|
[test.proto](https://github.com/grpc/grpc/blob/master/src/proto/grpc/testing/test.proto).
|
|
|
|
Each language should implement its own client. The C++ server is shared among
|
|
|
|
languages.
|
|
|
|
|
|
|
|
Client
|
|
|
|
------
|
|
|
|
|
|
|
|
Clients should accept these arguments:
|
|
|
|
* --server_control_port=PORT
|
|
|
|
* The server port to connect to for rpc. For example, "8080"
|
|
|
|
* --server_retry_port=PORT
|
|
|
|
* The server port to connect to for testing backoffs. For example, "8081"
|
|
|
|
|
|
|
|
The client must connect to the control port without TLS. The client must connect
|
|
|
|
to the retry port with TLS. The client should either assert on the server
|
|
|
|
returned backoff status or check the returned backoffs on its own.
|
|
|
|
|
|
|
|
Procedure of client:
|
|
|
|
|
|
|
|
1. Calls Start on server control port with a large deadline or no deadline,
|
|
|
|
waits for its finish and checks it succeeded.
|
|
|
|
2. Initiates a channel connection to server retry port, which should perform
|
|
|
|
reconnections with proper backoffs. A convenient way to achieve this is to
|
|
|
|
call Start with a deadline of 540s. The rpc should fail with deadline exceeded.
|
|
|
|
3. Calls Stop on server control port and checks it succeeded.
|
|
|
|
4. Checks the response to see whether the server thinks the backoffs passed the
|
|
|
|
test.
|
|
|
|
5. Optionally, the client can do its own check on the returned backoffs.
|
|
|
|
|
|
|
|
|
|
|
|
Server
|
|
|
|
------
|
|
|
|
|
|
|
|
A C++ server can be used for the test. Other languages do NOT need to implement
|
|
|
|
a server. To minimize the network delay, the server binary should run on the
|
|
|
|
same machine or on a nearby machine (in terms of network distance) with the
|
|
|
|
client binary.
|
|
|
|
|
|
|
|
A server implements the ReconnectService to its state. It also opens a
|
|
|
|
tcp server on the retry_port, which just shuts down all incoming tcp
|
|
|
|
connections to simulate connection failures. The server will keep a record of
|
|
|
|
all the reconnection timestamps and return the connection backoffs in the
|
|
|
|
response in milliseconds. The server also checks the backoffs to see whether
|
|
|
|
they conform the spec and returns whether the client passes the test.
|
|
|
|
|
|
|
|
If the server receives a Start call when another client is being tested, it
|
|
|
|
finishes the call when the other client is done. If some other host connects
|
|
|
|
to the server retry_port when a client is being tested, the server will log an
|
|
|
|
error but likely would think the client fails the test.
|
|
|
|
|
|
|
|
The server accepts these arguments:
|
|
|
|
|
|
|
|
* --control_port=PORT
|
|
|
|
* The port to listen on for control rpcs. For example, "8080"
|
|
|
|
* --retry_port=PORT
|
|
|
|
* The tcp server port. For example, "8081"
|
|
|
|
|