public void MountUpgradesPreSharedCacheLocalSizes() { this.Enlistment.UnmountGVFS(); // Delete the existing repo metadata string versionJsonPath = Path.Combine(this.Enlistment.DotGVFSRoot, GVFSHelpers.RepoMetadataName); versionJsonPath.ShouldBeAFile(this.fileSystem); this.fileSystem.DeleteFile(versionJsonPath); // "11" was the last version before the introduction of a volume wide GVFS cache string metadataPath = Path.Combine(this.Enlistment.DotGVFSRoot, GVFSHelpers.RepoMetadataName); this.fileSystem.CreateEmptyFile(metadataPath); GVFSHelpers.SaveDiskLayoutVersion(this.Enlistment.DotGVFSRoot, "11", "0"); // Create the legacy cache location: <root>\.gvfs\gitObjectCache string legacyGitObjectsCachePath = Path.Combine(this.Enlistment.DotGVFSRoot, "gitObjectCache"); this.fileSystem.CreateDirectory(legacyGitObjectsCachePath); // Create a legacy PersistedDictionary sizes database List <KeyValuePair <string, long> > entries = new List <KeyValuePair <string, long> >() { new KeyValuePair <string, long>(new string('0', 40), 1), new KeyValuePair <string, long>(new string('1', 40), 2), new KeyValuePair <string, long>(new string('2', 40), 4), new KeyValuePair <string, long>(new string('3', 40), 8), }; ESENTDatabase.CreateEsentBlobSizesDatabase(this.Enlistment.DotGVFSRoot, entries); this.Enlistment.MountGVFS(); this.ValidatePersistedVersionMatchesCurrentVersion(); GVFSHelpers.GetPersistedLocalCacheRoot(this.Enlistment.DotGVFSRoot) .ShouldEqual(string.Empty, "LocalCacheRoot should be an empty string when upgrading from a version prior to 12"); GVFSHelpers.GetPersistedGitObjectsRoot(this.Enlistment.DotGVFSRoot) .ShouldEqual(legacyGitObjectsCachePath); string newBlobSizesRoot = Path.Combine(this.Enlistment.DotGVFSRoot, DatabasesFolderName, BlobSizesCacheName); GVFSHelpers.GetPersistedBlobSizesRoot(this.Enlistment.DotGVFSRoot) .ShouldEqual(newBlobSizesRoot); string blobSizesDbPath = Path.Combine(newBlobSizesRoot, BlobSizesDBFileName); newBlobSizesRoot.ShouldBeADirectory(this.fileSystem); blobSizesDbPath.ShouldBeAFile(this.fileSystem); foreach (KeyValuePair <string, long> entry in entries) { GVFSHelpers.SQLiteBlobSizesDatabaseHasEntry(blobSizesDbPath, entry.Key, entry.Value); } }
public void MountUpgradesLocalSizesToSharedCache() { GVFSFunctionalTestEnlistment enlistment = this.CloneAndMountEnlistment(); enlistment.UnmountGVFS(); string localCacheRoot = GVFSHelpers.GetPersistedLocalCacheRoot(enlistment.DotGVFSRoot); string gitObjectsRoot = GVFSHelpers.GetPersistedGitObjectsRoot(enlistment.DotGVFSRoot); // Delete the existing repo metadata string versionJsonPath = Path.Combine(enlistment.DotGVFSRoot, GVFSHelpers.RepoMetadataName); versionJsonPath.ShouldBeAFile(this.fileSystem); this.fileSystem.DeleteFile(versionJsonPath); // Since there isn't a sparse-checkout file that is used anymore one needs to be added // in order to test the old upgrades that might have needed it string sparseCheckoutPath = Path.Combine(enlistment.RepoRoot, TestConstants.DotGit.Info.SparseCheckoutPath); this.fileSystem.WriteAllText(sparseCheckoutPath, "/.gitattributes\r\n"); // "13.0" was the last version before blob sizes were moved out of Esent string metadataPath = Path.Combine(enlistment.DotGVFSRoot, GVFSHelpers.RepoMetadataName); this.fileSystem.CreateEmptyFile(metadataPath); GVFSHelpers.SaveDiskLayoutVersion(enlistment.DotGVFSRoot, "13", "0"); GVFSHelpers.SaveLocalCacheRoot(enlistment.DotGVFSRoot, localCacheRoot); GVFSHelpers.SaveGitObjectsRoot(enlistment.DotGVFSRoot, gitObjectsRoot); // Create a legacy PersistedDictionary sizes database List <KeyValuePair <string, long> > entries = new List <KeyValuePair <string, long> >() { new KeyValuePair <string, long>(new string('0', 40), 1), new KeyValuePair <string, long>(new string('1', 40), 2), new KeyValuePair <string, long>(new string('2', 40), 4), new KeyValuePair <string, long>(new string('3', 40), 8), }; ESENTDatabase.CreateEsentBlobSizesDatabase(enlistment.DotGVFSRoot, entries); enlistment.MountGVFS(); string majorVersion; string minorVersion; GVFSHelpers.GetPersistedDiskLayoutVersion(enlistment.DotGVFSRoot, out majorVersion, out minorVersion); majorVersion .ShouldBeAnInt("Disk layout version should always be an int") .ShouldEqual(DiskLayoutUpgradeTests.CurrentDiskLayoutMajorVersion, "Disk layout version should be upgraded to the latest"); minorVersion .ShouldBeAnInt("Disk layout version should always be an int") .ShouldEqual(DiskLayoutUpgradeTests.CurrentDiskLayoutMinorVersion, "Disk layout version should be upgraded to the latest"); string newBlobSizesRoot = Path.Combine(Path.GetDirectoryName(gitObjectsRoot), DiskLayoutUpgradeTests.BlobSizesCacheName); GVFSHelpers.GetPersistedBlobSizesRoot(enlistment.DotGVFSRoot) .ShouldEqual(newBlobSizesRoot); string blobSizesDbPath = Path.Combine(newBlobSizesRoot, DiskLayoutUpgradeTests.BlobSizesDBFileName); newBlobSizesRoot.ShouldBeADirectory(this.fileSystem); blobSizesDbPath.ShouldBeAFile(this.fileSystem); foreach (KeyValuePair <string, long> entry in entries) { GVFSHelpers.SQLiteBlobSizesDatabaseHasEntry(blobSizesDbPath, entry.Key, entry.Value); } // Upgrade a second repo, and make sure all sizes from both upgrades are in the shared database GVFSFunctionalTestEnlistment enlistment2 = this.CloneAndMountEnlistment(); enlistment2.UnmountGVFS(); // Delete the existing repo metadata versionJsonPath = Path.Combine(enlistment2.DotGVFSRoot, GVFSHelpers.RepoMetadataName); versionJsonPath.ShouldBeAFile(this.fileSystem); this.fileSystem.DeleteFile(versionJsonPath); // Since there isn't a sparse-checkout file that is used anymore one needs to be added // in order to test the old upgrades that might have needed it string sparseCheckoutPath2 = Path.Combine(enlistment2.RepoRoot, TestConstants.DotGit.Info.SparseCheckoutPath); this.fileSystem.WriteAllText(sparseCheckoutPath2, "/.gitattributes\r\n"); // "13.0" was the last version before blob sizes were moved out of Esent metadataPath = Path.Combine(enlistment2.DotGVFSRoot, GVFSHelpers.RepoMetadataName); this.fileSystem.CreateEmptyFile(metadataPath); GVFSHelpers.SaveDiskLayoutVersion(enlistment2.DotGVFSRoot, "13", "0"); GVFSHelpers.SaveLocalCacheRoot(enlistment2.DotGVFSRoot, localCacheRoot); GVFSHelpers.SaveGitObjectsRoot(enlistment2.DotGVFSRoot, gitObjectsRoot); // Create a legacy PersistedDictionary sizes database List <KeyValuePair <string, long> > additionalEntries = new List <KeyValuePair <string, long> >() { new KeyValuePair <string, long>(new string('4', 40), 16), new KeyValuePair <string, long>(new string('5', 40), 32), new KeyValuePair <string, long>(new string('6', 40), 64), }; ESENTDatabase.CreateEsentBlobSizesDatabase(enlistment2.DotGVFSRoot, additionalEntries); enlistment2.MountGVFS(); foreach (KeyValuePair <string, long> entry in entries) { GVFSHelpers.SQLiteBlobSizesDatabaseHasEntry(blobSizesDbPath, entry.Key, entry.Value); } foreach (KeyValuePair <string, long> entry in additionalEntries) { GVFSHelpers.SQLiteBlobSizesDatabaseHasEntry(blobSizesDbPath, entry.Key, entry.Value); } }