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(JsonEtwTracer tracer, string enlistmentRoot, DiskLayoutUpgrade upgrade) { string error; int actualVersion; if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out actualVersion, out error)) { tracer.RelatedError(error); return(false); } int expectedVersion = upgrade.SourceLayoutVersion + 1; if (actualVersion != expectedVersion) { throw new InvalidDataException(string.Format("Disk layout upgrade did not increment layout version. Expected: {0}, Actual: {1}", expectedVersion, actualVersion)); } return(true); }
private static bool TryFindUpgrade(JsonEtwTracer tracer, string enlistmentRoot, out DiskLayoutUpgrade upgrade) { int version; string error; if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out version, out error)) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedError(error); upgrade = null; return(false); } if (AllUpgrades.TryGetValue(version, out upgrade)) { StartLogFile(enlistmentRoot, tracer); tracer.RelatedInfo("Upgrading from disk layout {0} to {1}", version, version + 1); return(true); } return(true); }
protected bool TryIncrementDiskLayoutVersion(ITracer tracer, string enlistmentRoot, DiskLayoutUpgrade upgrade) { string newVersion = (upgrade.SourceLayoutVersion + 1).ToString(); string dotGVFSPath = Path.Combine(enlistmentRoot, GVFSConstants.DotGVFS.Root); string error; if (!RepoMetadata.TryInitialize(tracer, dotGVFSPath, out error)) { tracer.RelatedError("Could not initialize repo metadata: " + error); return(false); } RepoMetadata.Instance.SetEntry(RepoMetadata.Keys.DiskLayoutVersion, newVersion); tracer.RelatedInfo("Disk layout version is now: " + newVersion); return(true); }