Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
 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);
 }