Skip to content

Commit 1d857d6

Browse files
committed
refactor(striped backups): Using new comparator and moving the class to the same file
1 parent 685eaff commit 1d857d6

4 files changed

Lines changed: 47 additions & 54 deletions

File tree

src/BackupChain.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ private static IEnumerable<BackupMetadata> NextLogBackup(IEnumerable<BackupMetad
9292
{
9393
// also gets all the stripes of the next backup
9494
return backups.Where(b => b.BackupType == BackupFileTools.BackupType.Log &&
95-
prevBackup.LastLsn >= b.FirstLsn &&
95+
prevBackup.LastLsn >= b.FirstLsn &&
9696
prevBackup.LastLsn <= b.LastLsn &&
97-
!new BackupMetadataEqualityComparer().EqualsExceptForPhysicalDeviceName(prevBackup, b));
97+
!new StripedBackupEqualityComparer().Equals(prevBackup, b));
9898
}
9999

100100
private static bool IsValidFilePath(BackupMetadata meta)

src/BackupMetadata.cs

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ namespace AgDatabaseMove
22
{
33
using System;
44
using System.Collections.Generic;
5+
using System.Linq;
56
using SmoFacade;
67

7-
public class BackupMetadataEqualityComparer : IEqualityComparer<BackupMetadata>
8+
public class StripedBackupEqualityComparer : IEqualityComparer<BackupMetadata>
89
{
9-
/// <summary>
10-
/// This is used for checking similar backups (like striped backups)
11-
/// </summary>
12-
/// <returns>bool</returns>
13-
public bool EqualsExceptForPhysicalDeviceName(BackupMetadata x, BackupMetadata y)
10+
public bool Equals(BackupMetadata x, BackupMetadata y)
1411
{
1512
return x.LastLsn == y.LastLsn &&
1613
x.FirstLsn == y.FirstLsn &&
@@ -20,21 +17,10 @@ public bool EqualsExceptForPhysicalDeviceName(BackupMetadata x, BackupMetadata y
2017
x.DatabaseBackupLsn == x.DatabaseBackupLsn;
2118
}
2219

23-
/// <summary>
24-
/// This is used for checking exactly the same backup (like finding duplicates)
25-
/// </summary>
26-
/// <returns>bool</returns>
27-
public bool Equals(BackupMetadata x, BackupMetadata y)
28-
{
29-
return EqualsExceptForPhysicalDeviceName(x, y)
30-
&& x.PhysicalDeviceName == y.PhysicalDeviceName;
31-
}
32-
3320
public int GetHashCode(BackupMetadata obj)
3421
{
3522
var hashCode = -1277603921;
3623
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(obj.DatabaseName);
37-
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(obj.PhysicalDeviceName);
3824
hashCode = hashCode * -1521134295 +
3925
EqualityComparer<BackupFileTools.BackupType>.Default.GetHashCode(obj.BackupType);
4026
hashCode = hashCode * -1521134295 + obj.FirstLsn.GetHashCode();
@@ -43,6 +29,28 @@ public int GetHashCode(BackupMetadata obj)
4329
hashCode = hashCode * -1521134295 + obj.DatabaseBackupLsn.GetHashCode();
4430
return hashCode;
4531
}
32+
33+
}
34+
35+
/// <summary>
36+
/// Two BackupMetadatas are the same, if they are like striped backups but also have the same `PhysicalDeviceName`
37+
/// </summary>
38+
public class BackupMetadataEqualityComparer : IEqualityComparer<BackupMetadata>
39+
{
40+
private readonly StripedBackupEqualityComparer _stripedBackupEqualityComparer = new StripedBackupEqualityComparer();
41+
42+
public bool Equals(BackupMetadata x, BackupMetadata y)
43+
{
44+
return _stripedBackupEqualityComparer.Equals(x, y)
45+
&& x.PhysicalDeviceName == y.PhysicalDeviceName;
46+
}
47+
48+
public int GetHashCode(BackupMetadata obj)
49+
{
50+
var hashCode = _stripedBackupEqualityComparer.GetHashCode(obj);
51+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(obj.PhysicalDeviceName);
52+
return hashCode;
53+
}
4654
}
4755

4856
/// <summary>
@@ -72,4 +80,22 @@ public object Clone()
7280
return MemberwiseClone();
7381
}
7482
}
83+
84+
public class StripedBackupSet
85+
{
86+
public IEnumerable<BackupMetadata> StripedBackups { get; private set; }
87+
88+
private StripedBackupSet(IEnumerable<BackupMetadata> stripedBackups)
89+
{
90+
StripedBackups = stripedBackups;
91+
}
92+
93+
public static IEnumerable<StripedBackupSet> GetStripedBackupSetChain(IEnumerable<BackupMetadata> backups)
94+
{
95+
var chain = backups
96+
.GroupBy(b => b, new StripedBackupEqualityComparer())
97+
.Select(group => new StripedBackupSet(group));
98+
return chain;
99+
}
100+
}
75101
}

src/StripedBackupSet.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

tests/AgDatabaseMove.Unit/StripedBackupSetTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace AgDatabaseMove.Unit
99
public class StripedBackupSetTests
1010
{
1111

12+
private static readonly StripedBackupEqualityComparer stripedBackupComparer = new StripedBackupEqualityComparer();
1213
private static readonly BackupMetadataEqualityComparer backupComparer = new BackupMetadataEqualityComparer();
1314

1415
[Fact]
@@ -43,7 +44,7 @@ public void StripedBackupsAreEqualExceptForPhysicalDeviceName()
4344
{
4445
var otherBackup = stripes[i];
4546

46-
Assert.True(backupComparer.EqualsExceptForPhysicalDeviceName(backup, otherBackup));
47+
Assert.Equal(backup, otherBackup, stripedBackupComparer);
4748
Assert.NotEqual(backup, otherBackup, backupComparer);
4849
}
4950
}

0 commit comments

Comments
 (0)