ErrorCode Wdt::wdtSend(const std::string &wdtNamespace, const WdtTransferRequest &req, std::shared_ptr<IAbortChecker> abortChecker, bool terminateExistingOne) { if (!settingsApplied_) { applySettings(); } if (req.errorCode != OK) { LOG(ERROR) << "Transfer request error " << errorCodeToStr(req.errorCode); return req.errorCode; } // Protocol issues will/should be flagged as error when we call createSender // try to create sender SenderPtr sender; auto wdtController = WdtResourceController::get(); // TODO should be using recoverid const std::string secondKey = req.hostName; ErrorCode errCode = wdtController->createSender(wdtNamespace, secondKey, req, sender); if (errCode == ALREADY_EXISTS && terminateExistingOne) { LOG(WARNING) << "Found pre-existing sender for " << wdtNamespace << " " << secondKey << " aborting it and making a new one"; sender->abort(ABORTED_BY_APPLICATION); // This may log an error too wdtController->releaseSender(wdtNamespace, secondKey); // Try#2 errCode = wdtController->createSender(wdtNamespace, secondKey, req, sender); } if (errCode != OK) { LOG(ERROR) << "Failed to create sender " << errorCodeToStr(errCode) << " " << wdtNamespace << " " << secondKey; return errCode; } wdtSetAbortSocketCreatorAndReporter(wdtNamespace, sender.get(), req, abortChecker); auto transferReport = sender->transfer(); ErrorCode ret = transferReport->getSummary().getErrorCode(); wdtController->releaseSender(wdtNamespace, secondKey); LOG(INFO) << "wdtSend for " << wdtNamespace << " " << secondKey << " " << " ended with " << errorCodeToStr(ret); return ret; }
void WdtResourceControllerTest::AddObjectsWithNoLimitsTest() { string wdtNamespace = "test-namespace-1"; registerWdtNamespace(wdtNamespace); int index = 0; string transferPrefix = "add-objects-transfer"; for (; index < 3; index++) { auto transferRequest = makeTransferRequest(getTransferId(transferPrefix, index)); ReceiverPtr receiverPtr; ErrorCode code = createReceiver(wdtNamespace, transferRequest.transferId, transferRequest, receiverPtr); ASSERT_TRUE(code == OK); ASSERT_TRUE(receiverPtr != nullptr); SenderPtr senderPtr; code = createSender(wdtNamespace, transferRequest.transferId, transferRequest, senderPtr); ASSERT_TRUE(code == OK); ASSERT_TRUE(senderPtr != nullptr); if (index == 1) { SenderPtr oldSender; code = createSender(wdtNamespace, transferRequest.transferId, transferRequest, oldSender); EXPECT_EQ(code, ALREADY_EXISTS); EXPECT_EQ(senderPtr, oldSender); ReceiverPtr oldReceiver; code = createReceiver(wdtNamespace, transferRequest.transferId, transferRequest, oldReceiver); EXPECT_EQ(code, ALREADY_EXISTS); EXPECT_EQ(receiverPtr, oldReceiver); } } EXPECT_EQ(getAllReceivers(wdtNamespace).size(), index); EXPECT_EQ(getAllSenders(wdtNamespace).size(), index); int numSenders = index; int numReceivers = index; ErrorCode code = releaseSender(wdtNamespace, getTransferId(transferPrefix, 0)); ASSERT_TRUE(code == OK); code = releaseReceiver(wdtNamespace, getTransferId(transferPrefix, 0)); ASSERT_TRUE(code == OK); EXPECT_EQ(numSenders_, numSenders - 1); EXPECT_EQ(numReceivers_, numReceivers - 1); }