Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions extension/healthcheckv2extension/extension_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"fmt"
"io"
"net"
"net/http"
"os"
"path/filepath"
Expand Down Expand Up @@ -133,3 +134,23 @@ func TestNotifyConfig(t *testing.T) {
require.NoError(t, err)
assert.JSONEq(t, string(confJSON), string(body))
}

func TestShutdown(t *testing.T) {
t.Run("error in http server start", func(t *testing.T) {
// Want to get error in http server start
endpoint := testutil.GetAvailableLocalAddress(t)
l, err := net.Listen("tcp", endpoint)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, l.Close()) })

cfg := createDefaultConfig().(*Config)
cfg.UseV2 = true
cfg.HTTPConfig.Endpoint = endpoint

ext := newExtension(context.Background(), *cfg, extensiontest.NewNopSettings(extensiontest.NopType))
// Get address already in use here
require.Error(t, ext.Start(context.Background(), componenttest.NewNopHost()))

ext.Shutdown(context.Background())
})
}
10 changes: 6 additions & 4 deletions extension/healthcheckv2extension/internal/http/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"net/http"
"sync"
"sync/atomic"
"time"

Expand All @@ -32,7 +33,7 @@ type Server struct {
colconf atomic.Value
aggregator *status.Aggregator
startTimestamp time.Time
doneCh chan struct{}
doneWg sync.WaitGroup
}

var (
Expand All @@ -52,7 +53,6 @@ func NewServer(
telemetry: telemetry,
mux: http.NewServeMux(),
aggregator: aggregator,
doneCh: make(chan struct{}),
}

if legacyConfig.UseV2 {
Expand Down Expand Up @@ -96,8 +96,10 @@ func (s *Server) Start(ctx context.Context, host component.Host) error {
return fmt.Errorf("failed to bind to address %s: %w", s.httpConfig.Endpoint, err)
}

s.doneWg.Add(1)
go func() {
defer close(s.doneCh)
defer s.doneWg.Done()

if err = s.httpServer.Serve(ln); !errors.Is(err, http.ErrServerClosed) && err != nil {
componentstatus.ReportStatus(host, componentstatus.NewPermanentErrorEvent(err))
}
Expand All @@ -112,7 +114,7 @@ func (s *Server) Shutdown(context.Context) error {
return nil
}
s.httpServer.Close()
<-s.doneCh
s.doneWg.Wait()
return nil
}

Expand Down
Loading