public void RelationTable_can_be_built() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId1 = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); PipId pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process); PipId pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.SealDirectory); PipId pipId4 = packedExecutionBuilder.PipTableBuilder.Add(hash + 3, $"{name}4", PipType.Process); packedExecution.ConstructRelationTables(); RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies; RelationTable <PipId, PipId> .Builder builder = new RelationTable <PipId, PipId> .Builder(relationTable); // add relations in any order (but without cycles) // 1 <- 2 // 1 <- 3 // 2 <- 4 // 3 <- 4 builder.Add(pipId2, pipId1); builder.Add(pipId3, pipId1); builder.Add(pipId4, pipId2); builder.Add(pipId4, pipId3); // done adding relations; flush to table builder.Complete(); CheckRelation(packedExecution, pipId1, pipId2, pipId3, pipId4, relationTable); }
public void TestLogPackedExecution() { FileArtifact srcA = CreateSourceFile(); FileArtifact outA = CreateOutputFileArtifact(); Process pipA = CreateAndSchedulePipBuilder(new Operation[] { Operation.ReadFile(srcA), Operation.WriteFile(outA) }).Process; // Make pipB dependent on pipA FileArtifact srcB = CreateSourceFile(); Process pipB = CreateAndSchedulePipBuilder(new Operation[] { Operation.ReadFile(srcB), Operation.ReadFile(outA), Operation.WriteFile(CreateOutputFileArtifact()) }).Process; ScheduleRunResult result = RunScheduler(); // .AssertCacheMiss(pipA.PipId, pipB.PipId); AbsolutePath executionLogPath = result.Config.Logging.ExecutionLog; string packedExecutionPath = Path.ChangeExtension(executionLogPath.ToString(Context.PathTable), "PXL"); // Packed eXecution Log // Try reading it PackedExecution pex = new PackedExecution(); pex.LoadFromDirectory(packedExecutionPath); Assert.True(pex.PipTable.Count > 0); }
public void RelationTable_can_store_one_relation() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); packedExecution.ConstructRelationTables(); RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies; relationTable.Add(new[] { pipId }.AsSpan()); XAssert.AreEqual(1, relationTable[pipId].Length); ReadOnlySpan <PipId> relations = relationTable[pipId]; XAssert.AreEqual(pipId, relations[0]); RelationTable <PipId, PipId> inverseRelationTable = relationTable.Invert(); XAssert.AreEqual(1, inverseRelationTable[pipId].Length); XAssert.AreEqual(pipId, inverseRelationTable[pipId][0]); }
public void RelationTable_can_be_built_unordered() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId1 = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); PipId pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process); PipId pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.SealDirectory); PipId pipId4 = packedExecutionBuilder.PipTableBuilder.Add(hash + 3, $"{name}4", PipType.Process); packedExecution.ConstructRelationTables(); RelationTable <PipId, PipId> pipDependencyTable = packedExecution.PipDependencies; pipDependencyTable.FillToBaseTableCount(); pipDependencyTable.AddUnordered(pipId4, new PipId[] { pipId2, pipId3 }); pipDependencyTable.AddUnordered(pipId3, new PipId[] { pipId1 }); pipDependencyTable.AddUnordered(pipId2, new PipId[] { pipId1 }); XAssert.IsTrue(pipDependencyTable.MayBeUnordered); CheckRelation(packedExecution, pipId1, pipId2, pipId3, pipId4, pipDependencyTable); }
public void RelationTable_can_be_built() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); PipId pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process); PipId pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.Process); packedExecution.ConstructRelationTables(); RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies; RelationTable <PipId, PipId> .Builder builder = new RelationTable <PipId, PipId> .Builder(relationTable); // add relations in any order builder.Add(pipId3, pipId2); builder.Add(pipId3, pipId); builder.Add(pipId, pipId3); builder.Add(pipId, pipId2); // done adding relations; flush to table builder.Complete(); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable[pipId].ToArray(), true); XAssert.AreArraysEqual(new PipId[0], relationTable[pipId2].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId, pipId2 }, relationTable[pipId3].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable.Enumerate(pipId).ToArray(), true); XAssert.AreArraysEqual(new PipId[0], relationTable.Enumerate(pipId2).ToArray(), true); XAssert.AreArraysEqual(new[] { pipId, pipId2 }, relationTable.Enumerate(pipId3).ToArray(), true); }
public void PackedExecution_can_store_files() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); string path = "d:\\os\\bin\\shellcommon\\shell\\merged\\winmetadata\\appresolverux.winmd"; FileId id = packedExecutionBuilder.FileTableBuilder.GetOrAdd(path, 1024 * 1024, default, default);
public void PackedExecution_can_be_constructed() { PackedExecution packedExecution = new PackedExecution(); XAssert.AreEqual(0, packedExecution.DirectoryTable.Count); XAssert.AreEqual(0, packedExecution.FileTable.Count); XAssert.AreEqual(0, packedExecution.PathTable.Count); XAssert.AreEqual(0, packedExecution.PipTable.Count); XAssert.AreEqual(0, packedExecution.StringTable.Count); XAssert.AreEqual(0, packedExecution.WorkerTable.Count); }
public static PackedExecution.Builder ConstructExecution() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder builder = new PackedExecution.Builder(packedExecution); builder.PipTableBuilder.Add(0, "alpha.bravo.charlie", PipType.Process); builder.PipTableBuilder.Add(1, "alpha.bravo.delta.echo", PipType.Process); builder.PipTableBuilder.Add(2, "alpha.foxtrot.golf.hotel", PipType.Process); return(builder); }
public void RelationTable_can_store_multiple_relations() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); PipId pipId2 = packedExecutionBuilder.PipTableBuilder.Add(hash + 1, $"{name}2", PipType.Process); PipId pipId3 = packedExecutionBuilder.PipTableBuilder.Add(hash + 2, $"{name}3", PipType.Process); XAssert.AreNotEqual(pipId, pipId2); XAssert.AreNotEqual(pipId, pipId3); XAssert.AreNotEqual(pipId2, pipId3); packedExecution.ConstructRelationTables(); RelationTable <PipId, PipId> relationTable = packedExecution.PipDependencies; relationTable.Add(new[] { pipId2, pipId3 }.AsSpan()); XAssert.AreEqual(2, relationTable[pipId].Length); ReadOnlySpan <PipId> relations = relationTable[pipId]; XAssert.AreEqual(pipId2, relations[0]); XAssert.AreEqual(pipId3, relations[1]); relationTable.Add(new[] { pipId }.AsSpan()); XAssert.AreEqual(1, relationTable[pipId2].Length); relationTable.Add(new[] { pipId, pipId2, pipId3 }.AsSpan()); XAssert.AreEqual(3, relationTable[pipId3].Length); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable[pipId].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId, pipId2, pipId3 }, relationTable[pipId3].ToArray(), true); RelationTable <PipId, PipId> inverseRelationTable = relationTable.Invert(); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, inverseRelationTable[pipId].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId, pipId3 }, inverseRelationTable[pipId2].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId, pipId3 }, inverseRelationTable[pipId3].ToArray(), true); }
/// <summary> /// Construct a PackedExecutionExporter. /// </summary> public PackedExecutionExporter(PipGraph input, string outputDirectoryPath, bool threadSafe = true) : base(input) { #if NET_CORE m_outputDirectoryPath = outputDirectoryPath; m_packedExecution = new PackedExecution(); // we'll be building these right away, not loading the tables first m_packedExecution.ConstructRelationTables(); m_packedExecutionBuilder = new PackedExecution.Builder(m_packedExecution); m_concurrentPipProcessor = new ConcurrentPipProcessor(this); if (threadSafe) { m_lockObject = this; } #endif }
private static void CheckRelation(PackedExecution packedExecution, PipId pipId1, PipId pipId2, PipId pipId3, PipId pipId4, RelationTable <PipId, PipId> relationTable) { XAssert.AreArraysEqual(new PipId[0], relationTable[pipId1].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId1 }, relationTable[pipId2].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId1 }, relationTable[pipId3].ToArray(), true); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable[pipId4].ToArray(), true); XAssert.AreArraysEqual(new PipId[0], relationTable.Enumerate(pipId1).ToArray(), true); XAssert.AreArraysEqual(new[] { pipId1 }, relationTable.Enumerate(pipId2).ToArray(), true); XAssert.AreArraysEqual(new[] { pipId2, pipId3 }, relationTable.Enumerate(pipId4).ToArray(), true); // try traversing from pipId4; should traverse over pipId3 and reach pipId (as well as pipId2) IEnumerable <PipId> reachable = relationTable.Traverse( pipId4, p => packedExecution.PipTable[p].PipType == PipType.Process ? TraversalFilterResult.AcceptAndHalt : TraversalFilterResult.RejectAndContinue); XAssert.AreArraysEqual(new[] { pipId1, pipId2 }, reachable.OrderBy(p => p.Value).ToArray(), true); }
public void PackedExecution_can_store_pips() { PackedExecution packedExecution = new PackedExecution(); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId id = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); XAssert.AreEqual(0, packedExecution.DirectoryTable.Count); XAssert.AreEqual(0, packedExecution.FileTable.Count); XAssert.AreEqual(0, packedExecution.PathTable.Count); XAssert.AreEqual(1, packedExecution.PipTable.Count); XAssert.AreEqual(4, packedExecution.StringTable.Count); XAssert.AreEqual(0, packedExecution.WorkerTable.Count); PipEntry entry = packedExecution.PipTable[id]; XAssert.AreEqual(hash, entry.SemiStableHash); XAssert.AreEqual(name, packedExecution.PipTable.PipNameTable.GetText(entry.Name)); }
public void DerivedTable_can_save_and_load() { PackedExecution packedExecution = new PackedExecution(); SingleValueTable <PipId, int> derivedTable = new SingleValueTable <PipId, int>(packedExecution.PipTable); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); derivedTable.Add(1000); derivedTable.SaveToFile(TemporaryDirectory, "PipInt.bin"); SingleValueTable <PipId, int> derivedTable2 = new SingleValueTable <PipId, int>(packedExecution.PipTable); derivedTable2.LoadFromFile(TemporaryDirectory, "PipInt.bin"); XAssert.AreEqual(1, derivedTable2.Count); XAssert.AreEqual(1, derivedTable2.Ids.Count()); XAssert.AreEqual(1000, derivedTable2[pipId]); }
public void DerivedTable_can_store_one_element() { PackedExecution packedExecution = new PackedExecution(); SingleValueTable <PipId, int> derivedTable = new SingleValueTable <PipId, int>(packedExecution.PipTable); XAssert.AreEqual(0, derivedTable.Count); XAssert.AreEqual(0, derivedTable.Ids.Count()); PackedExecution.Builder packedExecutionBuilder = new PackedExecution.Builder(packedExecution); long hash = 1; string name = "ShellCommon.Shell.ShellCommon.Shell.Merged.Winmetadata"; PipId pipId = packedExecutionBuilder.PipTableBuilder.Add(hash, name, PipType.Process); XAssert.AreEqual(0, derivedTable.Count); XAssert.AreEqual(0, derivedTable.Ids.Count()); derivedTable.Add(1000); XAssert.AreEqual(1, derivedTable.Count); XAssert.AreEqual(1, derivedTable.Ids.Count()); XAssert.AreEqual(1000, derivedTable[pipId]); }