Esempio n. 1
0
void LogCollector::startLogUploadCheckTimer()
{
    logUploadCheckTimer_.stop();
    logUploadCheckTimer_.start(uploadStrategy_->getLogUploadCheckPeriod(),[this]
    {
        processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus()));
    });
}
Esempio n. 2
0
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()));
}
Esempio n. 3
0
void LogCollector::addLogRecord(const KaaUserLogRecord& record)
{
    LogRecordPtr serializedRecord(new LogRecord(record));

    KAA_MUTEX_LOCKING("storageGuard_");
    KAA_MUTEX_UNIQUE_DECLARE(lock, storageGuard_);
    KAA_MUTEX_LOCKED("storageGuard_");
    storage_->addLogRecord(serializedRecord);

    KAA_MUTEX_UNLOCKING("storageGuard_");
    KAA_UNLOCK(lock);
    KAA_MUTEX_UNLOCKED("storageGuard_");

    processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus()));

}
Esempio n. 4
0
void LogCollector::processTimeout()
{
    executorContext_.getCallbackExecutor().add([this] () { uploadStrategy_->onTimeout(*this); });

    KAA_LOG_WARN(boost::format("Going to notify log storage of logs delivery timeout..."));

    KAA_MUTEX_LOCKING("timeoutsGuard_");
    KAA_MUTEX_UNIQUE_DECLARE(timeoutsGuardLock, timeoutsGuard_);
    KAA_MUTEX_LOCKED("timeoutsGuard_");

    for (const auto& request : timeouts_) {
        storage_->notifyUploadFailed(request.first);
    }

    timeouts_.clear();

    KAA_MUTEX_UNLOCKING("timeoutsGuard_");
    KAA_UNLOCK(timeoutsGuardLock);
    KAA_MUTEX_UNLOCKED("timeoutsGuard_");

    processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus()));
}
Esempio n. 5
0
void LogCollector::addLogRecord(const KaaUserLogRecord& record)
{
    /*
     * To avoid overhead on copying big-sized log records while capturing in lambdas,
     * serialization has been performed before adding task to executor.
     */
    LogRecordPtr serializedRecord(new LogRecord(record));

    executorContext_.getApiExecutor().add([this, serializedRecord] ()
            {
                KAA_MUTEX_LOCKING("storageGuard_");
                KAA_MUTEX_UNIQUE_DECLARE(lock, storageGuard_);
                KAA_MUTEX_LOCKED("storageGuard_");

                storage_->addLogRecord(serializedRecord);

                KAA_MUTEX_UNLOCKING("storageGuard_");
                KAA_UNLOCK(lock);
                KAA_MUTEX_UNLOCKED("storageGuard_");

                processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus()));
            });
}
Esempio n. 6
0
void LogCollector::processLogUploadDecision(LogUploadStrategyDecision decision)
{
    switch (decision) {
    case LogUploadStrategyDecision::UPLOAD: {
        KAA_LOG_DEBUG("Going to upload logs");
        doSync();
        break;
    }
    case LogUploadStrategyDecision::NOOP:
        KAA_LOG_TRACE("Nothing to do now");
        if (storage_->getStatus().getRecordsCount() > 0) {
            logUploadCheckTimer_.stop();
            logUploadCheckTimer_.start(uploadStrategy_->getLogUploadCheckPeriod(),[&]
            {
                processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus()));
            });
        }
        break;
    default:
        KAA_LOG_WARN("Unknown log upload decision");
        break;
    }
}