sensor: re-sample pressure data and perform lazy insertions to reduce DB overhead 20/77820/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 1 Jul 2016 06:46:14 +0000 (15:46 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 1 Jul 2016 06:46:14 +0000 (15:46 +0900)
Change-Id: I77250bda622784e3adc522b41b90755105fb220a
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
src/sensor/SensorLogger.cpp
src/sensor/SensorLogger.h
src/sensor/SensorProvider.cpp
src/sensor/pressure/PressureLogger.cpp
src/sensor/pressure/PressureLogger.h
src/sensor/sleep/SleepLogger.cpp
src/sensor/sleep/SleepLogger.h
src/sensor/sleep/SleepMonitor.cpp

index d79ec12..6bc92ea 100644 (file)
@@ -31,6 +31,10 @@ SensorLogger::~SensorLogger()
 {
 }
 
+void SensorLogger::flushCache(bool force)
+{
+}
+
 bool SensorLogger::executeQuery(const char *query)
 {
        return __dbMgr.execute(0, query, NULL);
index cd13883..76d7ec6 100644 (file)
@@ -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);
index 71e4c01..12c0eed 100644 (file)
@@ -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)
index 5f2f459..8cdc547 100644 (file)
 #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()
index 3f8995a..78b7fe5 100644 (file)
@@ -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;
        };
 }
index f3e1470..9771ae6 100644 (file)
@@ -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) == ')')
index 447c59c..5bf25d1 100644 (file)
@@ -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();
index c851ca4..9b0b227 100644 (file)
@@ -68,7 +68,7 @@ void SleepMonitor::onEvent(sensor_data_t *eventData)
        if (static_cast<int>(eventData->values[IDX_REMAINING]) > 0)
                return;
 
-       __logger->flush();
+       __logger->flushCache();
 
        if (__lazyStopOn)
                stop();