22#include <glog/logging.h>
28#include "platform/proto/broadcast.pb.h"
33 std::unique_ptr<ServiceInterface> service)
34 : service_(std::move(service)),
35 input_queue_(
"input"),
39 sa.sa_handler = SIG_IGN;
41 if (sigemptyset(&sa.sa_mask) == -1 || sigaction(SIGPIPE, &sa, 0) == -1) {
42 perror(
"failed to ignore SIGPIPE; sigaction");
46 acceptor_ = std::make_unique<Acceptor>(config, &input_queue_);
48 async_acceptor_ = std::make_unique<AsyncAcceptor>(
51 std::bind(&ServiceNetwork::AcceptorHandler,
this, std::placeholders::_1,
52 std::placeholders::_2));
53 async_acceptor_->StartAccept();
59void ServiceNetwork::AcceptorHandler(
const char* buffer,
size_t data_len) {
61 if (!
data.ParseFromArray(buffer, data_len)) {
62 LOG(ERROR) <<
"parse broad cast fail:" << data_len;
67 std::unique_ptr<DataInfo> sub_request_info = std::make_unique<DataInfo>();
68 sub_request_info->data_len = sub_data.size();
69 sub_request_info->buff =
new char[sub_request_info->data_len];
70 memcpy(sub_request_info->buff, sub_data.data(), sub_request_info->data_len);
71 std::unique_ptr<QueueItem> item = std::make_unique<QueueItem>();
72 item->socket =
nullptr;
73 item->data = std::move(sub_request_info);
77 input_queue_.
Push(std::move(item));
81void ServiceNetwork::InputProcess() {
82 std::vector<std::thread> threads;
84 int woker_num =
config_.GetWorkerNum();
85 LOG(ERROR) <<
"server:" <<
config_.GetSelfInfo().id() <<
" start running";
86 for (
int i = 0; i < woker_num; ++i) {
87 threads.push_back(std::thread([&]() {
89 std::unique_ptr<QueueItem> item = input_queue_.
Pop(1000);
90 if (item ==
nullptr) {
94 Process(std::move(item));
99 for (
auto& th : threads) {
108 auto input_th = std::thread(&ServiceNetwork::InputProcess,
this);
116void ServiceNetwork::Process(std::unique_ptr<QueueItem> item) {
118 item->socket ==
nullptr ? nullptr : std::move(item->socket);
119 auto request_info = std::move(item->data);
120 if (client_socket !=
nullptr) {
121 client_socket->SetSendTimeout(1000000);
123 std::unique_ptr<Context> context = std::make_unique<Context>();
124 context->client = std::make_unique<NetChannel>(std::move(client_socket),
127 service_->Process(std::move(context), std::move(request_info));
132bool ServiceNetwork::IsRunning() {
return service_->IsRunning(); }
void Push(std::unique_ptr< T > data)
std::unique_ptr< T > Pop(int timeout_ms=100)
uint32_t GetInputWorkerNum() const
const ReplicaInfo & GetSelfInfo() const
virtual ~ServiceNetwork()
ServiceNetwork(const ResDBConfig &config, std::unique_ptr< ServiceInterface > service)
bool ServiceIsReady() const
static Stats * GetGlobalStats(int sleep_seconds=5)
std::unique_ptr< ResDBConfig > config_