Files
Rediska/rediska/worker/FrontendWorker.cpp
Nikita Astafyev 35a6349071
Some checks failed
Code Analysis / analysis (push) Failing after 2m59s
chore: initial commit
2025-12-30 22:34:58 +07:00

124 lines
5.1 KiB
C++

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <grpcpp/grpcpp.h>
#include "google/protobuf/empty.pb.h"
#include "v1/primitives/bool.grpc.pb.h"
#include "v1/primitives/int.grpc.pb.h"
#include "v1/primitives/string.grpc.pb.h"
#include "v1/collections/list.grpc.pb.h"
#include "rediska/common/QueueMessage.hpp"
#include "rediska/frontend/RequestManager.hpp"
#include "rediska/frontend/server.hpp"
#include "rediska/cache/lru/LRU.hpp"
namespace {
class FrontendWorker {
public:
void Enqueue(QueueMessage msg) {
std::lock_guard<std::mutex> lock(mtx_);
queue_.push(std::move(msg));
cv_.notify_one();
}
void Run() {
for (;;) {
QueueMessage msg;
{
std::unique_lock<std::mutex> lock(mtx_);
cv_.wait(lock, [&] { return !queue_.empty(); });
msg = std::move(queue_.front());
queue_.pop();
}
std::cout << "[worker] key=" << msg.key
<< " type=" << static_cast<int>(msg.type)
<< " op=" << static_cast<int>(msg.operation) << std::endl;
if (!msg.responder) continue;
try {
switch (msg.operation) {
case OperationId::SET: {
if (msg.type == CacheValueId::ARRAY) {
v1::collections::list::ListSetResponse response;
msg.respond<v1::collections::list::ListSetResponse>(response);
} else {
msg.respond<google::protobuf::Empty>(google::protobuf::Empty{});
}
break;
}
case OperationId::GET: {
if (msg.type == CacheValueId::BOOLEAN) {
v1::primitives::boolean::BoolGetResponse response;
response.set_value(false);
msg.respond<v1::primitives::boolean::BoolGetResponse>(response);
} else if (msg.type == CacheValueId::INT) {
v1::primitives::integer::IntGetResponse response;
response.set_value(0);
msg.respond<v1::primitives::integer::IntGetResponse>(response);
} else if (msg.type == CacheValueId::STRING) {
v1::primitives::str::StringGetResponse response;
response.set_value("cached_value");
msg.respond<v1::primitives::str::StringGetResponse>(response);
} else if (msg.type == CacheValueId::ARRAY) {
v1::collections::list::ListGetResponse response;
msg.respond<v1::collections::list::ListGetResponse>(response);
}
break;
}
case OperationId::DELETE: {
if (msg.type == CacheValueId::BOOLEAN) {
v1::primitives::boolean::BoolDeleteResponse response;
response.set_removed_value(false);
msg.respond<v1::primitives::boolean::BoolDeleteResponse>(response);
} else if (msg.type == CacheValueId::INT) {
v1::primitives::integer::IntDeleteResponse response;
response.set_removed_value(0);
msg.respond<v1::primitives::integer::IntDeleteResponse>(response);
} else if (msg.type == CacheValueId::STRING) {
v1::primitives::str::StringDeleteResponse response;
response.set_removed_value("");
msg.respond<v1::primitives::str::StringDeleteResponse>(response);
} else if (msg.type == CacheValueId::ARRAY) {
msg.respond<google::protobuf::Empty>(google::protobuf::Empty{});
}
break;
}
case OperationId::LIST_PUSH_BACK:
case OperationId::LIST_POP_BACK:
case OperationId::LIST_INSERT:
case OperationId::LIST_ERASE: {
msg.respond<google::protobuf::Empty>(google::protobuf::Empty{});
break;
}
default:
break;
}
} catch (const std::exception& e) {
std::cout << "Error processing message: " << e.what() << std::endl;
}
}
}
private:
std::queue<QueueMessage> queue_;
std::mutex mtx_;
std::condition_variable cv_;
};
} // namespace
int run_frontend_server() {
FrontendWorker worker;
std::thread t([&] { worker.Run(); });
RunFrontendServer("0.0.0.0:50051", [&](QueueMessage msg) {
worker.Enqueue(std::move(msg));
});
t.join();
return 0;
}