コード例 #1
0
        /// <summary>
        /// Creates an instance of <see cref="PipGraphFragmentBuilder"/>.
        /// </summary>
        public PipGraphFragmentBuilder(
            PipExecutionContext pipExecutionContext,
            IConfiguration configuration,
            PathExpander pathExpander)
        {
            Contract.Requires(pipExecutionContext != null);

            Configuration          = configuration;
            m_pipExecutionContext  = pipExecutionContext;
            m_lazyApiServerMoniker = configuration.Schedule.UseFixedApiServerMoniker
                ? Lazy.Create(() => IpcFactory.GetFixedMoniker())
                : Lazy.Create(() => IpcFactory.GetProvider().CreateNewMoniker());
            SealDirectoryTable = new SealedDirectoryTable(m_pipExecutionContext.PathTable);

            if (configuration.Schedule.ComputePipStaticFingerprints)
            {
                var extraFingerprintSalts = new ExtraFingerprintSalts(
                    configuration,
                    PipFingerprintingVersion.TwoPhaseV2,
                    configuration.Cache.CacheSalt,
                    new DirectoryMembershipFingerprinterRuleSet(configuration, pipExecutionContext.StringTable).ComputeSearchPathToolsHash());

                m_pipStaticFingerprinter = new PipStaticFingerprinter(
                    pipExecutionContext.PathTable,
                    sealDirectoryFingerprintLookup: null,
                    directoryProducerFingerprintLookup: null,
                    extraFingerprintSalts: extraFingerprintSalts,
                    pathExpander: pathExpander)
                {
                    FingerprintTextEnabled = configuration.Schedule.LogPipStaticFingerprintTexts
                };
            }
        }
コード例 #2
0
        /// <summary>
        /// Creates an instance of <see cref="GraphFragmentBuilder"/>.
        /// </summary>
        public GraphFragmentBuilder(LoggingContext loggingContext, PipExecutionContext pipExecutionContext, IConfiguration configuration)
        {
            Contract.Requires(loggingContext != null);
            Contract.Requires(pipExecutionContext != null);

            m_loggingContext       = loggingContext;
            m_pipExecutionContext  = pipExecutionContext;
            m_lazyApiServerMoniker = configuration.Schedule.UseFixedApiServerMoniker
                ? Lazy.Create(() => IpcFactory.GetFixedMoniker())
                : Lazy.Create(() => IpcFactory.GetProvider().CreateNewMoniker());
            SealDirectoryTable = new SealedDirectoryTable(m_pipExecutionContext.PathTable);
        }
コード例 #3
0
        private void ReserveAndAddSeal(SealedDirectoryTable table, SealDirectory seal)
        {
            var directoryArtifact = table.ReserveDirectoryArtifact(seal);

            seal.SetDirectoryArtifact(directoryArtifact);
            table.AddSeal(seal);

            XAssert.IsTrue(seal.IsInitialized);

            XAssert.IsTrue(table.TryGetSealForDirectoryArtifact(directoryArtifact, out PipId pipId));
            XAssert.AreEqual(seal.PipId, pipId);
            XAssert.IsTrue(directoryArtifact.IsValid);
        }
コード例 #4
0
 public void TestCallingSetDirectoryArtifactMultipleTimesWithSameDirectoryArtifactShouldBeAllowed()
 {
     using (TestEnv env = TestEnv.CreateTestEnvWithPausedScheduler())
     {
         SealedDirectoryTable table         = new SealedDirectoryTable(env.PathTable);
         AbsolutePath         directoryPath = env.Paths.CreateAbsolutePath(env.ObjectRoot, "seal");
         FileArtifact         a             = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "a"));
         var partialSeal       = CreatePartialSeal(env, directoryPath, a);
         var directoryArtifact = DirectoryArtifact.CreateDirectoryArtifactForTesting(directoryPath, 1);
         partialSeal.SetDirectoryArtifact(directoryArtifact);
         partialSeal.SetDirectoryArtifact(directoryArtifact); // setting the same directory artifact multiple times should be fine
     }
 }
コード例 #5
0
 public void TestAddInitializedSealDirectoryWhilePatching()
 {
     using (TestEnv env = TestEnv.CreateTestEnvWithPausedScheduler())
     {
         SealedDirectoryTable table         = new SealedDirectoryTable(env.PathTable);
         AbsolutePath         directoryPath = env.Paths.CreateAbsolutePath(env.ObjectRoot, "seal");
         FileArtifact         a             = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "a"));
         var partialSeal       = CreatePartialSeal(env, directoryPath, a);
         var directoryArtifact = DirectoryArtifact.CreateDirectoryArtifactForTesting(directoryPath, 1);
         partialSeal.SetDirectoryArtifact(directoryArtifact);
         table.StartPatching(); // if not in IsPatching state, 'ReserveAndAddSeal' would fail
         ReserveAndAddSeal(table, partialSeal);
         table.FinishPatching();
     }
 }
コード例 #6
0
        public void TestSealDirectoryTable()
        {
            using (TestEnv env = TestEnv.CreateTestEnvWithPausedScheduler())
            {
                SealedDirectoryTable table = new SealedDirectoryTable(env.PathTable);

                AbsolutePath directoryPath         = env.Paths.CreateAbsolutePath(env.ObjectRoot, "seal");
                AbsolutePath otherDirectoryPath    = env.Paths.CreateAbsolutePath(env.ObjectRoot, "otherSeal");
                AbsolutePath unsealedDirectoryPath = env.Paths.CreateAbsolutePath(env.ObjectRoot, "unseal");
                FileArtifact a = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "a"));
                FileArtifact b = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "subdir", "b"));
                FileArtifact c = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "subdir", "c"));

                // This file is not sealed until the full seal is created
                FileArtifact d = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(directoryPath, "d"));

                FileArtifact other_a = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(otherDirectoryPath, "a"));
                FileArtifact other_b = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(otherDirectoryPath, "b"));

                FileArtifact z_unsealed = FileArtifact.CreateSourceFile(env.Paths.CreateAbsolutePath(unsealedDirectoryPath, "z"));

                var partialSeal1 = CreatePartialSeal(env, directoryPath, a, b);
                var partialSeal2 = CreatePartialSeal(env, directoryPath, a, b, c);
                ReserveAndAddSeal(table, partialSeal1);
                ReserveAndAddSeal(table, partialSeal2);

                // Create other seals to ensure that seals for different paths are independent
                var otherPartialSeal = CreatePartialSeal(env, otherDirectoryPath, other_a);
                var otherFullSeal    = CreateFullSeal(env, otherDirectoryPath, other_a, other_b);
                ReserveAndAddSeal(table, otherPartialSeal);
                ReserveAndAddSeal(table, otherFullSeal);

                // Assert no full seals for partial sealed files
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(a).IsValid);
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(b).IsValid);
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(c).IsValid);

                // Assert no partial/full seals for unsealed files under directory
                XAssert.IsFalse(table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, d).IsValid);
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(d).IsValid);

                // Assert no partial/full seals for unsealed files
                XAssert.IsFalse(table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, z_unsealed).IsValid);
                XAssert.IsFalse(table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, z_unsealed).IsValid);
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(z_unsealed).IsValid);

                // Assert that minimal partial seal is found for sealed files
                XAssert.AreEqual(partialSeal1.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, a));
                XAssert.AreEqual(partialSeal1.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, b));
                XAssert.AreEqual(partialSeal2.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, c));

                // Assert that partial seal is not found for unsealed files
                XAssert.IsFalse(table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, z_unsealed).IsValid);

                // Create a full seal and verify update to table
                // We re-assert many of the conditions above to ensure that adding a full seal
                // only changes result of the intended calls
                var fullSeal = CreateFullSeal(env, directoryPath, a, b, c, d);
                ReserveAndAddSeal(table, fullSeal);

                // Assert that minimal partial seal DirectoryArtifact is found for sealed files (TryFindSealDirectoryContainingFileArtifact)
                XAssert.AreEqual(partialSeal1.Directory, table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, a));
                XAssert.AreEqual(partialSeal1.Directory, table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, b));
                XAssert.AreEqual(partialSeal2.Directory, table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, c));
                XAssert.AreEqual(fullSeal.Directory, table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, d));

                // Assert that minimal partial seal PipID is found for sealed files (TryFindSealDirectoryContainingFileArtifact)
                XAssert.AreEqual(partialSeal1.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, a));
                XAssert.AreEqual(partialSeal1.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, b));
                XAssert.AreEqual(partialSeal2.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, c));
                XAssert.AreEqual(fullSeal.PipId, table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, d));

                // Assert full seal for partial sealed files
                XAssert.AreEqual(fullSeal.Directory, table.TryFindFullySealedDirectoryArtifactForFile(a));
                XAssert.AreEqual(fullSeal.Directory, table.TryFindFullySealedDirectoryArtifactForFile(b));
                XAssert.AreEqual(fullSeal.Directory, table.TryFindFullySealedDirectoryArtifactForFile(c));
                XAssert.AreEqual(fullSeal.Directory, table.TryFindFullySealedDirectoryArtifactForFile(c));

                // Assert no partial/full seals for unsealed files
                XAssert.IsFalse(table.TryFindSealDirectoryContainingFileArtifact(env.PipTable, z_unsealed).IsValid);
                XAssert.IsFalse(table.TryFindSealDirectoryPipContainingFileArtifact(env.PipTable, z_unsealed).IsValid);
                XAssert.IsFalse(table.TryFindFullySealedDirectoryArtifactForFile(z_unsealed).IsValid);
            }
        }