public AzureTransactionLogStorage(SerializationManager serializationManager, IOptions <AzureTransactionLogOptions> configurationOptions, IOptions <AzureTransactionArchiveLogOptions> archiveOptions, IOptions <ClusterOptions> clusterOptions) { this.serializationManager = serializationManager; this.options = configurationOptions.Value; this.clusterOptions = clusterOptions.Value; this.archiveLogOptions = archiveOptions.Value; this.commitRecordPartitionKey = ArchivalRow.MakePartitionKey(this.clusterOptions.ServiceId); }
public async Task TransactionLogCanArchiveAndQuery() { var azureOptions = new AzureTransactionLogOptions() { ConnectionString = TestDefaultConfiguration.DataConnectionString, TableName = "TransactionLog" }; var archiveOptions = new AzureTransactionArchiveLogOptions() { ArchiveLog = true }; var logStorage = await StorageFactory(azureOptions, archiveOptions); var recordsNum = 20; var allTransactions = new List <CommitRecord>(recordsNum); for (int i = 0; i < recordsNum; i++) { allTransactions.Add(new CommitRecord() { LSN = i, TransactionId = i }); } await logStorage.Append(allTransactions); //all transactions will be archived var maxSLN = recordsNum - 11; await logStorage.TruncateLog(maxSLN); //get all archived records var archQuery = new TableQuery <AzureTransactionLogStorage.ArchivalRow>().Where(TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, AzureTransactionLogStorage.ArchivalRow.MakePartitionKey(ClusterServiceId)), TableOperators.And, TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, AzureTransactionLogStorage.ArchivalRow.MaxRowKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, AzureTransactionLogStorage.ArchivalRow.MinRowKey)))); var archivalTransactions = await logStorage.QueryArchivalRecords(archQuery); //query remaining commited records var cmQuery = new TableQuery <AzureTransactionLogStorage.ArchivalRow>().Where(TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, AzureTransactionLogStorage.ArchivalRow.MakePartitionKey(ClusterServiceId)), TableOperators.And, TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, AzureTransactionLogStorage.CommitRow.MaxRowKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, AzureTransactionLogStorage.CommitRow.MinRowKey)))); var commitTransactions = await logStorage.QueryArchivalRecords(cmQuery); //assert a subset of transaction has been archived Assert.Equal(allTransactions.FindAll(r => r.LSN <= maxSLN).Select(r => r.LSN).Distinct(), archivalTransactions.Select(tx => tx.LSN).Distinct()); //assert the remaining transactions still isn't archived Assert.Equal(allTransactions.FindAll(r => r.LSN > maxSLN).Select(r => r.LSN).Distinct(), commitTransactions.Select(tx => tx.LSN).Distinct()); }
private static async Task <AzureTransactionLogStorage> StorageFactory(AzureTransactionLogOptions azureOptions, AzureTransactionArchiveLogOptions archiveOptions) { var config = new ClientConfiguration(); var environment = SerializationTestEnvironment.InitializeWithDefaults(config); var azureConfig = Options.Create(azureOptions); AzureTransactionLogStorage storage = new AzureTransactionLogStorage(environment.SerializationManager, azureConfig, Options.Create(archiveOptions), Options.Create(new ClusterOptions() { ClusterId = Guid.NewGuid().ToString(), ServiceId = ClusterServiceId })); await storage.Initialize(); return(storage); }