fix(storage): fix unfinalized write size (#12016) · googleapis/google-cloud-go@6217f8f

@@ -46,7 +46,7 @@ type gRPCAppendBidiWriteBufferSender struct {

4646

progress func(int64)

4747

flushOffset int64

4848

takeoverOffset int64

49-

takeoverObj *storagepb.Object // Object returned by takeover stream reopening.

49+

objResource *storagepb.Object // Captures received obj to set w.Attrs.

50505151

// Fields used to report responses from the receive side of the stream

5252

// recvs is closed when the current recv goroutine is complete. recvErr is set

@@ -96,14 +96,14 @@ func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender(ctx context.Context)

9696

if err := s.connect(ctx); err != nil {

9797

return nil, fmt.Errorf("storage: opening appendable write stream: %w", err)

9898

}

99-

_, err := s.sendOnConnectedStream(nil, 0, true, false, true)

99+

_, err := s.sendOnConnectedStream(nil, 0, false, false, true)

100100

if err != nil {

101101

return nil, err

102102

}

103103

firstResp := <-s.recvs

104104

// Object resource is returned in the first response on takeover, so capture

105105

// this now.

106-

s.takeoverObj = firstResp.GetResource()

106+

s.objResource = firstResp.GetResource()

107107

s.takeoverOffset = firstResp.GetResource().GetSize()

108108

return s, nil

109109

}

@@ -298,8 +298,8 @@ func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offs

298298

// When closing the stream, update the object resource to reflect

299299

// the persisted size. We get a new object from the stream if

300300

// the object was finalized, but not if it's unfinalized.

301-

if s.takeoverObj != nil && resp.GetPersistedSize() > 0 {

302-

s.takeoverObj.Size = resp.GetPersistedSize()

301+

if s.objResource != nil && resp.GetPersistedSize() > 0 {

302+

s.objResource.Size = resp.GetPersistedSize()

303303

}

304304

}

305305

if s.recvErr != io.EOF {

@@ -358,6 +358,9 @@ func (s *gRPCAppendBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []

358358

}

359359360360

obj, err = s.sendOnConnectedStream(buf, offset, flush, finishWrite, sendFirstMessage)

361+

if obj != nil {

362+

s.objResource = obj

363+

}

361364

if err == nil {

362365

return

363366

}