Skip to content

Commit d40d24a

Browse files
committed
vmdriver(vz): Wait for Start() to complete on server side
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent 8b72891 commit d40d24a

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

pkg/driver/external/client/methods.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,37 @@ func (d *DriverClient) Start(ctx context.Context) (chan error, error) {
6767
return nil, err
6868
}
6969

70+
// Blocking to receive an initial response to ensure Start() is initiated
71+
// at the server-side.
72+
initialResp, err := stream.Recv()
73+
if err != nil {
74+
d.logger.Errorf("Error receiving initial response from driver start: %v", err)
75+
return nil, err
76+
}
77+
if !initialResp.Success {
78+
return nil, errors.New(initialResp.Error)
79+
}
80+
81+
go func() {
82+
<-ctx.Done()
83+
if closeErr := stream.CloseSend(); closeErr != nil {
84+
d.logger.Warnf("Failed to close stream: %v", closeErr)
85+
}
86+
}()
87+
7088
errCh := make(chan error, 1)
7189
go func() {
7290
for {
73-
errorStream, err := stream.Recv()
91+
respStream, err := stream.Recv()
7492
if err != nil {
75-
d.logger.Errorf("Error receiving response from driver: %v", err)
93+
d.logger.Infof("Error receiving response from driver: %v", err)
7694
return
7795
}
78-
d.logger.Debugf("Received response: %v", errorStream)
79-
if !errorStream.Success {
80-
errCh <- errors.New(errorStream.Error)
96+
d.logger.Debugf("Received response: %v", respStream)
97+
if !respStream.Success {
98+
errCh <- errors.New(respStream.Error)
8199
} else {
82-
errCh <- nil
100+
close(errCh)
83101
return
84102
}
85103
}

pkg/driver/external/server/methods.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,20 @@ func (s *DriverServer) Start(_ *emptypb.Empty, stream pb.Driver_StartServer) err
2626
errChan, err := s.driver.Start(stream.Context())
2727
if err != nil {
2828
s.logger.Errorf("Start failed: %v", err)
29+
if sendErr := stream.Send(&pb.StartResponse{Success: false, Error: err.Error()}); sendErr != nil {
30+
s.logger.Errorf("Failed to send error response: %v", sendErr)
31+
return status.Errorf(codes.Internal, "failed to send error response: %v", sendErr)
32+
}
2933
return status.Errorf(codes.Internal, "failed to start driver: %v", err)
3034
}
3135

36+
// First send a success response upon receiving the errChan to unblock the client
37+
// and start receiving errors (if any).
38+
if err := stream.Send(&pb.StartResponse{Success: true}); err != nil {
39+
s.logger.Errorf("Failed to send success response: %v", err)
40+
return status.Errorf(codes.Internal, "failed to send success response: %v", err)
41+
}
42+
3243
for {
3344
select {
3445
case err, ok := <-errChan:

pkg/driver/vz/vz_driver_darwin.go

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

443-
func (l *LimaVzDriver) AdditionalSetupForSSH(_ context.Context) error {
443+
func (l *LimaVzDriver) AdditionalSetupForSSH(ctx context.Context) error {
444444
<-l.waitSSHLocalPortAccessible
445445
return nil
446446
}

0 commit comments

Comments
 (0)