Merge pull request #7886 from dmcgowan/fix-transfer-register-ordering

Fix race between stream registration and use
This commit is contained in:
Phil Estes 2023-01-04 14:49:28 -05:00 committed by GitHub
commit 72e5ddb516
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 3 deletions

View File

@ -74,20 +74,23 @@ func (s *service) Stream(srv api.Streaming_StreamServer) error {
if err != nil {
return err
}
if err := srv.Send(protobuf.FromAny(response)); err != nil {
return err
}
cc := make(chan struct{})
ss := &serviceStream{
s: srv,
cc: cc,
}
log.G(srv.Context()).WithField("stream", i.ID).Debug("registering stream")
if err := s.manager.Register(srv.Context(), i.ID, ss); err != nil {
return err
}
// Send response packet after registering stream
if err := srv.Send(protobuf.FromAny(response)); err != nil {
return err
}
select {
case <-srv.Context().Done():
// TODO: Should return error if not cancelled?

View File

@ -32,6 +32,12 @@ import (
)
func (c *Client) Transfer(ctx context.Context, src interface{}, dest interface{}, opts ...transfer.Opt) error {
ctx, done, err := c.WithLease(ctx)
if err != nil {
return err
}
defer done(ctx)
return proxy.NewTransferrer(transferapi.NewTransferClient(c.conn), c.streamCreator()).Transfer(ctx, src, dest, opts...)
}