private static bool TryFindUpgrade(JsonTracer tracer, string enlistmentRoot, out DiskLayoutUpgrade upgrade) { int majorVersion; int minorVersion; string error; if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error)) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedError(error); upgrade = null; return(false); } Dictionary <int, MinorUpgrade> minorVersionUpgradesForCurrentMajorVersion; if (minorVersionUpgrades.TryGetValue(majorVersion, out minorVersionUpgradesForCurrentMajorVersion)) { MinorUpgrade minorUpgrade; if (minorVersionUpgradesForCurrentMajorVersion.TryGetValue(minorVersion, out minorUpgrade)) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedInfo( "Upgrading from disk layout {0}.{1} to {0}.{2}", majorVersion, minorVersion, minorVersion + 1); upgrade = minorUpgrade; return(true); } } MajorUpgrade majorUpgrade; if (majorVersionUpgrades.TryGetValue(majorVersion, out majorUpgrade)) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedInfo("Upgrading from disk layout {0} to {1}", majorVersion, majorVersion + 1); upgrade = majorUpgrade; return(true); } // return true to indicate that we succeeded, and no upgrader was found upgrade = null; return(true); }
public static bool TryRunAllUpgrades(string enlistmentRoot) { majorVersionUpgrades = new Dictionary <int, MajorUpgrade>(); minorVersionUpgrades = new Dictionary <int, Dictionary <int, MinorUpgrade> >(); foreach (DiskLayoutUpgrade upgrade in GVFSPlatform.Instance.DiskLayoutUpgrade.Upgrades) { RegisterUpgrade(upgrade); } using (JsonTracer tracer = new JsonTracer(GVFSConstants.GVFSEtwProviderName, "DiskLayoutUpgrade")) { try { DiskLayoutUpgrade upgrade = null; while (TryFindUpgrade(tracer, enlistmentRoot, out upgrade)) { if (upgrade == null) { return(true); } if (!upgrade.TryUpgrade(tracer, enlistmentRoot)) { return(false); } if (!CheckLayoutVersionWasIncremented(tracer, enlistmentRoot, upgrade)) { return(false); } } return(false); } catch (Exception e) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedError(e.ToString()); return(false); } finally { RepoMetadata.Shutdown(); } } }
private static void RegisterUpgrade(DiskLayoutUpgrade upgrade) { if (upgrade.IsMajorUpgrade) { majorVersionUpgrades.Add(upgrade.SourceMajorVersion, (MajorUpgrade)upgrade); } else { if (minorVersionUpgrades.ContainsKey(upgrade.SourceMajorVersion)) { minorVersionUpgrades[upgrade.SourceMajorVersion].Add(upgrade.SourceMinorVersion, (MinorUpgrade)upgrade); } else { minorVersionUpgrades.Add(upgrade.SourceMajorVersion, new Dictionary <int, MinorUpgrade> { { upgrade.SourceMinorVersion, (MinorUpgrade)upgrade } }); } } }
public static bool TryRunAllUpgrades(string enlistmentRoot) { using (JsonEtwTracer tracer = new JsonEtwTracer(GVFSConstants.GVFSEtwProviderName, "DiskLayoutUpgrade")) { try { DiskLayoutUpgrade upgrade = null; while (TryFindUpgrade(tracer, enlistmentRoot, out upgrade)) { if (upgrade == null) { return(true); } if (!upgrade.TryUpgrade(tracer, enlistmentRoot)) { return(false); } if (!CheckLayoutVersionWasIncremented(tracer, enlistmentRoot, upgrade)) { return(false); } } return(false); } catch (Exception e) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedError(e.ToString()); return(false); } finally { RepoMetadata.Shutdown(); } } }
private static bool CheckLayoutVersionWasIncremented(JsonTracer tracer, string enlistmentRoot, DiskLayoutUpgrade upgrade) { string error; int actualMajorVersion; int actualMinorVersion; if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out actualMajorVersion, out actualMinorVersion, out error)) { tracer.RelatedError(error); return(false); } int expectedMajorVersion = upgrade.IsMajorUpgrade ? upgrade.SourceMajorVersion + 1 : upgrade.SourceMajorVersion; int expectedMinorVersion = upgrade.IsMajorUpgrade ? 0 : upgrade.SourceMinorVersion + 1; if (actualMajorVersion != expectedMajorVersion || actualMinorVersion != expectedMinorVersion) { throw new InvalidDataException(string.Format( "Disk layout upgrade did not increment layout version. Expected: {0}.{1}, Actual: {2}.{3}", expectedMajorVersion, expectedMinorVersion, actualMajorVersion, actualMinorVersion)); } return(true); }