// TODO: see if we can make this one command static void bulkSetRecords(stKVDatabase *database, stList *records) { startTransaction(database); stTry { for(int32_t i=0; i<stList_length(records); i++) { stKVDatabaseBulkRequest *request = stList_get(records, i); switch(request->type) { case UPDATE: updateRecord(database, request->key, request->value, request->size); break; case INSERT: insertRecord(database, request->key, request->value, request->size); break; case SET: setRecord(database, request->key, request->value, request->size); break; } } commitTransaction(database); }stCatch(ex) { abortTransaction(database); stThrowNewCause( ex, ST_KV_DATABASE_EXCEPTION_ID, "MySQL bulk set records failed"); }stTryEnd; }
Storage::~Storage() { if (d->inTransaction) { abortTransaction(); } delete d; }
TEST_F(TransactionCoordinatorServiceTestSingleTxn, CoordinateCommitWithNoVotesReturnsNotReadyFuture) { auto commitDecisionFuture = *coordinatorService()->coordinateCommit( operationContext(), _lsid, _txnNumber, kTwoShardIdSet); ASSERT_FALSE(commitDecisionFuture.isReady()); // To prevent invariant failure in TransactionCoordinator that all futures have been completed. abortTransaction(*coordinatorService(), _lsid, _txnNumber, kTwoShardIdSet, kTwoShardIdList[0]); }
TEST_F(TransactionCoordinatorServiceTestSingleTxn, ConcurrentCallsToCoordinateCommitReturnSameDecisionOnAbort) { auto commitDecisionFuture1 = *coordinatorService()->coordinateCommit( operationContext(), _lsid, _txnNumber, kTwoShardIdSet); auto commitDecisionFuture2 = *coordinatorService()->coordinateCommit( operationContext(), _lsid, _txnNumber, kTwoShardIdSet); abortTransaction(*coordinatorService(), _lsid, _txnNumber, kTwoShardIdSet, kTwoShardIdList[0]); ASSERT_EQ(static_cast<int>(commitDecisionFuture1.get()), static_cast<int>(commitDecisionFuture2.get())); }
//TODO: make one command static void bulkRemoveRecords(stKVDatabase *database, stList *records) { startTransaction(database); stTry { for(int32_t i=0; i<stList_length(records); i++) { stInt64Tuple *j = stList_get(records, i); removeRecord(database, stInt64Tuple_getPosition(j, 0)); } commitTransaction(database); }stCatch(ex) { abortTransaction(database); stThrowNewCause( ex, ST_KV_DATABASE_EXCEPTION_ID, "MySQL bulk remove records failed"); }stTryEnd; }
static stList *bulkGetRecordsRange(stKVDatabase *database, int64_t firstKey, int64_t numRecords) { stList* results = stList_construct3(numRecords, (void(*)(void *))stKVDatabaseBulkResult_destruct); startTransaction(database); stTry { for (int32_t i = 0; i < numRecords; ++i) { int64_t key = firstKey + i; int64_t recordSize; void* record = getRecord2(database, key, &recordSize); stKVDatabaseBulkResult* result = stKVDatabaseBulkResult_construct(record, recordSize); stList_set(results, i, result); } commitTransaction(database); }stCatch(ex) { abortTransaction(database); stThrowNewCause(ex, ST_KV_DATABASE_EXCEPTION_ID, "tokyo cabinet bulk get records failed"); }stTryEnd; return results; }
static int64_t incrementInt64(stKVDatabase *database, int64_t key, int64_t incrementAmount) { startTransaction(database); int64_t returnValue = INT64_MIN; stTry { int64_t recordSize; int64_t *record = getRecord2(database, key, &recordSize); assert(recordSize >= sizeof(int64_t)); record[0] += incrementAmount; returnValue = record[0]; updateRecord(database, key, record, recordSize); free(record); commitTransaction(database); }stCatch(ex) { abortTransaction(database); stThrowNewCause( ex, ST_KV_DATABASE_EXCEPTION_ID, "MySQL increment record failed"); }stTryEnd; return returnValue; }
void TransactionRouter::implicitlyAbortTransaction(OperationContext* opCtx, const Status& errorStatus) { if (_participants.empty()) { return; } if (_initiatedTwoPhaseCommit) { LOG(0) << _txnIdToString() << " Router not sending implicit abortTransaction because " "already initiated two phase commit for the transaction"; return; } LOG(0) << _txnIdToString() << " Implicitly aborting transaction on " << _participants.size() << " shard(s) due to error: " << errorStatus; try { abortTransaction(opCtx, true /*isImplicit*/); } catch (...) { // Ignore any exceptions. } }