Skip to content

Commit 9c66bdb

Browse files
feat: ACI-4298 Retry cache writes with offset (#211)
1 parent d3c36dc commit 9c66bdb

22 files changed

+554
-120
lines changed

cmd/xcode/mocks/kv_storage.go

Lines changed: 63 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/build_cache/kv/download.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ func (c *Client) DownloadStream(ctx context.Context, destination io.Writer, key
9595

9696
downloadErr := retry.Times(c.downloadRetry).Wait(c.downloadRetryWait).TryWithAbort(func(attempt uint) (error, bool) {
9797
if attempt == 0 {
98-
c.logger.Debugf("Downloading %s", key)
98+
c.logger.TDebugf("Downloading %s", key)
9999
} else {
100-
c.logger.Infof("%d. attempt to download %s with offset %d", attempt+1, key, offset)
100+
c.logger.TInfof("%d. attempt to download %s with offset %d", attempt+1, key, offset)
101101
}
102102

103103
timeoutCtx, cancel := context.WithTimeout(ctx, 60*time.Second)
@@ -127,7 +127,6 @@ func (c *Client) DownloadStream(ctx context.Context, destination io.Writer, key
127127
return fmt.Errorf("download archive: %w", err), false
128128
}
129129

130-
c.logger.Debugf("Response metadata: %+v", kvReader.Metadata())
131130
expectedHash = kvReader.Metadata()["x-flare-blob-validation-sha256"]
132131
expectedHash = strings.TrimPrefix(expectedHash, "blob/")
133132

@@ -143,7 +142,7 @@ func (c *Client) DownloadStream(ctx context.Context, destination io.Writer, key
143142
if expectedHash != fileHash {
144143
return fmt.Errorf("downloaded file hash mismatch: expected %s, got %s", expectedHash, fileHash)
145144
} else {
146-
c.logger.Debugf("Downloaded hash matches expected: %s", expectedHash)
145+
c.logger.TDebugf("Downloaded %s hash matches expected: %s", key, expectedHash)
147146
}
148147
}
149148

internal/build_cache/kv/methods.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,16 @@ import (
1919
)
2020

2121
type PutParams struct {
22-
Name string
23-
Sha256Sum string
24-
FileSize int64
22+
Name string
23+
Sha256Sum string
24+
FileSize int64
25+
Offset int64
26+
DeleteOnRewrite bool
27+
}
28+
29+
type WriteStatus struct {
30+
Complete bool
31+
CommittedSize int64
2532
}
2633

2734
type FileDigest struct {
@@ -73,6 +80,9 @@ func (c *Client) initiatePut(ctx context.Context, params PutParams) (*writer, er
7380
"x-flare-blob-validation-level", "error",
7481
"x-flare-no-skip-duplicate-writes", "true",
7582
))
83+
if params.DeleteOnRewrite {
84+
md.Set("x-cache-delete-on-rewrite", "true")
85+
}
7686
// Timeout is the responsibility of the caller
7787
ctx = metadata.NewOutgoingContext(ctx, md)
7888

@@ -91,7 +101,7 @@ func (c *Client) initiatePut(ctx context.Context, params PutParams) (*writer, er
91101
return &writer{
92102
stream: stream,
93103
resourceName: resourceName,
94-
offset: 0,
104+
offset: params.Offset,
95105
fileSize: params.FileSize,
96106
}, nil
97107
}
@@ -311,3 +321,27 @@ func (c *Client) getMethodCallMetadata(logMD bool) metadata.MD {
311321

312322
return md
313323
}
324+
325+
func (c *Client) QueryWriteStatus(ctx context.Context, name string) (WriteStatus, error) {
326+
resourceName := fmt.Sprintf("kv/%s", name)
327+
328+
timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
329+
defer cancel()
330+
callCtx := metadata.NewOutgoingContext(timeoutCtx, c.getMethodCallMetadata(false))
331+
resp, err := c.bitriseKVClient.WriteStatus(callCtx, &bytestream.QueryWriteStatusRequest{
332+
ResourceName: resourceName,
333+
})
334+
if err != nil {
335+
st, ok := status.FromError(err)
336+
if ok && st.Code() == codes.Unauthenticated {
337+
return WriteStatus{}, ErrCacheUnauthenticated
338+
}
339+
340+
return WriteStatus{}, fmt.Errorf("query write status: %w", err)
341+
}
342+
343+
return WriteStatus{
344+
Complete: resp.GetComplete(),
345+
CommittedSize: resp.GetCommittedSize(),
346+
}, nil
347+
}

internal/build_cache/kv/mocks/kv_storage.go

Lines changed: 63 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/build_cache/kv/setup_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ func init() {
2323
mockLogger.On("Infof", mock.Anything, mock.Anything).Return()
2424
mockLogger.On("Infof", mock.Anything).Return()
2525
mockLogger.On("Infof").Return()
26+
mockLogger.On("TInfof", mock.Anything, mock.Anything, mock.Anything).Return()
27+
mockLogger.On("TInfof", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
28+
mockLogger.On("TInfof", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
29+
mockLogger.On("TInfof", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
30+
mockLogger.On("TInfof", mock.Anything, mock.Anything).Return()
31+
mockLogger.On("TInfof", mock.Anything).Return()
32+
mockLogger.On("TInfof").Return()
2633
mockLogger.On("TDebugf", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
2734
mockLogger.On("TDebugf", mock.Anything, mock.Anything).Return()
2835
mockLogger.On("TDebugf", mock.Anything).Return()
@@ -39,4 +46,8 @@ func init() {
3946
mockLogger.On("Warnf", mock.Anything, mock.Anything).Return()
4047
mockLogger.On("Warnf", mock.Anything, mock.Anything, mock.Anything).Return()
4148
mockLogger.On("Warnf", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
49+
mockLogger.On("TWarnf", mock.Anything).Return()
50+
mockLogger.On("TWarnf", mock.Anything, mock.Anything).Return()
51+
mockLogger.On("TWarnf", mock.Anything, mock.Anything, mock.Anything).Return()
52+
mockLogger.On("TWarnf", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return()
4253
}

0 commit comments

Comments
 (0)