|
UniSet
2.6.0
|
00001 /* 00002 * Copyright (c) 2015 Pavel Vainerman. 00003 * 00004 * This program is free software: you can redistribute it and/or modify 00005 * it under the terms of the GNU Lesser General Public License as 00006 * published by the Free Software Foundation, version 2.1. 00007 * 00008 * This program is distributed in the hope that it will be useful, but 00009 * WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 * Lesser General Lesser Public License for more details. 00012 * 00013 * You should have received a copy of the GNU Lesser General Public License 00014 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00015 */ 00016 // ------------------------------------------------------------------------- 00017 #ifndef LogSession_H_ 00018 #define LogSession_H_ 00019 // ------------------------------------------------------------------------- 00020 #include <string> 00021 #include <memory> 00022 #include <queue> 00023 #include <ev++.h> 00024 #include "Poco/Net/StreamSocket.h" 00025 #include "Mutex.h" 00026 #include "DebugStream.h" 00027 #include "UTCPCore.h" 00028 #include "UTCPStream.h" 00029 #include "LogAgregator.h" 00030 #ifndef DISABLE_REST_API 00031 #include <Poco/JSON/Object.h> 00032 #endif 00033 // ------------------------------------------------------------------------- 00034 namespace uniset 00035 { 00036 00038 class LogSession 00039 { 00040 public: 00041 00042 LogSession( const Poco::Net::StreamSocket& s, std::shared_ptr<DebugStream>& log, timeout_t cmdTimeout = 2000, timeout_t checkConnectionTime = 10000 ); 00043 ~LogSession(); 00044 00045 typedef sigc::slot<void, LogSession*> FinalSlot; 00046 void connectFinalSession( FinalSlot sl ) noexcept; 00047 00048 // сигнал о приходе команды: std::string func( LogSession*, command, logname ); 00049 // \return какую-то информацию, которая будет послана client-у. Если return.empty(), то ничего послано не будет. 00050 typedef sigc::signal<std::string, LogSession*, LogServerTypes::Command, const std::string& > LogSessionCommand_Signal; 00051 LogSessionCommand_Signal signal_logsession_command(); 00052 00053 // прервать работу 00054 void cancel() noexcept; 00055 00056 inline std::string getClientAddress() const noexcept 00057 { 00058 return caddr; 00059 } 00060 00061 inline void setSessionLogLevel( Debug::type t ) noexcept 00062 { 00063 mylog.level(t); 00064 } 00065 inline void addSessionLogLevel( Debug::type t ) noexcept 00066 { 00067 mylog.addLevel(t); 00068 } 00069 inline void delSessionLogLevel( Debug::type t ) noexcept 00070 { 00071 mylog.delLevel(t); 00072 } 00073 00075 void setMaxBufSize( size_t num ); 00076 size_t getMaxBufSize() const noexcept; 00077 00078 // запуск обработки входящих запросов 00079 void run( const ev::loop_ref& loop ) noexcept; 00080 void terminate(); 00081 00082 bool isAcive() const noexcept; 00083 00084 std::string name() const noexcept; 00085 00086 std::string getShortInfo() noexcept; 00087 00088 #ifndef DISABLE_REST_API 00089 Poco::JSON::Object::Ptr httpGetShortInfo(); 00090 #endif 00091 00092 protected: 00093 // LogSession( ost::TCPSocket& server ); 00094 00095 void event( ev::async& watcher, int revents ) noexcept; 00096 void callback( ev::io& watcher, int revents ) noexcept; 00097 void readEvent( ev::io& watcher ) noexcept; 00098 void writeEvent( ev::io& watcher ); 00099 size_t readData( unsigned char* buf, int len ); 00100 void cmdProcessing( const std::string& cmdLogName, const LogServerTypes::lsMessage& msg ); 00101 void onCmdTimeout( ev::timer& watcher, int revents ) noexcept; 00102 void onCheckConnectionTimer( ev::timer& watcher, int revents ) noexcept; 00103 void final() noexcept; 00104 00105 void logOnEvent( const std::string& s ) noexcept; 00106 00107 timeout_t cmdTimeout = { 2000 }; 00108 float checkConnectionTime = { 10. }; // время на проверку живости соединения..(сек) 00109 00110 // Т.к. сообщений может быть ОЧЕНЬ МНОГО.. сеть медленная 00111 // очередь будет не успевать рассасываться, 00112 // то потенциально может "скушаться" вся память. 00113 // Поэтому приходиться ограничить доступное количество записей. 00114 // Рассчитываем, что средний размер одного сообщения 150 символов (байт) 00115 // тогда выделяем буфер на 200 сообщений (~ 30кB) 00116 // На самом деле сообщения могут быть совершенно разные.. 00117 size_t maxRecordsNum = { 30000 }; // максимальное количество сообщение в очереди 00118 00119 private: 00120 std::queue<UTCPCore::Buffer*> logbuf; 00121 std::mutex logbuf_mutex; 00122 bool lostMsg = { false }; 00123 00124 // статистика по использованию буфера 00125 size_t maxCount = { 0 }; // максимальное количество побывавшее в очереди 00126 size_t minSizeMsg = { 0 }; // минимальная встретившаяся длинна сообщения 00127 size_t maxSizeMsg = { 0 }; // максимальная встретившаяся длинна сообщения 00128 size_t numLostMsg = { 0 }; // количество потерянных сообщений 00129 00130 std::string peername = { "" }; 00131 std::string caddr = { "" }; 00132 std::shared_ptr<DebugStream> log; 00133 std::shared_ptr<LogAgregator> alog; 00134 sigc::connection conn; 00135 00136 std::shared_ptr<UTCPStream> sock; 00137 00138 ev::io io; 00139 ev::timer cmdTimer; 00140 ev::async asyncEvent; 00141 ev::timer checkConnectionTimer; 00142 00143 FinalSlot slFin; 00144 std::atomic_bool cancelled = { false }; 00145 00146 LogSessionCommand_Signal m_command_sig; 00147 00148 DebugStream mylog; 00149 }; 00150 // ------------------------------------------------------------------------- 00151 } // end of uniset namespace 00152 // ------------------------------------------------------------------------- 00153 #endif // LogSession_H_ 00154 // -------------------------------------------------------------------------
1.7.6.1