From f5e82260da1db26717721cfbf3a41657c238b134 Mon Sep 17 00:00:00 2001 From: Marek Siarkowicz Date: Sat, 7 Oct 2023 12:59:59 +0200 Subject: [PATCH] Fix parsing failpoint names when failpoint has value set Signed-off-by: Marek Siarkowicz --- tests/framework/e2e/etcd_process.go | 47 ++++++++++++++++++++++------- tests/robustness/failpoints.go | 8 ++--- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/tests/framework/e2e/etcd_process.go b/tests/framework/e2e/etcd_process.go index 25d214c13..f6d53d3f1 100644 --- a/tests/framework/e2e/etcd_process.go +++ b/tests/framework/e2e/etcd_process.go @@ -336,7 +336,7 @@ func (ep *EtcdServerProcess) Failpoints() *BinaryFailpoints { type BinaryFailpoints struct { member EtcdProcess - availableCache map[string]struct{} + availableCache map[string]string } func (f *BinaryFailpoints) SetupEnv(failpoint, payload string) error { @@ -373,18 +373,28 @@ var httpClient = http.Client{ Timeout: 10 * time.Millisecond, } -func (f *BinaryFailpoints) Available() map[string]struct{} { +func (f *BinaryFailpoints) Available(failpoint string) bool { if f.availableCache == nil { - fs, err := fetchFailpoints(f.member) + fs, err := failpoints(f.member) if err != nil { panic(err) } f.availableCache = fs } - return f.availableCache + _, found := f.availableCache[failpoint] + return found } -func fetchFailpoints(member EtcdProcess) (map[string]struct{}, error) { +func failpoints(member EtcdProcess) (map[string]string, error) { + body, err := fetchFailpointsBody(member) + if err != nil { + return nil, err + } + defer body.Close() + return parseFailpointsBody(body) +} + +func fetchFailpointsBody(member EtcdProcess) (io.ReadCloser, error) { address := fmt.Sprintf("127.0.0.1:%d", member.Config().GoFailPort) failpointUrl := url.URL{ Scheme: "http", @@ -394,15 +404,30 @@ func fetchFailpoints(member EtcdProcess) (map[string]struct{}, error) { if err != nil { return nil, err } - defer resp.Body.Close() - body, err := io.ReadAll(resp.Body) + if resp.StatusCode != http.StatusOK { + resp.Body.Close() + return nil, fmt.Errorf("invalid status code, %d", resp.StatusCode) + } + return resp.Body, nil +} + +func parseFailpointsBody(body io.Reader) (map[string]string, error) { + data, err := io.ReadAll(body) if err != nil { return nil, err } - text := strings.ReplaceAll(string(body), "=", "") - failpoints := map[string]struct{}{} - for _, f := range strings.Split(text, "\n") { - failpoints[f] = struct{}{} + lines := strings.Split(string(data), "\n") + failpoints := map[string]string{} + for _, line := range lines { + // Format: + // failpoint=value + parts := strings.SplitN(line, "=", 2) + failpoint := parts[0] + var value string + if len(parts) == 2 { + value = parts[1] + } + failpoints[failpoint] = value } return failpoints, nil } diff --git a/tests/robustness/failpoints.go b/tests/robustness/failpoints.go index da69f284c..eba801d26 100644 --- a/tests/robustness/failpoints.go +++ b/tests/robustness/failpoints.go @@ -314,9 +314,7 @@ func (f goPanicFailpoint) Available(config e2e.EtcdProcessClusterConfig, member if memberFailpoints == nil { return false } - available := memberFailpoints.Available() - _, found := available[f.failpoint] - return found + return memberFailpoints.Available(f.failpoint) } func (f goPanicFailpoint) Name() string { @@ -570,7 +568,5 @@ func (f killAndGofailSleep) Available(config e2e.EtcdProcessClusterConfig, membe if memberFailpoints == nil { return false } - available := memberFailpoints.Available() - _, found := available[f.failpoint] - return found + return memberFailpoints.Available(f.failpoint) }