void LogCollector::onLogUploadResponse(const LogSyncResponse& response) { KAA_MUTEX_LOCKING("storageGuard_"); KAA_MUTEX_UNIQUE_DECLARE(storageGuardLock, storageGuard_); KAA_MUTEX_LOCKED("storageGuard_"); if (!response.deliveryStatuses.is_null()) { const auto& deliveryStatuses = response.deliveryStatuses.get_array(); for (const auto& status : deliveryStatuses) { if (!removeDeliveryTimeout(status.requestId)) { continue; } if (status.result == SyncResponseResultType::SUCCESS) { KAA_LOG_INFO(boost::format("Logs (requestId %ld) successfully delivered") % status.requestId); storage_->removeRecordBlock(status.requestId); } else { storage_->notifyUploadFailed(status.requestId); KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(storageGuardLock); KAA_MUTEX_UNLOCKED("storageGuard_"); if (!status.errorCode.is_null()) { auto errocCode = status.errorCode.get_LogDeliveryErrorCode(); KAA_LOG_WARN(boost::format("Logs (requestId %ld) failed to deliver (error %d)") % status.requestId % (int)errocCode); executorContext_.getCallbackExecutor().add([this, errocCode] () { uploadStrategy_->onFailure(*this, errocCode); }); } else { KAA_LOG_WARN("Log delivery failed, but no error code received"); } KAA_MUTEX_LOCKING("storageGuard_"); KAA_LOCK(storageGuardLock); KAA_MUTEX_LOCKED("storageGuard_"); } } } KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(storageGuardLock); KAA_MUTEX_UNLOCKED("storageGuard_"); processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }
void DefaultOperationTcpChannel::openConnection() { if (isConnected_) { KAA_LOG_WARN(boost::format("Channel [%1%] connection is already opened") % getId()); return; } KAA_LOG_TRACE(boost::format("Channel [%1%] opening connection to %2%:%3%") % getId() % currentServer_->getHost() % currentServer_->getPort()); boost::system::error_code errorCode; boost::asio::ip::tcp::endpoint ep = HttpUtils::resolveEndpoint(currentServer_->getHost(), currentServer_->getPort(), errorCode); if (errorCode) { KAA_LOG_ERROR(boost::format("Channel [%1%] failed to resolve endpoint: %2%") % getId() % errorCode.message()); onServerFailed(); return; } responseBuffer_.reset(new boost::asio::streambuf()); sock_.reset(new boost::asio::ip::tcp::socket(io_)); sock_->open(ep.protocol(), errorCode); if (errorCode) { KAA_LOG_ERROR(boost::format("Channel [%1%] failed to open socket: %2%") % getId() % errorCode.message()); onServerFailed(); return; } sock_->connect(ep, errorCode); if (errorCode) { KAA_LOG_ERROR(boost::format("Channel [%1%] failed to connect to %2%:%3%: %4%") % getId() % ep.address().to_string() % ep.port() % errorCode.message()); onServerFailed(); return; } channelManager_.onConnected({sock_->local_endpoint().address().to_string(), ep.address().to_string(), getServerType()}); KAA_MUTEX_LOCKING("channelGuard_"); KAA_LOCK(channelGuard_); KAA_MUTEX_LOCKED("channelGuard_"); isConnected_ = true; KAA_MUTEX_UNLOCKING("channelGuard_"); KAA_UNLOCK(channelGuard_); KAA_MUTEX_UNLOCKED("channelGuard_"); sendConnect(); setConnAckTimer(); readFromSocket(); setPingTimer(); }