Skip to content

Commit 61384ff

Browse files
committed
Allow migration jobs to remove entities from DB without breaking their own pagination
1 parent 2e07d3e commit 61384ff

9 files changed

Lines changed: 26 additions & 11 deletions

Refresh.Interfaces.Workers/Migrations/BackfillLevelAttributesMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> que
1212
.OrderBy(l => l.LevelId);
1313
}
1414

15-
protected override void Migrate(WorkContext context, GameLevel[] batch)
15+
protected override int Migrate(WorkContext context, GameLevel[] batch)
1616
{
1717
foreach (GameLevel level in batch)
1818
{
1919
context.Database.ApplyLevelMetadataFromAttributes(level);
2020
}
2121

2222
context.Database.SaveChanges();
23+
return batch.Length;
2324
}
2425
}

Refresh.Interfaces.Workers/Migrations/BackfillModdedPlanetFlagsMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ protected override IQueryable<GameUser> SortAndFilter(IQueryable<GameUser> query
1616
|| u.BetaPlanetsHash != "0");
1717
}
1818

19-
protected override void Migrate(WorkContext context, GameUser[] batch)
19+
protected override int Migrate(WorkContext context, GameUser[] batch)
2020
{
2121
foreach (GameUser user in batch)
2222
{
2323
context.Database.UpdatePlanetModdedStatus(user);
2424
}
2525

2626
context.Database.SaveChanges();
27+
return batch.Length;
2728
}
2829
}

Refresh.Interfaces.Workers/Migrations/BackfillReviewLabelsMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Refresh.Interfaces.Workers.Migrations;
66

77
public class BackfillReviewLabelsMigration : MigrationJob<GameReview>
88
{
9-
protected override void Migrate(WorkContext context, GameReview[] batch)
9+
protected override int Migrate(WorkContext context, GameReview[] batch)
1010
{
1111
foreach (GameReview review in batch)
1212
{
@@ -19,6 +19,7 @@ protected override void Migrate(WorkContext context, GameReview[] batch)
1919
}
2020

2121
context.Database.SaveChanges();
22+
return batch.Length;
2223
}
2324

2425
protected override IQueryable<GameReview> SortAndFilter(IQueryable<GameReview> query)

Refresh.Interfaces.Workers/Migrations/BackfillRevisionMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ namespace Refresh.Interfaces.Workers.Migrations;
55

66
public class BackfillRevisionMigration : MigrationJob<GameLevel>
77
{
8-
protected override void Migrate(WorkContext context, GameLevel[] batch)
8+
protected override int Migrate(WorkContext context, GameLevel[] batch)
99
{
1010
foreach (GameLevel level in batch)
1111
{
1212
context.Database.CreateRevisionForLevel(level, null);
1313
}
14+
return batch.Length;
1415
}
1516

1617
protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> query)

Refresh.Interfaces.Workers/Migrations/CalculateScoreRanksMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> que
1212
return query.OrderBy(l => l.LevelId);
1313
}
1414

15-
protected override void Migrate(WorkContext context, GameLevel[] batch)
15+
protected override int Migrate(WorkContext context, GameLevel[] batch)
1616
{
1717
foreach (GameLevel level in batch)
1818
{
1919
context.Database.RecalculateScoreStatistics(level);
2020
}
2121
context.Database.SaveChanges();
22+
return batch.Length;
2223
}
2324
}

Refresh.Interfaces.Workers/Migrations/ClampPlayerLimitsMigration.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> que
1313
return query.OrderBy(l => l.LevelId);
1414
}
1515

16-
protected override void Migrate(WorkContext context, GameLevel[] batch)
16+
protected override int Migrate(WorkContext context, GameLevel[] batch)
1717
{
1818
foreach (GameLevel level in batch)
1919
{
@@ -26,5 +26,7 @@ protected override void Migrate(WorkContext context, GameLevel[] batch)
2626
level.MinPlayers = Math.Clamp(level.MinPlayers, 1, 4);
2727
level.MaxPlayers = Math.Clamp(level.MaxPlayers, 1, 4);
2828
}
29+
30+
return batch.Length;
2931
}
3032
}

Refresh.Interfaces.Workers/Migrations/EnsureDeletedUsersDeletedMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ protected override IQueryable<GameUser> SortAndFilter(IQueryable<GameUser> query
1515
.OrderBy(u => u.UserId); // can't use join date here as we're changing the join date when we delete data
1616
}
1717

18-
protected override void Migrate(WorkContext context, GameUser[] batch)
18+
protected override int Migrate(WorkContext context, GameUser[] batch)
1919
{
2020
foreach (GameUser user in batch)
2121
{
2222
context.Logger.LogWarning(RefreshContext.Worker, $"Deleting {user.Username}'s account again to ensure data has been wiped...");
2323
context.Database.DeleteUser(user);
2424
}
25+
return batch.Length;
2526
}
2627
}

Refresh.Interfaces.Workers/Migrations/MoveSubjectsOutOfGamePhotosMigration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ protected override IQueryable<GamePhoto> SortAndFilter(IQueryable<GamePhoto> que
1212
.OrderBy(p => p.PhotoId);
1313
}
1414

15-
protected override void Migrate(WorkContext context, GamePhoto[] batch)
15+
protected override int Migrate(WorkContext context, GamePhoto[] batch)
1616
{
1717
foreach (GamePhoto photo in batch)
1818
{
@@ -47,5 +47,6 @@ protected override void Migrate(WorkContext context, GamePhoto[] batch)
4747
}
4848

4949
context.Database.SaveChanges();
50+
return batch.Length;
5051
}
5152
}

Refresh.Workers/MigrationJob.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,21 @@ public override void ExecuteJob(WorkContext context)
4040

4141
TEntity[] batch = query.ToArray();
4242

43-
Migrate(context, batch);
43+
int entitiesLeftCount = Migrate(context, batch);
4444
context.Database.SaveChanges();
4545
transaction.Commit();
4646

47-
state.Processed += batch.Length;
47+
state.Processed += entitiesLeftCount;
48+
state.Total = state.Total - batch.Length + entitiesLeftCount;
4849
context.Logger.LogInfo(RefreshContext.Database, $"{this.JobId} migrated {batch.Length} objects ({state.Processed}/{state.Total}, complete: {state.Complete})");
4950
}
5051

5152
protected abstract IQueryable<TEntity> SortAndFilter(IQueryable<TEntity> query);
5253

53-
protected abstract void Migrate(WorkContext context, TEntity[] batch);
54+
/// <returns>
55+
/// The number of entities in the batch, minus the number of entities removed from DB during this migration.
56+
/// E.g. if 1000 items are in the given batch, and 5 got removed from DB during migration,
57+
/// the returned number will be 1000 - 5 = 995
58+
/// </returns>
59+
protected abstract int Migrate(WorkContext context, TEntity[] batch);
5460
}

0 commit comments

Comments
 (0)