echoserver: do not treat client errors as fatal

This commit is contained in:
Nikolay Edigaryev 2026-02-04 21:38:02 +01:00
parent c02b55b766
commit 61d4da980b
3 changed files with 40 additions and 21 deletions

View File

@ -196,7 +196,11 @@ func runWorker(cmd *cobra.Command, args []string) (err error) {
// Use TCP echo server to partially emulate VM's TCP/IP stack,
// this way we get port-forwarding working when running in
// synthetic mode
echoServer, err := echoserver.New()
echoServerOpts := []echoserver.Option{
echoserver.WithLogger(logger.Sugar().With("component", "echoserver")),
}
echoServer, err := echoserver.New(echoServerOpts...)
if err != nil {
return err
}

View File

@ -6,24 +6,37 @@ import (
"io"
"net"
"strings"
"syscall"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
)
type EchoServer struct {
listener net.Listener
logger *zap.SugaredLogger
}
func New() (*EchoServer, error) {
func New(opts ...Option) (*EchoServer, error) {
listener, err := net.Listen("tcp", ":0")
if err != nil {
return nil, err
}
return &EchoServer{
echoServer := &EchoServer{
listener: listener,
}, nil
}
// Apply options
for _, opt := range opts {
opt(echoServer)
}
// Apply defaults
if echoServer.logger == nil {
echoServer.logger = zap.NewNop().Sugar()
}
return echoServer, nil
}
func (echoServer *EchoServer) Addr() string {
@ -55,25 +68,16 @@ func (echoServer *EchoServer) Run(ctx context.Context) error {
buf := make([]byte, 4096)
for {
n, err := conn.Read(buf)
if err != nil {
if errors.Is(err, io.EOF) {
return nil
}
return err
_, err := io.CopyBuffer(conn, conn, buf)
if err != nil {
if errors.Is(err, io.EOF) {
return nil
}
_, err = conn.Write(buf[:n])
if err != nil {
if errors.Is(err, syscall.EPIPE) {
return nil
}
return err
}
echoServer.logger.Warnf("connection failed: %v", err)
}
return nil
})
}
})

View File

@ -0,0 +1,11 @@
package echoserver
import "go.uber.org/zap"
type Option func(echoServer *EchoServer)
func WithLogger(logger *zap.SugaredLogger) Option {
return func(echoServer *EchoServer) {
echoServer.logger = logger
}
}