Commit ed84ef14 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogDB): ушёл от использования глобального таймера проверки соединений.

Сделал на уровне отдельного Log-а.
parent cc7c1c60
...@@ -114,7 +114,6 @@ namespace uniset ...@@ -114,7 +114,6 @@ namespace uniset
\todo Возможно в /logs стоит в ответе сразу возвращать и общее количество в БД (это один лишний запрос, каждый раз). \todo Возможно в /logs стоит в ответе сразу возвращать и общее количество в БД (это один лишний запрос, каждый раз).
\todo Возможно в последствии оптимизировать таблицы (нормализовать) если будет тормозить. Сейчас пока прототип. \todo Возможно в последствии оптимизировать таблицы (нормализовать) если будет тормозить. Сейчас пока прототип.
\todo Пока не очень эффективная работа с датой и временем (заодно подумать всё-таки в чём хранить) \todo Пока не очень эффективная работа с датой и временем (заодно подумать всё-таки в чём хранить)
\todo WebSocket: Доделать ограничение на размер буфера для каждого сокета
\todo WebSocket: доделать настройку всевозможных timeout-ов \todo WebSocket: доделать настройку всевозможных timeout-ов
\todo WebSocket: доделать проверку соединения \todo WebSocket: доделать проверку соединения
\todo WebSocket: сделать ограничение на максимальное количество соединений (websocket) \todo WebSocket: сделать ограничение на максимальное количество соединений (websocket)
...@@ -155,8 +154,8 @@ namespace uniset ...@@ -155,8 +154,8 @@ namespace uniset
virtual void evfinish() override; virtual void evfinish() override;
virtual void evprepare() override; virtual void evprepare() override;
void onTimer( ev::timer& t, int revents );
void onCheckBuffer( ev::timer& t, int revents ); void onCheckBuffer( ev::timer& t, int revents );
void onActivate( ev::async& watcher, int revents ) ;
void addLog( Log* log, const std::string& txt ); void addLog( Log* log, const std::string& txt );
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
...@@ -172,7 +171,6 @@ namespace uniset ...@@ -172,7 +171,6 @@ namespace uniset
std::shared_ptr<LogWebSocket> newWebSocket(Poco::Net::HTTPServerRequest* req, Poco::Net::HTTPServerResponse* resp, const std::string& logname ); std::shared_ptr<LogWebSocket> newWebSocket(Poco::Net::HTTPServerRequest* req, Poco::Net::HTTPServerResponse* resp, const std::string& logname );
void delWebSocket( std::shared_ptr<LogWebSocket>& ws ); void delWebSocket( std::shared_ptr<LogWebSocket>& ws );
void onPingWebSockets( ev::timer& t, int revents );
#endif #endif
std::string myname; std::string myname;
std::unique_ptr<SQLiteInterface> db; std::unique_ptr<SQLiteInterface> db;
...@@ -183,8 +181,12 @@ namespace uniset ...@@ -183,8 +181,12 @@ namespace uniset
QueryBuffer qbuf; QueryBuffer qbuf;
size_t qbufSize = { 200 }; // размер буфера сообщений. size_t qbufSize = { 200 }; // размер буфера сообщений.
ev::timer flushBufferTimer;
double tmFlushBuffer_sec = { 1.0 };
void flushBuffer(); void flushBuffer();
ev::async wsactivate; // активация LogWebSocket-ов
class Log class Log
{ {
public: public:
...@@ -197,9 +199,10 @@ namespace uniset ...@@ -197,9 +199,10 @@ namespace uniset
std::shared_ptr<DebugStream> dblog; std::shared_ptr<DebugStream> dblog;
bool connect() noexcept;
bool isConnected() const; bool isConnected() const;
void ioprepare( ev::dynamic_loop& loop );
void set( ev::dynamic_loop& loop );
void check( ev::timer& t, int revents );
void event( ev::io& watcher, int revents ); void event( ev::io& watcher, int revents );
void read( ev::io& watcher ); void read( ev::io& watcher );
void write( ev::io& io ); void write( ev::io& io );
...@@ -208,12 +211,20 @@ namespace uniset ...@@ -208,12 +211,20 @@ namespace uniset
typedef sigc::signal<void, Log*, const std::string&> ReadSignal; typedef sigc::signal<void, Log*, const std::string&> ReadSignal;
ReadSignal signal_on_read(); ReadSignal signal_on_read();
protected:
void ioprepare();
bool connect() noexcept;
private: private:
ReadSignal sigRead; ReadSignal sigRead;
ev::io io; ev::io io;
ev::timer iocheck;
double checkConnection_sec = { 5.0 };
std::shared_ptr<UTCPStream> tcp; std::shared_ptr<UTCPStream> tcp;
static const int bufsize = { 10001 }; static const int bufsize = { 10001 };
char buf[bufsize]; char buf[bufsize]; // буфер для чтения сообщений
static const size_t reservsize = { 1000 }; static const size_t reservsize = { 1000 };
std::string text; std::string text;
...@@ -225,16 +236,6 @@ namespace uniset ...@@ -225,16 +236,6 @@ namespace uniset
std::vector< std::shared_ptr<Log> > logservers; std::vector< std::shared_ptr<Log> > logservers;
std::shared_ptr<DebugStream> dblog; std::shared_ptr<DebugStream> dblog;
ev::timer connectionTimer;
timeout_t tmConnection_msec = { 5000 }; // пауза между попытками установить соединение
double tmConnection_sec = { 0.0 };
ev::timer checkBufferTimer;
double tmCheckBuffer_sec = { 1.0 };
ev::timer pingWebSockets;
double tmPingWebSockets_sec = { 3.0 };
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
std::shared_ptr<Poco::Net::HTTPServer> httpserv; std::shared_ptr<Poco::Net::HTTPServer> httpserv;
std::string httpHost = { "" }; std::string httpHost = { "" };
...@@ -246,14 +247,18 @@ namespace uniset ...@@ -246,14 +247,18 @@ namespace uniset
public: public:
LogWebSocket(Poco::Net::HTTPServerRequest* req, LogWebSocket(Poco::Net::HTTPServerRequest* req,
Poco::Net::HTTPServerResponse* resp, Poco::Net::HTTPServerResponse* resp,
std::shared_ptr<Log>& log, std::shared_ptr<Log>& log );
ev::dynamic_loop& loop );
virtual ~LogWebSocket(); virtual ~LogWebSocket();
void event( ev::io& watcher, int revents ); // конечно некрасиво что это в public
std::shared_ptr<DebugStream> dblog;
bool isActive();
void start( ev::dynamic_loop& loop );
void ping(); void event( ev::io& watcher, int revents );
void ping( ev::timer& t, int revents );
void add( Log* log, const std::string& txt ); void add( Log* log, const std::string& txt );
...@@ -266,6 +271,8 @@ namespace uniset ...@@ -266,6 +271,8 @@ namespace uniset
void write( ev::io& w ); void write( ev::io& w );
ev::io io; ev::io io;
ev::timer ioping;
double ping_sec = { 3.0 };
std::mutex finishmut; std::mutex finishmut;
std::condition_variable finish; std::condition_variable finish;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment