From 28e14e8378d039a7a14ef9ab89a9fbef88fc78e1 Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Fri, 1 Jul 2016 15:46:14 +0900 Subject: [PATCH] sensor: re-sample pressure data and perform lazy insertions to reduce DB overhead Change-Id: I77250bda622784e3adc522b41b90755105fb220a Signed-off-by: Mu-Woong Lee --- src/sensor/SensorLogger.cpp | 4 +++ src/sensor/SensorLogger.h | 1 + src/sensor/SensorProvider.cpp | 2 ++ src/sensor/pressure/PressureLogger.cpp | 45 +++++++++++++++++++++------------- src/sensor/pressure/PressureLogger.h | 6 +++-- src/sensor/sleep/SleepLogger.cpp | 4 +-- src/sensor/sleep/SleepLogger.h | 2 +- src/sensor/sleep/SleepMonitor.cpp | 2 +- 8 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/sensor/SensorLogger.cpp b/src/sensor/SensorLogger.cpp index d79ec12..6bc92ea 100644 --- a/src/sensor/SensorLogger.cpp +++ b/src/sensor/SensorLogger.cpp @@ -31,6 +31,10 @@ SensorLogger::~SensorLogger() { } +void SensorLogger::flushCache(bool force) +{ +} + bool SensorLogger::executeQuery(const char *query) { return __dbMgr.execute(0, query, NULL); diff --git a/src/sensor/SensorLogger.h b/src/sensor/SensorLogger.h index cd13883..76d7ec6 100644 --- a/src/sensor/SensorLogger.h +++ b/src/sensor/SensorLogger.h @@ -28,6 +28,7 @@ namespace ctx { virtual bool start() = 0; virtual void stop() = 0; + virtual void flushCache(bool force = false); protected: bool executeQuery(const char *query); diff --git a/src/sensor/SensorProvider.cpp b/src/sensor/SensorProvider.cpp index 71e4c01..12c0eed 100644 --- a/src/sensor/SensorProvider.cpp +++ b/src/sensor/SensorProvider.cpp @@ -79,6 +79,8 @@ int SensorProvider::read(Json option, Json *requestResult) Querier *querier = getQuerier(option); IF_FAIL_RETURN(querier, ERR_OPERATION_FAILED); + sensorLogger->flushCache(true); + if (interval == 0) ret = querier->queryRaw(startTime, endTime); else if (interval > 0) diff --git a/src/sensor/pressure/PressureLogger.cpp b/src/sensor/pressure/PressureLogger.cpp index 5f2f459..8cdc547 100644 --- a/src/sensor/pressure/PressureLogger.cpp +++ b/src/sensor/pressure/PressureLogger.cpp @@ -21,10 +21,11 @@ #include "../TimeUtil.h" #include "PressureLogger.h" -#define INSERTION_THRESHOLD 20000 #define SAMPLING_INTERVAL 60000 #define BATCH_LATENCY INT_MAX -#define MAX_QUERY_LENGTH 1000 + +#define RESAMPLING_INTERVAL 20000 +#define CACHE_LIMIT 20 using namespace ctx; @@ -57,7 +58,8 @@ bool PressureLogger::start() IF_FAIL_RETURN_TAG(!isRunning(), true, _D, "Started already"); _I(GREEN("Start to record")); - __lastInsertionTime = TimeUtil::getTime(); + __lastEventTime = 0; + __cacheCount = 0; __resetInsertionQuery(); return listen(); @@ -69,32 +71,41 @@ void PressureLogger::stop() _I(GREEN("Stop recording")); unlisten(); + flushCache(true); +} + +void PressureLogger::flushCache(bool force) +{ + IF_FAIL_VOID(force || __cacheCount > CACHE_LIMIT); + + __insertionQuery.resize(__insertionQuery.size() - 1); + if (__insertionQuery.at(__insertionQuery.size() - 1) == ')') + executeQuery(__insertionQuery.c_str()); + + __cacheCount = 0; + __resetInsertionQuery(); } void PressureLogger::onEvent(sensor_data_t *eventData) { - uint64_t receivedTime = TimeUtil::getTime(); - __record(eventData, receivedTime); + uint64_t eventTime = TimeUtil::getTime(eventData->timestamp); + __record(eventData->values[0], eventTime); removeExpired(SUBJ_SENSOR_PRESSURE, PRESSURE_RECORD, KEY_UNIV_TIME); } -void PressureLogger::__record(sensor_data_t *eventData, uint64_t receivedTime) +void PressureLogger::__record(float pressure, uint64_t eventTime) { + IF_FAIL_VOID(eventTime - __lastEventTime >= RESAMPLING_INTERVAL); + char buffer[64]; - g_snprintf(buffer, sizeof(buffer), "(%llu, %.5f),", - TimeUtil::getTime(eventData->timestamp), eventData->values[0]); + g_snprintf(buffer, sizeof(buffer), "(%llu, %.5f),", eventTime, pressure); + _D("[%u] %s", __cacheCount, buffer); __insertionQuery += buffer; + __lastEventTime = eventTime; + ++__cacheCount; - if (receivedTime - __lastInsertionTime < INSERTION_THRESHOLD && __insertionQuery.size() < MAX_QUERY_LENGTH) - return; - - __insertionQuery.resize(__insertionQuery.size() - 1); - if (__insertionQuery.at(__insertionQuery.size() - 1) == ')') - executeQuery(__insertionQuery.c_str()); - - __lastInsertionTime = receivedTime; - __resetInsertionQuery(); + flushCache(); } void PressureLogger::__resetInsertionQuery() diff --git a/src/sensor/pressure/PressureLogger.h b/src/sensor/pressure/PressureLogger.h index 3f8995a..78b7fe5 100644 --- a/src/sensor/pressure/PressureLogger.h +++ b/src/sensor/pressure/PressureLogger.h @@ -29,15 +29,17 @@ namespace ctx { bool start(); void stop(); + void flushCache(bool force = false); protected: void onEvent(sensor_data_t *eventData); private: - void __record(sensor_data_t *eventData, uint64_t receivedTime); + void __record(float pressure, uint64_t eventTime); void __resetInsertionQuery(); - uint64_t __lastInsertionTime; + uint64_t __lastEventTime; + uint32_t __cacheCount; std::string __insertionQuery; }; } diff --git a/src/sensor/sleep/SleepLogger.cpp b/src/sensor/sleep/SleepLogger.cpp index f3e1470..9771ae6 100644 --- a/src/sensor/sleep/SleepLogger.cpp +++ b/src/sensor/sleep/SleepLogger.cpp @@ -97,7 +97,7 @@ void SleepLogger::stop() __sleepMonitor->stop(); __appendQuery(__startTime, __endTime); - flush(); + flushCache(); delete __sleepDetector; __sleepDetector = NULL; @@ -143,7 +143,7 @@ void SleepLogger::record(uint64_t startTime, uint64_t endTime, int state) _D("Reset event: %llu ~ %llu", __startTime, __endTime); } -void SleepLogger::flush() +void SleepLogger::flushCache(bool force) { __insertionQuery.resize(__insertionQuery.size() - 1); if (__insertionQuery.at(__insertionQuery.size() - 1) == ')') diff --git a/src/sensor/sleep/SleepLogger.h b/src/sensor/sleep/SleepLogger.h index 447c59c..5bf25d1 100644 --- a/src/sensor/sleep/SleepLogger.h +++ b/src/sensor/sleep/SleepLogger.h @@ -36,7 +36,7 @@ namespace ctx { void wakeUp(uint64_t timestamp); void record(uint64_t startTime, uint64_t endTime, int state); - void flush(); + void flushCache(bool force = false); private: void __resetInsertionQuery(); diff --git a/src/sensor/sleep/SleepMonitor.cpp b/src/sensor/sleep/SleepMonitor.cpp index c851ca4..9b0b227 100644 --- a/src/sensor/sleep/SleepMonitor.cpp +++ b/src/sensor/sleep/SleepMonitor.cpp @@ -68,7 +68,7 @@ void SleepMonitor::onEvent(sensor_data_t *eventData) if (static_cast(eventData->values[IDX_REMAINING]) > 0) return; - __logger->flush(); + __logger->flushCache(); if (__lazyStopOn) stop(); -- 2.7.4