*/
#include <cinttypes>
+#include <cpu-boosting.h>
#include <memory>
+#include <unistd.h>
#include <cache/CapacityCache.h>
#include <common.h>
#include <config/PathConfig.h>
+#include <cpu-priority/cpu-priority.h>
#include <exceptions/Exception.h>
#include <exceptions/NoMemoryException.h>
#include <exceptions/UnexpectedErrorException.h>
#include <response/CheckResponse.h>
#include <response/SimpleCheckResponse.h>
#include <sockets/Socket.h>
+#include <utils/CallInDestructor.h>
#include "Logic.h"
}
m_statusCallback.onDisconnected();
+
+ if (m_requestsInFlightNum > 0 &&
+ resource_clear_cpu_inheritance(gettid(), RESOURCE_CPU_DEST_NAME) != 0)
+ LOGE("resource_clear_cpu_inheritance failed");
}
void Logic::tryFlushMonitor(void) {
}
}
+void Logic::requestStartAction() {
+ ++m_requestsInFlightNum;
+ LOGD("client-async: requests in flight increased to %zu", m_requestsInFlightNum);
+}
+
+void Logic::requestCompletedOrCancelledAction() {
+ --m_requestsInFlightNum;
+ LOGD("client-async: requests in flight decreased to %zu", m_requestsInFlightNum);
+ if (m_requestsInFlightNum == 0 &&
+ resource_clear_cpu_inheritance(gettid(), RESOURCE_CPU_DEST_NAME) != 0)
+ LOGE("resource_clear_cpu_inheritance failed");
+}
+
int Logic::checkCache(const std::string &client, const std::string &session,
const std::string &user, const std::string &privilege) {
if (!m_operationPermitted)
if (!m_operationPermitted)
return CYNARA_API_OPERATION_NOT_ALLOWED;
+ requestStartAction();
+ bool requestScheduled = false;
+ auto requestGuard = CallInDestructor{[&] {
+ if (!requestScheduled)
+ requestCompletedOrCancelledAction();
+ }};
+
if (!ensureConnection())
return CYNARA_API_SERVICE_NOT_AVAILABLE;
m_socketClient.appendRequest(SimpleCheckRequest(key, sequenceNumber));
else
m_socketClient.appendRequest(CheckRequest(key, sequenceNumber));
+ requestScheduled = true;
onStatusChange(m_socketClient.getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
checkId = static_cast<cynara_check_id>(sequenceNumber);
if (it->second.cancelled()) {
m_sequenceContainer.release(it->first);
it = m_checks.erase(it);
+ requestCompletedOrCancelledAction();
} else {
if (it->second.isSimple())
m_socketClient.appendRequest(SimpleCheckRequest(it->second.key(), it->first));
else
m_socketClient.appendRequest(CheckRequest(it->second.key(), it->first));
+ // The request is already started, it is just resent now
++it;
}
}
}
bool Logic::processOut(void) {
+ // Boost cynara CPU priority before sending requests to it.
+ if (resource_set_cpu_inheritance(gettid(), RESOURCE_CPU_DEST_NAME, 1000) != 0)
+ LOGE("resource_set_cpu_inheritance failed");
+
switch (m_socketClient.sendToCynara()) {
case Socket::SendStatus::ALL_DATA_SENT:
onStatusChange(m_socketClient.getSockFd(),
void Logic::releaseRequest(Logic::CheckMap::iterator reqIt) {
m_sequenceContainer.release(reqIt->first);
m_checks.erase(reqIt);
+ requestCompletedOrCancelledAction();
}
void Logic::processCheckResponse(const CheckResponse &checkResponse) {
}
bool Logic::connect(void) {
+ // Boost cynara CPU priority before connecting to it.
+ if (resource_set_cpu_inheritance(gettid(), RESOURCE_CPU_DEST_NAME, 1000) != 0)
+ LOGE("resource_set_cpu_inheritance failed");
+
switch (m_socketClient.connect()) {
case Socket::ConnectionStatus::CONNECTION_SUCCEEDED:
prepareRequestsToSend();