/* * ConflictSet.h * * This source file is part of the FoundationDB open source project * * Copyright 2013-2018 Apple Inc. and the FoundationDB project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef CONFLICTSET_H #define CONFLICTSET_H #pragma once #include #include #include "fdbclient/CommitTransaction.h" struct ConflictSet; ConflictSet* newConflictSet(); void clearConflictSet( ConflictSet*, Version ); void destroyConflictSet(ConflictSet*); struct ConflictBatch { explicit ConflictBatch( ConflictSet*, std::map< int, Standalone>>* conflictingKeyRangeMap = nullptr); ~ConflictBatch(); enum TransactionCommitResult { TransactionConflict = 0, TransactionTooOld, TransactionCommitted, }; void addTransaction( const CommitTransactionRef& transaction ); void detectConflicts(Version now, Version newOldestVersion, std::vector& nonConflicting, std::vector* tooOldTransactions = NULL); void GetTooOldTransactions(std::vector& tooOldTransactions); private: ConflictSet* cs; Standalone< VectorRef< struct TransactionInfo* > > transactionInfo; std::vector points; int transactionCount; std::vector< std::pair > combinedWriteConflictRanges; std::vector< struct ReadConflictRange > combinedReadConflictRanges; bool* transactionConflictStatus; std::map< int, Standalone< VectorRef< KeyRangeRef > > >* conflictingKeyRangeMap; void checkIntraBatchConflicts(); void combineWriteConflictRanges(); void checkReadConflictRanges(); void mergeWriteConflictRanges(Version now); void addConflictRanges(Version now, std::vector< std::pair >::iterator begin, std::vector< std::pair >::iterator end, class SkipList* part); }; #endif