Skip to content

Commit be4f876

Browse files
committed
internal/libhive: fix nil exception by using lock before stop shared client
1 parent ea70e8f commit be4f876

File tree

2 files changed

+39
-18
lines changed

2 files changed

+39
-18
lines changed

internal/libhive/api.go

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -345,23 +345,15 @@ func (api *simAPI) stopSharedClient(w http.ResponseWriter, r *http.Request) {
345345
}
346346
node := mux.Vars(r)["node"]
347347

348-
clientInfo, err := api.tm.GetSharedClient(suiteID, node)
349-
if err != nil {
348+
err = api.tm.StopSharedClient(suiteID, node)
349+
switch {
350+
case err == ErrNoSuchNode:
350351
serveError(w, err, http.StatusNotFound)
351-
return
352-
}
353-
354-
// Stop the container.
355-
if clientInfo.wait != nil {
356-
if err := api.backend.DeleteContainer(clientInfo.ID); err != nil {
357-
serveError(w, err, http.StatusInternalServerError)
358-
return
359-
}
360-
clientInfo.wait()
361-
clientInfo.wait = nil
352+
case err != nil:
353+
serveError(w, err, http.StatusInternalServerError)
354+
default:
355+
serveOK(w)
362356
}
363-
364-
serveOK(w)
365357
}
366358

367359
// getHiveInfo returns information about the hive server instance.
@@ -522,8 +514,8 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) {
522514
LogPosition: sharedClient.LogPosition,
523515
SuiteID: suiteID, // Make sure this is properly set
524516
}
525-
526-
slog.Debug("Created shared client reference",
517+
518+
slog.Debug("Created shared client reference",
527519
"nodeID", clientConfig.SharedClientID,
528520
"name", sharedClient.Name,
529521
"isShared", true,
@@ -534,7 +526,7 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) {
534526
api.tm.RegisterNode(testID, clientConfig.SharedClientID, clientInfo)
535527

536528
// Return success with the node info
537-
slog.Info("API: shared client registered with test", "suite", suiteID, "test", testID,
529+
slog.Info("API: shared client registered with test", "suite", suiteID, "test", testID,
538530
"sharedClientId", clientConfig.SharedClientID, "container", sharedClient.ID[:8])
539531
serveJSON(w, &simapi.StartNodeResponse{ID: sharedClient.ID, IP: sharedClient.IP})
540532
return

internal/libhive/testmanager.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,35 @@ func (manager *TestManager) GetSharedClient(suiteID TestSuiteID, nodeID string)
877877
return client, nil
878878
}
879879

880+
// StopNode stops a shared client container.
881+
func (manager *TestManager) StopSharedClient(suiteID TestSuiteID, nodeID string) error {
882+
manager.testSuiteMutex.Lock()
883+
defer manager.testSuiteMutex.Unlock()
884+
885+
// Check if the test suite is running
886+
testSuite, ok := manager.runningTestSuites[suiteID]
887+
if !ok {
888+
return ErrNoSuchTestSuite
889+
}
890+
891+
if testSuite.SharedClients == nil {
892+
return ErrNoSuchNode
893+
}
894+
sharedClient, ok := testSuite.SharedClients[nodeID]
895+
if !ok {
896+
return ErrNoSuchNode
897+
}
898+
// Stop the container.
899+
if sharedClient.wait != nil {
900+
if err := manager.backend.DeleteContainer(sharedClient.ID); err != nil {
901+
return fmt.Errorf("unable to stop client: %v", err)
902+
}
903+
sharedClient.wait()
904+
sharedClient.wait = nil
905+
}
906+
return nil
907+
}
908+
880909
// GetClientLogOffset returns the current position in the client's log file
881910
func (manager *TestManager) GetClientLogOffset(suiteID TestSuiteID, nodeID string) (int64, error) {
882911
client, err := manager.GetSharedClient(suiteID, nodeID)

0 commit comments

Comments
 (0)