Verified Commit 38f61b27 authored by Suleimi Ahmed's avatar Suleimi Ahmed 🔴 Committed by GitLab
Browse files

feat: batched migration for blobs.media_type_id_convert_to_bigint backfill

parent d8737bae
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ func AllWork() []Work {
		{Name: "copyManifestMediaTypeIDToNewBigIntColumn", Do: copyManifestMediaTypeIDToNewBigIntColumn},
		{Name: "copyManifestConfigMediaTypeIDToNewBigIntColumn", Do: copyManifestConfigMediaTypeIDToNewBigIntColumn},
		{Name: "populateBlobsIDColumn", Do: updateBlobNullIDs},
		{Name: "copyBlobMediaTypeIDToNewBigIntColumn", Do: copyBlobMediaTypeIDToNewBigIntColumn},
	}
}

@@ -116,6 +117,10 @@ func copyManifestConfigMediaTypeIDToNewBigIntColumn(ctx context.Context, db data
	return err
}

func copyBlobMediaTypeIDToNewBigIntColumn(ctx context.Context, db datastore.Handler, paginationTable, paginationColumn string, paginationAfter, paginationBefore, _ int) error {
	return copyMediaTypeIDToNewBigIntColumn(ctx, db, paginationTable, paginationColumn, paginationAfter, paginationBefore)
}

func copyMediaTypeIDToNewBigIntColumn(ctx context.Context, db datastore.Handler, paginationTable, paginationColumn string, paginationAfter, paginationBefore int) error {
	q := fmt.Sprintf(`UPDATE %s SET media_type_id_convert_to_bigint = media_type_id WHERE %s >= $1 AND %s <= $2`, paginationTable, paginationColumn, paginationColumn)
	log.GetLogger(log.WithContext(ctx)).
+45 −0
Original line number Diff line number Diff line
package premigrations

import (
	"fmt"

	"github.com/docker/distribution/registry/datastore/migrations"
	migrate "github.com/rubenv/sql-migrate"
)

func init() {
	const numPartitions = 64

	upStatements := make([]string, 0, numPartitions)
	downStatements := make([]string, 0, numPartitions)

	for i := 0; i < numPartitions; i++ {
		partitionName := fmt.Sprintf("partitions.blobs_p_%d", i)
		migrationName := fmt.Sprintf("copy_blobs_p_%d_media_type_id_column_to_media_type_id_convert_to_bigint_column", i)

		upStatements = append(upStatements, fmt.Sprintf(`
			INSERT INTO batched_background_migrations ("name", "min_value", "max_value", "batch_size", "sub_batch_size", "status", "job_signature_name", "table_name", "column_name")
				VALUES ('%s', 1, -- Default BIGINT Undershoot minimum for IDENTITY
					9223372036854775807, -- BIGINT maximum (overshoot)
					100000, 20000, 1, -- Active status
					'copyBlobMediaTypeIDToNewBigIntColumn', '%s', 'id')`,
			migrationName,
			partitionName,
		))

		downStatements = append(downStatements, fmt.Sprintf(`
			DELETE FROM batched_background_migrations WHERE "name" = '%s'`,
			migrationName,
		))
	}

	m := &migrations.Migration{
		Migration: &migrate.Migration{
			Id:   "20260310000000_bbm_backfill_blobs_media_type_id_convert_to_bigint_column",
			Up:   upStatements,
			Down: downStatements,
		},
	}

	migrations.AppendPreMigration(m)
}