Commit 7dd5cf85 authored by Pavel Vainerman's avatar Pavel Vainerman

(SM): добавил ведение статистики по "недоступным заказчикам"

и так же учёт количества изменений датчика.
parent a7486f85
...@@ -504,7 +504,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -504,7 +504,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet2.pc %exclude %_pkgconfigdir/libUniSet2.pc
# history of current unpublished changes # history of current unpublished changes
# .. # - remove 'fastSaveValue'
# - add suppor HTTP REST API
# - (SM): add new statistics for consumers
%changelog %changelog
* Mon Oct 24 2016 Pavel Vainerman <pv@altlinux.ru> 2.5-alt20 * Mon Oct 24 2016 Pavel Vainerman <pv@altlinux.ru> 2.5-alt20
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
<AutoStartUpTime name="1"/> <AutoStartUpTime name="1"/>
<DumpStateTime name="10"/> <DumpStateTime name="10"/>
<SleepTickMS name="500"/> <SleepTickMS name="500"/>
<ConsumerMaxAttempts name="3"/>
<UniSetDebug levels="" name="ulog"/> <UniSetDebug levels="" name="ulog"/>
<ConfDir name="./"/> <ConfDir name="./"/>
<DataDir name="./"/> <DataDir name="./"/>
......
...@@ -312,7 +312,7 @@ ...@@ -312,7 +312,7 @@
limit - количество в ответе. limit - количество в ответе.
/consumers - получить список заказчиков по каждому датчику /consumers - получить список заказчиков по каждому датчику
/lost - получить список заказчиков с которыми терялась связь (и они удалялись из списка)
*/ */
class SharedMemory: class SharedMemory:
public IONotifyController public IONotifyController
......
...@@ -5,7 +5,7 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs" ...@@ -5,7 +5,7 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs"
ulimit -Sc 10000000000 ulimit -Sc 10000000000
./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \ ./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \
--confile test-lost.xml --datfile test-lost.xml --ulog-add-levels system,level1 \ --confile test-lost.xml --datfile test-lost.xml --ulog-add-levels crit,warn,system,level1 \
--sm-log-add-levels any $* --sm-run-logserver --activate-timeout 320000 --sm-log-add-levels any $* --sm-run-logserver --activate-timeout 320000
#--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100 #--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100
......
...@@ -137,7 +137,8 @@ void LostTestProc::timerInfo( const TimerMessage* tm ) ...@@ -137,7 +137,8 @@ void LostTestProc::timerInfo( const TimerMessage* tm )
if(ui->getValue(s.first) != (s.second+1) ) if(ui->getValue(s.first) != (s.second+1) )
{ {
cerr << myname << "(check): SAVE TO SM ERROR!! smValue=" << smValue << endl; cerr << myname << "(check): SAVE TO SM ERROR!! sid=" << s.first
<< " value=" << smValue << " != " << (s.second+1) << endl;
UniSetTypes::SimpleInfo_var i = getInfo(); UniSetTypes::SimpleInfo_var i = getInfo();
cerr << i->info << endl; cerr << i->info << endl;
std::abort(); std::abort();
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
START=uniset2-start.sh START=uniset2-start.sh
LOGS="crit,warn,info" LOGLEVEL="crit,warn,info"
${START} -f ./sm-lostmessage-test --confile ./test-lost.xml \ ${START} -f ./sm-lostmessage-test --confile ./test-lost.xml \
--numproc 3 \ --numproc 3 \
......
...@@ -309,6 +309,8 @@ class IOController: ...@@ -309,6 +309,8 @@ class IOController:
long d_off_value = { 0 }; /*!< блокирующее значение */ long d_off_value = { 0 }; /*!< блокирующее значение */
std::shared_ptr<USensorInfo> d_usi; // shared_ptr на датчик от которого зависит этот. std::shared_ptr<USensorInfo> d_usi; // shared_ptr на датчик от которого зависит этот.
size_t nchanges = { 0 }; // количество изменений датчика
// функция обработки информации об изменении состояния датчика, от которого зависит данный // функция обработки информации об изменении состояния датчика, от которого зависит данный
void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* ); void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* );
......
...@@ -160,6 +160,12 @@ class IONotifyController: ...@@ -160,6 +160,12 @@ class IONotifyController:
// -------------------------------------------- // --------------------------------------------
// http API
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
nlohmann::json httpRequest( const string& req, const Poco::URI::QueryParameters& p );
// --------------------------------------------
/*! Информация о заказчике */ /*! Информация о заказчике */
struct ConsumerInfoExt: struct ConsumerInfoExt:
public UniSetTypes::ConsumerInfo public UniSetTypes::ConsumerInfo
...@@ -172,6 +178,7 @@ class IONotifyController: ...@@ -172,6 +178,7 @@ class IONotifyController:
UniSetObject_i_var ref; UniSetObject_i_var ref;
size_t attempt; size_t attempt;
size_t lostEvents = { 0 }; // количество потерянных сообщений (не смогли послать) size_t lostEvents = { 0 }; // количество потерянных сообщений (не смогли послать)
size_t smCount = { 0 }; // количество посланных SensorMessage
ConsumerInfoExt( const ConsumerInfoExt& ) = default; ConsumerInfoExt( const ConsumerInfoExt& ) = default;
ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default; ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default;
...@@ -270,11 +277,6 @@ class IONotifyController: ...@@ -270,11 +277,6 @@ class IONotifyController:
/*! словарь: аналоговый датчик --> список порогов по нему */ /*! словарь: аналоговый датчик --> список порогов по нему */
typedef std::unordered_map<UniSetTypes::ObjectId, ThresholdsListInfo> AskThresholdMap; typedef std::unordered_map<UniSetTypes::ObjectId, ThresholdsListInfo> AskThresholdMap;
// http API
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
nlohmann::json httpRequest( const string& req, const Poco::URI::QueryParameters& p );
protected: protected:
IONotifyController(); IONotifyController();
virtual bool activateObject() override; virtual bool activateObject() override;
...@@ -320,7 +322,8 @@ class IONotifyController: ...@@ -320,7 +322,8 @@ class IONotifyController:
}; };
// http api // http api
virtual nlohmann::json request_consumers( const std::string& req, const Poco::URI::QueryParameters& p ); nlohmann::json request_consumers( const std::string& req, const Poco::URI::QueryParameters& p );
nlohmann::json request_lost( const string& req, const Poco::URI::QueryParameters& p );
private: private:
friend class NCRestorer; friend class NCRestorer;
...@@ -346,10 +349,27 @@ class IONotifyController: ...@@ -346,10 +349,27 @@ class IONotifyController:
/*! замок для блокирования совместного доступа к cписку потребителей пороговых датчиков */ /*! замок для блокирования совместного доступа к cписку потребителей пороговых датчиков */
UniSetTypes::uniset_rwmutex trshMutex; UniSetTypes::uniset_rwmutex trshMutex;
int maxAttemtps; /*! timeout for consumer */
sigc::connection conInit; sigc::connection conInit;
sigc::connection conUndef; sigc::connection conUndef;
int maxAttemtps; /*! timeout for consumer */
std::mutex lostConsumersMutex;
struct LostConsumerInfo
{
size_t count = { 0 }; // количество "пропаданий"
bool lost = { false }; // флаг означающий что "заказчик пропал"
// lost нужен чтобы в count не увеличивать, на send() по каждому датчику, если заказчик заказывал больше одного датчика)
// флаг сбрасывается при перезаказе датчика..
};
/*! map для хранения информации о заказчиках с которыми была потеряна связь
* и которые были удалены из списка заказчиков
* size_t - количество раз
* ObjectId - id заказчика
*/
std::unordered_map<UniSetTypes::ObjectId, LostConsumerInfo> lostConsumers;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#endif #endif
......
...@@ -937,6 +937,11 @@ throw(UniSetTypes::ResolveNameError, UniSetTypes::TimeOut ) ...@@ -937,6 +937,11 @@ throw(UniSetTypes::ResolveNameError, UniSetTypes::TimeOut )
// uwarn << "UI(resolve): CORBA::SystemException" << endl; // uwarn << "UI(resolve): CORBA::SystemException" << endl;
throw UniSetTypes::TimeOut(); throw UniSetTypes::TimeOut();
} }
catch( std::exception& ex )
{
ucrit << "UI(resolve): myID=" << myid << ": resolve id=" << rid << "@" << node
<< " catch " << ex.what() << endl;
}
throw UniSetTypes::ResolveNameError(); throw UniSetTypes::ResolveNameError();
} }
......
...@@ -291,7 +291,10 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi, ...@@ -291,7 +291,10 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
bool blocked = ( usi->blocked || usi->undefined ); bool blocked = ( usi->blocked || usi->undefined );
changed = ( usi->real_value != value ); changed = ( usi->real_value != value );
// если поменялось состояние блокировки // Смотрим поменялось ли состояние блокировки.
// т.е. смотрим записано ли у нас уже value = d_off_value и флаг блокировки
// т.к. если blocked=true то должно быть usi->value = usi->d_off_value
// если флаг снимется, то значит должны "восстанавливать" значение из real_value
blockChanged = ( blocked != (usi->value == usi->d_off_value ) ); blockChanged = ( blocked != (usi->value == usi->d_off_value ) );
if( changed || blockChanged ) if( changed || blockChanged )
...@@ -309,6 +312,8 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi, ...@@ -309,6 +312,8 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
usi->value = (blocked ? usi->d_off_value : value); usi->value = (blocked ? usi->d_off_value : value);
retValue = usi->value; retValue = usi->value;
usi->nchanges++; // статистика
// запоминаем время изменения // запоминаем время изменения
try try
{ {
...@@ -950,6 +955,7 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor ...@@ -950,6 +955,7 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor
jsens["type"] = UniSetTypes::iotype2str(s->type); jsens["type"] = UniSetTypes::iotype2str(s->type);
jsens["default_val"] = s->default_val; jsens["default_val"] = s->default_val;
jsens["dbignore"] = s->dbignore; jsens["dbignore"] = s->dbignore;
jsens["nchanges"] = s->nchanges;
jsens["calibration"] = { jsens["calibration"] = {
{ "cmin",s->ci.minCal}, { "cmin",s->ci.minCal},
{ "cmax",s->ci.maxCal}, { "cmax",s->ci.maxCal},
...@@ -958,7 +964,6 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor ...@@ -958,7 +964,6 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor
{ "precision",s->ci.precision} { "precision",s->ci.precision}
}; };
// ::CORBA::Boolean undefined; // ::CORBA::Boolean undefined;
// ::CORBA::Boolean blocked; // ::CORBA::Boolean blocked;
// ::CORBA::Long priority; // ::CORBA::Long priority;
......
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