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 TruncateLog(long lsn) { var continuationToken = default(TableContinuationToken); var query = new TableQuery <CommitRow>().Where(TableQuery.CombineFilters( TableQuery.GenerateFilterCondition(PartitionKey, QueryComparisons.Equal, commitRecordPartitionKey), TableOperators.And, TableQuery.CombineFilters( TableQuery.GenerateFilterCondition(RowKey, QueryComparisons.LessThanOrEqual, CommitRow.MakeRowKey(lsn)), TableOperators.And, TableQuery.GenerateFilterCondition(RowKey, QueryComparisons.GreaterThanOrEqual, CommitRow.MinRowKey)))); var batchOperation = new TableBatchOperation(); do { var queryResult = await table.ExecuteQuerySegmentedAsync(query, continuationToken).ConfigureAwait(false); continuationToken = queryResult.ContinuationToken; if (queryResult.Results.Count > 0) { foreach (var row in queryResult) { var transactions = DeserializeCommitRecords(row.Transactions); if (transactions.Count > 0 && transactions[transactions.Count - 1].LSN <= lsn) { batchOperation.Delete(row); if (this.archiveLogOptions.ArchiveLog) { var archiveRow = new ArchivalRow(this.clusterOptions, row.Transactions, transactions.Select(tx => tx.TransactionId).Min(), transactions.Select(tx => tx.LSN).Min()); batchOperation.Insert(archiveRow); } if (batchOperation.Count == BatchOperationLimit) { await table.ExecuteBatchAsync(batchOperation).ConfigureAwait(false); batchOperation = new TableBatchOperation(); } } else { break; } } } } while (continuationToken != default(TableContinuationToken)); if (batchOperation.Count > 0) { await table.ExecuteBatchAsync(batchOperation).ConfigureAwait(false); } }
public CommitRow(ClusterOptions clusterOptions, long firstLSN) { // All entities are in the same partition for atomic read/writes. PartitionKey = ArchivalRow.MakePartitionKey(clusterOptions.ServiceId); RowKey = MakeRowKey(firstLSN); }