func()

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
}