in internal/gcsx/syncer.go [152:232]
func (os *syncer) SyncObject(
ctx context.Context,
objectName string,
srcObject *gcs.Object,
content TempFile) (o *gcs.Object, err error) {
// Stat the content.
sr, err := content.Stat()
if err != nil {
err = fmt.Errorf("stat: %w", err)
return
}
// Local files are not present on GCS, hence only fullCreator is
// invoked and append flow is never triggered.
if srcObject == nil {
// Content.Stat() seeks the current position to end of file. Seek it back
// to beginning of the file.
_, err = content.Seek(0, 0)
if err != nil {
err = fmt.Errorf("error in seeking: %w", err)
return
}
return os.fullCreator.Create(ctx, objectName, srcObject, sr.Mtime, os.chunkTransferTimeoutSecs, content)
}
// Make sure the dirty threshold makes sense.
srcSize := int64(srcObject.Size)
if sr.DirtyThreshold > srcSize {
err = fmt.Errorf(
"stat returned weird DirtyThreshold field: %d vs. %d",
sr.DirtyThreshold,
srcObject.Size)
return
}
// If the content hasn't been dirtied (i.e. it is the same size as the source
// object, and no bytes within the source object have been dirtied), we're
// done.
if sr.Size == srcSize && sr.DirtyThreshold == srcSize {
return
}
// Sanity check: the branch above should ensure that by the time we get here,
// the stat result's mtime is non-nil.
if sr.Mtime == nil {
err = fmt.Errorf("wacky stat result: %#v", sr)
return
}
// Otherwise, we need to create a new generation. If the source object is
// long enough, hasn't been dirtied, and has a low enough component count,
// then we can make the optimization of not rewriting its contents.
if os.composeCreator != nil && srcSize >= os.composeThreshold &&
sr.DirtyThreshold == srcSize &&
srcObject.ComponentCount < gcs.MaxComponentCount {
_, err = content.Seek(srcSize, 0)
if err != nil {
err = fmt.Errorf("seek: %w", err)
return
}
o, err = os.composeCreator.Create(ctx, objectName, srcObject, sr.Mtime, os.chunkTransferTimeoutSecs, content)
} else {
_, err = content.Seek(0, 0)
if err != nil {
err = fmt.Errorf("seek: %w", err)
return
}
o, err = os.fullCreator.Create(ctx, objectName, srcObject, sr.Mtime, os.chunkTransferTimeoutSecs, content)
}
// Deal with errors.
if err != nil {
err = fmt.Errorf("create: %w", err)
return
}
return
}