Exemple #1
0
        public void LockTest_ReadSamePathNotMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            // Test reads are NOT mutually exclusive
            var outputFileInput = CreateOutputFileArtifact();

            var process1 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() });
            var process2 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() });

            TestMutuallyExclusive(
                () => lockManager.AcquirePathAccessLock(process1),
                () => lockManager.AcquirePathAccessLock(process2),
                assertExclusive: false);
        }
Exemple #2
0
        public void LockTest_WriteReadSamePathMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            // Test read and write to same path are mutually exclusive
            var root       = CreateUniqueObjPath("sealed");
            var outputFile = CreateOutputFileArtifact(root.ToString(Context.PathTable));

            var seal    = CreateSealDirectory(root, SealDirectoryKind.Partial, CreateSourceFile(), outputFile);
            var process = CreateProcess(new[] { CreateSourceFile() }, new[] { outputFile });

            TestMutuallyExclusive(
                () => lockManager.AcquirePathAccessLock(process),
                () => lockManager.AcquirePathAccessLock(seal));
        }
Exemple #3
0
        public void LockTest_ReadPathsWithInnerExclusiveMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            // Test reads are NOT mutually exclusive
            var outputFileInput = CreateOutputFileArtifact();

            var process1 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() });
            var process2 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() });

            using (var sharedAccessLock1 = lockManager.AcquirePathAccessLock(process1))
                using (var sharedAccessLock2 = lockManager.AcquirePathAccessLock(process2))
                {
                    // Test that two group locks can't acquire the inner exclusive lock for the same path
                    // at the same time
                    TestMutuallyExclusive(
                        () => sharedAccessLock1.AcquirePathInnerExclusiveLock(outputFileInput.Path),
                        () => sharedAccessLock2.AcquirePathInnerExclusiveLock(outputFileInput.Path));
                }
        }
Exemple #4
0
        public void LockTest_WriteSamePathMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            // Test writes to same path are exclusive
            var outputFile = CreateOutputFileArtifact();

            // Create pips which write to the same location
            var copyFile1 = CreateCopyFile(CreateSourceFile(), outputFile);
            var copyFile2 = CreateCopyFile(CreateSourceFile(), outputFile);
            var copyFile3 = CreateCopyFile(CreateSourceFile(), outputFile);
            var process   = CreateProcess(new[] { CreateSourceFile() }, new[] { outputFile });

            TestMutuallyExclusive(
                () => lockManager.AcquirePathAccessLock(copyFile1),
                () => lockManager.AcquirePathAccessLock(copyFile2));

            TestMutuallyExclusive(
                () => lockManager.AcquirePathAccessLock(process),
                () => lockManager.AcquirePathAccessLock(copyFile3));
        }
Exemple #5
0
        public void LockTest_PathPipLockNotMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            var process = CreateProcess(new[] { CreateSourceFile() }, new[] { CreateOutputFileArtifact() });

            // Test pip locks and path locks are NOT mutually exclusive
            TestMutuallyExclusive(
                () => lockManager.AcquirePathAccessLock(process),
                () => lockManager.AcquireLock(new PipId(30)),
                assertExclusive: false);
        }
Exemple #6
0
        public void LockTest_GlobalLock_PathLockMutallyExclusive()
        {
            Setup();
            var lockManager = new LockManager();

            // Global lock and path lock are mutually exclusive
            var copyFile = CreateCopyFile(CreateSourceFile(), CreateOutputFileArtifact());

            TestMutuallyExclusive(() => lockManager.AcquireGlobalExclusiveLock(), () => lockManager.AcquirePathAccessLock(copyFile));
        }