void WdtResourceControllerTest::ReleaseStaleTest() { int maxNamespaces = 2; string transferPrefix = "add-objects-limit-transfer"; for (int namespaceNum = 1; namespaceNum <= maxNamespaces; namespaceNum++) { string wdtNamespace = "test-namespace-" + to_string(namespaceNum); registerWdtNamespace(wdtNamespace); } int index = 0; { string wdtNamespace = "test-namespace-1"; 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); index++; } ASSERT_TRUE(numSenders_ == 1); ASSERT_TRUE(numReceivers_ == 1); releaseAllSenders("test-namespace-1"); releaseAllReceivers("test-namespace-1"); ASSERT_TRUE(numSenders_ == 0); ASSERT_TRUE(numReceivers_ == 0); { string wdtNamespace = "test-namespace-1"; 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); senderPtr = getSender(wdtNamespace, getTransferId(transferPrefix, index)); receiverPtr = getReceiver(wdtNamespace, getTransferId(transferPrefix, index)); ASSERT_TRUE(senderPtr != nullptr); ASSERT_TRUE(receiverPtr != nullptr); code = releaseReceiver(wdtNamespace, getTransferId(transferPrefix, index)); EXPECT_EQ(code, OK); code = releaseReceiver(wdtNamespace, getTransferId(transferPrefix, index)); ASSERT_TRUE(code != OK); index++; } }
void WdtResourceControllerTest::MultipleNamespacesTest() { int namespaceNum = 0; int maxNamespaces = 5; int numSenders = 0; int numReceivers = 0; int numObjectsPerNamespace = 3; string transferPrefix = "add-objects-transfer"; for (; namespaceNum < maxNamespaces; namespaceNum++) { string wdtNamespace = "test-namespace-" + to_string(namespaceNum); registerWdtNamespace(wdtNamespace); for (int index = 0; index < numObjectsPerNamespace; 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(senderPtr != nullptr); ASSERT_TRUE(code == OK); ++numSenders; ++numReceivers; } } ASSERT_TRUE(numSenders_ == numSenders); ASSERT_TRUE(numReceivers_ == numReceivers); deRegisterWdtNamespace("test-namespace-1"); ASSERT_TRUE(numSenders_ == numSenders - numObjectsPerNamespace); ASSERT_TRUE(numReceivers_ == numReceivers - numObjectsPerNamespace); }
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); }
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::AddObjectsWithLimitsTest() { int maxNamespaces = 2; string transferPrefix = "add-objects-limit-transfer"; for (int namespaceNum = 1; namespaceNum <= maxNamespaces; namespaceNum++) { string wdtNamespace = "test-namespace-" + to_string(namespaceNum); registerWdtNamespace(wdtNamespace); } int index = 0; { string wdtNamespace = "test-namespace-1"; 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); index++; } { string wdtNamespace = "test-namespace-1"; auto transferRequest = makeTransferRequest(getTransferId(transferPrefix, index)); ReceiverPtr receiverPtr; ErrorCode code = createReceiver(wdtNamespace, transferRequest.transferId, transferRequest, receiverPtr); ASSERT_TRUE(code == QUOTA_EXCEEDED); ASSERT_TRUE(receiverPtr == nullptr); SenderPtr senderPtr; code = createSender(wdtNamespace, transferRequest.transferId, transferRequest, senderPtr); ASSERT_TRUE(code == OK); ASSERT_TRUE(senderPtr != nullptr); index++; } { string wdtNamespace = "test-namespace-2"; 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 == QUOTA_EXCEEDED); ASSERT_TRUE(senderPtr == nullptr); index++; } deRegisterWdtNamespace("test-namespace-1"); { string wdtNamespace = "test-namespace-2"; auto transferRequest = makeTransferRequest(getTransferId(transferPrefix, index)); ReceiverPtr receiverPtr; ErrorCode code = createReceiver(wdtNamespace, transferRequest.transferId, transferRequest, receiverPtr); ASSERT_TRUE(code == QUOTA_EXCEEDED); ASSERT_TRUE(receiverPtr == nullptr); SenderPtr senderPtr; code = createSender(wdtNamespace, transferRequest.transferId, transferRequest, senderPtr); ASSERT_TRUE(code == OK); ASSERT_TRUE(senderPtr != nullptr); index++; } }