Skip to content

Commit dbb1bf6

Browse files
committed
vmdriver(vz): wait for Start() to complete RPC and fix race condition for AdditionalSetupForSSH()
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent e21b634 commit dbb1bf6

File tree

3 files changed

+48
-24
lines changed

3 files changed

+48
-24
lines changed

pkg/driver/external/client/methods.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"encoding/json"
99
"errors"
10+
"io"
1011
"net"
1112
"time"
1213

@@ -72,7 +73,9 @@ func (d *DriverClient) Start(ctx context.Context) (chan error, error) {
7273
for {
7374
errorStream, err := stream.Recv()
7475
if err != nil {
75-
d.logger.Errorf("Error receiving response from driver: %v", err)
76+
if !errors.Is(err, io.EOF) {
77+
d.logger.Errorf("Error receiving response from driver: %v", err)
78+
}
7679
return
7780
}
7881
d.logger.Debugf("Received response: %v", errorStream)

pkg/driver/external/server/methods.go

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,39 @@ import (
2323

2424
func (s *DriverServer) Start(_ *emptypb.Empty, stream pb.Driver_StartServer) error {
2525
s.logger.Debug("Received Start request")
26-
errChan, err := s.driver.Start(stream.Context())
26+
errChan, err := s.driver.Start(context.Background())
2727
if err != nil {
2828
s.logger.Errorf("Start failed: %v", err)
2929
return status.Errorf(codes.Internal, "failed to start driver: %v", err)
3030
}
3131

32-
for {
33-
select {
34-
case err, ok := <-errChan:
35-
if !ok {
36-
s.logger.Debug("Start error channel closed")
37-
if err := stream.Send(&pb.StartResponse{Success: true}); err != nil {
38-
s.logger.Errorf("Failed to send success response: %v", err)
39-
return status.Errorf(codes.Internal, "failed to send success response: %v", err)
32+
go func() {
33+
for {
34+
select {
35+
case err, ok := <-errChan:
36+
if !ok {
37+
s.logger.Debug("Start error channel closed")
38+
if err := stream.Send(&pb.StartResponse{Success: true}); err != nil {
39+
s.logger.Errorf("Failed to send success response: %v", err)
40+
return
41+
}
42+
return
4043
}
41-
return nil
42-
}
43-
if err != nil {
44-
s.logger.Errorf("Error during Start: %v", err)
45-
if err := stream.Send(&pb.StartResponse{Error: err.Error(), Success: false}); err != nil {
46-
s.logger.Errorf("Failed to send error response: %v", err)
47-
return status.Errorf(codes.Internal, "failed to send error response: %v", err)
44+
if err != nil {
45+
s.logger.Errorf("Error during Start: %v", err)
46+
if err := stream.Send(&pb.StartResponse{Error: err.Error(), Success: false}); err != nil {
47+
s.logger.Errorf("Failed to send error response: %v", err)
48+
return
49+
}
4850
}
51+
case <-stream.Context().Done():
52+
s.logger.Debug("Stream context done, stopping Start")
53+
return
4954
}
50-
case <-stream.Context().Done():
51-
s.logger.Debug("Stream context done, stopping Start")
52-
return nil
5355
}
54-
}
56+
}()
57+
58+
return nil
5559
}
5660

5761
func (s *DriverServer) Configure(_ context.Context, req *pb.SetConfigRequest) (*emptypb.Empty, error) {

pkg/driver/vz/vz_driver_darwin.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,24 @@ func (l *LimaVzDriver) ForwardGuestAgent() bool {
440440
return l.vSockPort == 0 && l.virtioPort == ""
441441
}
442442

443-
func (l *LimaVzDriver) AdditionalSetupForSSH(_ context.Context) error {
444-
<-l.waitSSHLocalPortAccessible
445-
return nil
443+
func (l *LimaVzDriver) AdditionalSetupForSSH(ctx context.Context) error {
444+
ticker := time.NewTicker(100 * time.Millisecond)
445+
defer ticker.Stop()
446+
447+
timeout := time.After(60 * time.Second)
448+
449+
for {
450+
if l.waitSSHLocalPortAccessible != nil {
451+
<-l.waitSSHLocalPortAccessible
452+
return nil
453+
}
454+
455+
select {
456+
case <-ctx.Done():
457+
return ctx.Err()
458+
case <-timeout:
459+
return errors.New("timeout waiting for Start() to initialize")
460+
case <-ticker.C:
461+
}
462+
}
446463
}

0 commit comments

Comments
 (0)