Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d728ef3 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Reduce log spam from MultiStateCounter

Most error reports are completely benign and caused by
minor race conditions leading to out-of-order timestamps, e.g.
```
12-21 10:59:19.015  1579  1710 E system_server: setState is called with an earlier timestamp: 367395029, previous timestamp: 367406095

```
Bug: 317382941
Test: atest libbattery_test

Change-Id: I44002818fac47436cb87765e77a64565b25cfea8
parent 1bc01fb4
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@
namespace android {
namespace battery {

#define REPORTED_INVALID_TIMESTAMP_DELTA_MS 60000

typedef uint16_t state_t;

template <class T>
@@ -171,8 +173,12 @@ void MultiStateCounter<T>::setState(state_t state, time_t timestamp) {
        if (timestamp >= lastStateChangeTimestamp) {
            states[currentState].timeInStateSinceUpdate += timestamp - lastStateChangeTimestamp;
        } else {
            ALOGE("setState is called with an earlier timestamp: %lu, previous timestamp: %lu\n",
            if (timestamp < lastStateChangeTimestamp - REPORTED_INVALID_TIMESTAMP_DELTA_MS) {
                ALOGE("setState is called with an earlier timestamp: %lu, "
                      "previous timestamp: %lu\n",
                      (unsigned long)timestamp, (unsigned long)lastStateChangeTimestamp);
            }

            // The accumulated durations have become unreliable. For example, if the timestamp
            // sequence was 1000, 2000, 1000, 3000, if we accumulated the positive deltas,
            // we would get 4000, which is greater than (last - first). This could lead to
@@ -232,8 +238,10 @@ const T& MultiStateCounter<T>::updateValue(const T& value, time_t timestamp) {
                    }
                }
            } else if (timestamp < lastUpdateTimestamp) {
                if (timestamp < lastUpdateTimestamp - REPORTED_INVALID_TIMESTAMP_DELTA_MS) {
                    ALOGE("updateValue is called with an earlier timestamp: %lu, previous: %lu\n",
                          (unsigned long)timestamp, (unsigned long)lastUpdateTimestamp);
                }

                for (int i = 0; i < stateCount; i++) {
                    states[i].timeInStateSinceUpdate = 0;