fix: backport various fixes (#39203, #39236, #39239, #39248, #39251) (#39252)

This commit is contained in:
wxiaoguang
2026-09-06 22:05:11 +08:00
committed by GitHub
parent a127bc1013
commit bc11b8ac22
9 changed files with 159 additions and 16 deletions
+37 -8
View File
@@ -262,6 +262,42 @@ func NewPackageBlob(hsr packages_module.HashedSizeReader) *packages_model.Packag
}
}
func GetOrSavePackageBlob(ctx context.Context, contentStore *packages_module.ContentStore, blob *packages_model.PackageBlob, data packages_module.HashedSizeReader) (_ *packages_model.PackageBlob, _ bool, retErr error) {
if blob.Size != data.Size() {
return nil, false, fmt.Errorf("size mismatch: blob size %d, data size %d", blob.Size, data.Size())
}
pb, existsInDatabase, err := packages_model.GetOrInsertBlob(ctx, blob)
if err != nil {
return nil, false, fmt.Errorf("unable to get or insert blob: %w", err)
}
defer func() {
if retErr != nil && !existsInDatabase {
if errDelete := packages_model.DeleteBlobByID(ctx, pb.ID); errDelete != nil {
log.Error("unable to delete blob from database after failed save in content store: %v", errDelete)
}
}
}()
var objSize optional.Option[int64]
storeKey := packages_module.BlobHash256Key(pb.HashSHA256)
if existsInDatabase {
// check if the blob file actually is valid in the content store
objSize, err = contentStore.OptionalSize(storeKey)
if err != nil {
return nil, false, fmt.Errorf("unable to check object size in content store: %w", err)
}
}
if objSize.ValueOrDefault(-1) != blob.Size {
if err := contentStore.Save(storeKey, data, data.Size()); err != nil {
return nil, false, fmt.Errorf("unable to save object in content store: %w", err)
}
}
// existsInDatabase controls the "roll back", if other errors happen later,
// the "non-existing (newly created)" blob will be deleted from the content store, but not if it already existed in the database.
return pb, existsInDatabase, nil
}
func addFileToPackageVersion(ctx context.Context, pv *packages_model.PackageVersion, pvi *PackageInfo, pfci *PackageFileCreationInfo) (*packages_model.PackageFile, *packages_model.PackageBlob, bool, error) {
if err := CheckSizeQuotaExceeded(ctx, pfci.Creator, pvi.Owner, pvi.PackageType, pfci.Data.Size()); err != nil {
return nil, nil, false, err
@@ -273,18 +309,11 @@ func addFileToPackageVersion(ctx context.Context, pv *packages_model.PackageVers
func addFileToPackageVersionUnchecked(ctx context.Context, pv *packages_model.PackageVersion, pfci *PackageFileCreationInfo) (*packages_model.PackageFile, *packages_model.PackageBlob, bool, error) {
log.Trace("Adding package file: %v, %s", pv.ID, pfci.Filename)
pb, exists, err := packages_model.GetOrInsertBlob(ctx, NewPackageBlob(pfci.Data))
pb, exists, err := GetOrSavePackageBlob(ctx, packages_module.NewContentStore(), NewPackageBlob(pfci.Data), pfci.Data)
if err != nil {
log.Error("Error inserting package blob: %v", err)
return nil, nil, false, err
}
if !exists {
contentStore := packages_module.NewContentStore()
if err := contentStore.Save(packages_module.BlobHash256Key(pb.HashSHA256), pfci.Data, pfci.Data.Size()); err != nil {
log.Error("Error saving package blob in content store: %v", err)
return nil, nil, false, err
}
}
if pfci.OverwriteExisting {
pf, err := packages_model.GetFileForVersionByName(ctx, pv.ID, pfci.Filename, pfci.CompositeKey)