Exemple #1
0
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);
}