Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Blackhole implementation for e2e tests #17985

Commits on May 15, 2024

  1. blackhole test

    Signed-off-by: Siyuan Zhang <[email protected]>
    siyuanfoundation authored and henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    9fbddd4 View commit details
    Browse the repository at this point in the history
  2. Add a 5s delay after unblackholing (for the catch-up to work)

    Shorten the wait time for the open connection to expire to 5s
    
    Signed-off-by: Chun-Hung Tseng <[email protected]>
    henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    2c26aca View commit details
    Browse the repository at this point in the history
  3. Fix Blackhole implemention for e2e tests

    Based on Fu Wei's idea discussed in the [issue](etcd-io#17737),
    we employ the blocking on L7 but without using external tools.
    
    [Background]
    
    A peer will
    (a) receive traffic from its peers
    (b) initiate connections to its peers (via stream and pipeline).
    
    Thus, the current mechanism of only blocking peer traffic via the peer's
    existing proxy is insufficient, since only scenario (a) is handled, and
    scenario (b) is not blocked at all.
    
    [Proposed solution]
    
    We introduce an forward proxy for each peer, which will be proxying all
    the connections initiated from a peer to its peers.
    
    The modified architecture will look something like this:
    ```
    A -- A's forward proxy ----- B's reverse proxy - B
         ^ newly introduced      ^ in the original codebase (renamed)
    ```
    
    By adding this forward proxy, we can block all in and out traffic that
    is initiated from a peer to others, without having to resort to external
    tools, such as iptables.
    
    It's verified that the blocking of traffic is complete, compared to
    previous solutions [2][3].
    
    [Implementation]
    
    The main subtasks are
    - set up an environment variable `E2E_TEST_FORWARD_PROXY_IP`
    - implement forward proxy by extending the existing proxy server code
    - implement enable/disable of the forward proxy in the e2e test
    
    The result is that for every peer, we will have the arch like this
    ```
    A -- A's forward proxy
         (connections initiated from A will be forwarded from this proxy)
     |   ^ covers case (b)
     |
     --- A's (currently existing) reverse proxy
         (advertised to other peers where the connection should come in from)
         ^ covers case (a)
    ```
    
    [Testing]
    - `make gofail-enable && make build && make gofail-disable && \
    go test -timeout 60s -run ^TestBlackholeByMockingPartitionLeader$ go.etcd.io/etcd/tests/v3/e2e -v -count=1`
    - `make gofail-enable && make build && make gofail-disable && \
    go test -timeout 60s -run ^TestBlackholeByMockingPartitionFollower$ go.etcd.io/etcd/tests/v3/e2e -v -count=1`
    
    [Issues]
    - I run into `context deadline exceeded` sometimes
    ```
        etcd_mix_versions_test.go:175:
                    Error Trace:    /Users/henrybear327/go/src/etcd/tests/e2e/etcd_mix_versions_test.go:175
                                                            /Users/henrybear327/go/src/etcd/tests/e2e/blackhole_test.go:75
                                                            /Users/henrybear327/go/src/etcd/tests/e2e/blackhole_test.go:31
                    Error:          Received unexpected error:
                                    [/Users/henrybear327/go/src/etcd/bin/etcdctl --endpoints=http://localhost:20006 put key-0 value-0] match not found.  Set EXPECT_DEBUG for more info Errs: [unexpected exit code [1] after running [/Users/henrybear327/go/src/etcd/bin/etcdctl --endpoints=http://localhost:20006 put key-0 value-0]], last lines:
                                    {"level":"warn","ts":"2024-05-05T23:02:36.809726+0800","logger":"etcd-client","caller":"[email protected]/retry_interceptor.go:65","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0x140001ee960/localhost:20006","method":"/etcdserverpb.KV/Put","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
                                    Error: context deadline exceeded
                                     (expected "OK", got []). Try EXPECT_DEBUG=TRUE
                    Test:           TestBlackholeByMockingPartitionLeader
                    Messages:       failed to put "key-0", error: [/Users/henrybear327/go/src/etcd/bin/etcdctl --endpoints=http://localhost:20006 put key-0 value-0] match not found.  Set EXPECT_DEBUG for more info Errs: [unexpected exit code [1] after running [/Users/henrybear327/go/src/etcd/bin/etcdctl --endpoints=http://localhost:20006 put key-0 value-0]], last lines:
                                    {"level":"warn","ts":"2024-05-05T23:02:36.809726+0800","logger":"etcd-client","caller":"[email protected]/retry_interceptor.go:65","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0x140001ee960/localhost:20006","method":"/etcdserverpb.KV/Put","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
                                    Error: context deadline exceeded
                                     (expected "OK", got []). Try EXPECT_DEBUG=TRUE
    ```
    
    [References]
    [1] issue etcd-io#17737
    [2] PR (V1) https://github.com/henrybear327/etcd/tree/fix/e2e_blackhole
    [3] PR (V2) etcd-io#17891
    
    Signed-off-by: Chun-Hung Tseng <[email protected]>
    henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    76e47c8 View commit details
    Browse the repository at this point in the history
  4. Implement determineHTTPTransportProxyParsingFunc

    Signed-off-by: Chun-Hung Tseng <[email protected]>
    henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    5707766 View commit details
    Browse the repository at this point in the history
  5. Tidy up net.SplitHostPort

    Signed-off-by: Chun-Hung Tseng <[email protected]>
    Co-authored-by: Iván Valdés Castillo <[email protected]>
    henrybear327 and ivanvc committed May 15, 2024
    Configuration menu
    Copy the full SHA
    938bc60 View commit details
    Browse the repository at this point in the history
  6. Attempt to fix "No data available for forward proxy to work on"

    Signed-off-by: Chun-Hung Tseng <[email protected]>
    henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    e8fd61d View commit details
    Browse the repository at this point in the history
  7. Remove reverse proxy and keep only forward proxy for all peers

    Signed-off-by: Chun-Hung Tseng <[email protected]>
    henrybear327 committed May 15, 2024
    Configuration menu
    Copy the full SHA
    51f3475 View commit details
    Browse the repository at this point in the history