public async Task DefaultBucket_MultipleClient(int clientCount) { var loggerFactory = new ClusterFixture.TestOutputLoggerFactory(_outputHelper); var clients = new List <PerBucketCleaner>(clientCount); var activeClients = new List <string>(); try { for (int i = 0; i < clientCount; i++) { var clientUuid = Guid.NewGuid().ToString(); var cleaner = new Cleaner(_fixture.Cluster, null, loggerFactory); var collection = await _fixture.OpenDefaultCollection(_outputHelper); var repo = new CleanerRepository(collection, null); var perBucketCleaner = new PerBucketCleaner(clientUuid, cleaner, repo, TimeSpan.FromSeconds(0.1), loggerFactory, startDisabled: true); clients.Add(perBucketCleaner); var details = await perBucketCleaner.ProcessClient(cleanupAtrs : false); activeClients.Add(clientUuid); foreach (var activeClient in activeClients) { Assert.Contains(details.ActiveClientIds, cid => cid == activeClient); } } } finally { foreach (var client in clients) { await client.DisposeAsync(); } } }
public async Task DefaultBucket_BasicBackgroundRun() { var loggerFactory = new ClusterFixture.TestOutputLoggerFactory(_outputHelper); var clientUuid = Guid.NewGuid().ToString(); var cleaner = new Cleaner(_fixture.Cluster, null, loggerFactory); var collection = await _fixture.OpenDefaultCollection(_outputHelper); var repo = new CleanerRepository(collection, null); PerBucketCleaner perBucketCleaner = null; try { perBucketCleaner = new PerBucketCleaner(clientUuid, cleaner, repo, TimeSpan.FromSeconds(0.1), loggerFactory); await Task.Delay(500); Assert.True(perBucketCleaner.Running); for (var i = 0; i < 10 && perBucketCleaner.RunCount < 1; i++) { await Task.Delay(500); } Assert.NotEqual(0, perBucketCleaner.RunCount); } finally { await perBucketCleaner.DisposeAsync(); } var recordFetch = await repo.GetClientRecord(); Assert.DoesNotContain(recordFetch.clientRecord.Clients, kvp => kvp.Key == clientUuid); Assert.False(perBucketCleaner.Running); }
private PerBucketCleaner CleanerForCollection(ICouchbaseCollection collection, bool startDisabled) { _logger.LogDebug("New cleaner for {collection}", collection.MakeKeyspace()); var repository = new CleanerRepository(collection, _keyValueTimeout); var cleaner = new Cleaner(_cluster, _keyValueTimeout, _loggerFactory, creatorName: nameof(LostTransactionManager)); return(new PerBucketCleaner(ClientUuid, cleaner, repository, _cleanupWindow, _loggerFactory, startDisabled) { TestHooks = TestHooks }); }
public async Task CreateRetrieveDeleteClientRecord() { string clientUuid = Guid.NewGuid().ToString(); _outputHelper.WriteLine($"clientUuid = {clientUuid}"); TimeSpan testCleanupWindow = TimeSpan.FromSeconds(2.51); var cluster = _fixture.GetCluster(); var loggerFactory = new ClusterFixture.TestOutputLoggerFactory(_outputHelper); var collection = await _fixture.OpenDefaultCollection(_outputHelper); var repo = new CleanerRepository(collection, null); try { await repo.CreatePlaceholderClientRecord(); _outputHelper.WriteLine("ClientRecord created fresh."); } catch (DocumentExistsException) { _outputHelper.WriteLine("ClientRecord already exists."); } catch (CasMismatchException) { _outputHelper.WriteLine("ClientRecord already exists."); } { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"Initial ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow); _outputHelper.WriteLine($"Initial ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}"); await repo.UpdateClientRecord(clientUuid, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds); } { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"Updated ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow); _outputHelper.WriteLine($"Updated ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}"); Assert.DoesNotContain(clientRecordDetails.ExpiredClientIds, s => s == clientUuid); Assert.Contains(clientRecordDetails.ActiveClientIds, s => s == clientUuid); foreach (var expiredId in clientRecordDetails.ExpiredClientIds) { Assert.DoesNotContain(clientRecordDetails.ActiveClientIds, s => s == expiredId); } } await repo.RemoveClient(clientUuid, KeyValue.DurabilityLevel.Majority); { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"After Remove ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow); _outputHelper.WriteLine($"After Remove ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}"); Assert.DoesNotContain(clientRecordDetails.ExpiredClientIds, s => s == clientUuid); Assert.DoesNotContain(clientRecordsIndex.Clients, s => s.Key == clientUuid); foreach (var expiredId in clientRecordDetails.ExpiredClientIds) { Assert.DoesNotContain(clientRecordDetails.ActiveClientIds, s => s == expiredId); } } }
public async Task TwoClientsDifferentAtrs() { string clientA = Guid.NewGuid().ToString(); string clientB = Guid.NewGuid().ToString(); _outputHelper.WriteLine($"clientA = {clientA}"); _outputHelper.WriteLine($"clientB = {clientA}"); TimeSpan testCleanupWindow = TimeSpan.FromSeconds(2.51); var cluster = _fixture.GetCluster(); var loggerFactory = new ClusterFixture.TestOutputLoggerFactory(_outputHelper); var collection = await _fixture.OpenDefaultCollection(_outputHelper); var repo = new CleanerRepository(collection, null); try { await repo.CreatePlaceholderClientRecord(); _outputHelper.WriteLine("ClientRecord created fresh."); } catch (DocumentExistsException) { _outputHelper.WriteLine("ClientRecord already exists."); } catch (CasMismatchException) { _outputHelper.WriteLine("ClientRecord already exists."); } { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"Initial ClientRecord before A created:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientA, testCleanupWindow); _outputHelper.WriteLine($"Initial ClientRecordDetails clientA:\n{JObject.FromObject(clientRecordDetails)}"); Assert.NotEqual(-1, clientRecordDetails.IndexOfThisClient); await repo.UpdateClientRecord(clientA, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds); } { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"Initial ClientRecord before B created.:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientB, testCleanupWindow); _outputHelper.WriteLine($"Initial ClientRecordDetails clientB:\n{JObject.FromObject(clientRecordDetails)}"); Assert.NotEqual(-1, clientRecordDetails.IndexOfThisClient); await repo.UpdateClientRecord(clientB, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds); } { (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord(); Assert.NotNull(clientRecordsIndex); Assert.NotNull(parsedHlc); _outputHelper.WriteLine($"Updated ClientRecord after both created:\n{JObject.FromObject(clientRecordsIndex)}"); var clientRecordDetailsA = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientA, testCleanupWindow); _outputHelper.WriteLine($"Updated ClientRecordDetails clientA:\n{JObject.FromObject(clientRecordDetailsA)}"); var clientRecordDetailsB = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientB, testCleanupWindow); _outputHelper.WriteLine($"Updated ClientRecordDetails clientB:\n{JObject.FromObject(clientRecordDetailsB)}"); Assert.DoesNotContain(clientRecordDetailsA.AtrsHandledByThisClient, s => clientRecordDetailsB.AtrsHandledByThisClient.Contains(s)); } await repo.RemoveClient(clientA); await repo.RemoveClient(clientB); }