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

Commit 15f8da95 authored by Muhammad Qureshi's avatar Muhammad Qureshi
Browse files

Add ActivationType to EventActivation

This allows setting one metric with both IMMEDIATE and ACTIVATE_ON_BOOT
EventActivations

Also, if an on-boot Activation that is already active gets another
activation signal, ignore it.

Bug: 128880263
Fixes: 128880263
Test: statsd_test
Change-Id: I8d483882836c9abc184230b4a70d4734d49d93c3
parent 844694bc
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -222,6 +222,8 @@ private:
    FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations);
    FRIEND_TEST(StatsLogProcessorTest,
            TestActivationOnBootMultipleActivationsDifferentActivationTypes);

    FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1);
    FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2);
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ option java_outer_classname = "ActiveConfigProto";
message ActiveEventActivation {
    optional int32 atom_matcher_index = 1;

    // TIme left in activation. When this proto is loaded after device boot,
    // Time left in activation. When this proto is loaded after device boot,
    // the activation should be set to active for this duration.
    optional int64 remaining_ttl_nanos = 2;
}
+12 −9
Original line number Diff line number Diff line
@@ -109,8 +109,8 @@ void MetricProducer::flushIfExpire(int64_t elapsedTimestampNs) {
    }
}

void MetricProducer::addActivation(int activationTrackerIndex, int64_t ttl_seconds,
                                   int deactivationTrackerIndex) {
void MetricProducer::addActivation(int activationTrackerIndex, const ActivationType& activationType,
        int64_t ttl_seconds, int deactivationTrackerIndex) {
    std::lock_guard<std::mutex> lock(mMutex);
    // When a metric producer does not depend on any activation, its mIsActive is true.
    // Therefore, if this is the 1st activation, mIsActive will turn to false. Otherwise it does not
@@ -118,8 +118,8 @@ void MetricProducer::addActivation(int activationTrackerIndex, int64_t ttl_secon
    if  (mEventActivationMap.empty()) {
        mIsActive = false;
    }
    std::shared_ptr<Activation> activation = std::make_shared<Activation>();
    activation->ttl_ns = ttl_seconds * NS_PER_SEC;
    std::shared_ptr<Activation> activation =
            std::make_shared<Activation>(activationType, ttl_seconds * NS_PER_SEC);
    mEventActivationMap.emplace(activationTrackerIndex, activation);
    if (-1 != deactivationTrackerIndex) {
        mEventDeactivationMap.emplace(deactivationTrackerIndex, activation);
@@ -131,13 +131,16 @@ void MetricProducer::activateLocked(int activationTrackerIndex, int64_t elapsedT
    if (it == mEventActivationMap.end()) {
        return;
    }
    if (mActivationType == MetricActivation::ACTIVATE_ON_BOOT &&
        it->second->state == ActivationState::kNotActive) {
        it->second->state = ActivationState::kActiveOnBoot;
    auto& activation = it->second;
    if (ACTIVATE_ON_BOOT == activation->activationType) {
        if (ActivationState::kNotActive == activation->state) {
            activation->state = ActivationState::kActiveOnBoot;
        }
        // If the Activation is already active or set to kActiveOnBoot, do nothing.
        return;
    }
    it->second->start_ns = elapsedTimestampNs;
    it->second->state = ActivationState::kActive;
    activation->start_ns = elapsedTimestampNs;
    activation->state = ActivationState::kActive;
    mIsActive = true;
}

+11 −10
Original line number Diff line number Diff line
@@ -233,12 +233,8 @@ public:
        return isActiveLocked();
    }

    void addActivation(int activationTrackerIndex, int64_t ttl_seconds,
                       int deactivationTrackerIndex = -1);

    inline void setActivationType(const MetricActivation::ActivationType& activationType) {
        mActivationType = activationType;
    }
    void addActivation(int activationTrackerIndex, const ActivationType& activationType,
            int64_t ttl_seconds, int deactivationTrackerIndex = -1);

    void prepareFistBucket() {
        std::lock_guard<std::mutex> lock(mMutex);
@@ -386,11 +382,16 @@ protected:
    mutable std::mutex mMutex;

    struct Activation {
        Activation() : ttl_ns(0), start_ns(0), state(ActivationState::kNotActive)  {}
        Activation(const ActivationType& activationType, const int64_t ttlNs)
            : ttl_ns(ttlNs),
              start_ns(0),
              state(ActivationState::kNotActive),
              activationType(activationType) {}

        int64_t ttl_ns;
        const int64_t ttl_ns;
        int64_t start_ns;
        ActivationState state;
        const ActivationType activationType;
    };
    // When the metric producer has multiple activations, these activations are ORed to determine
    // whether the metric producer is ready to generate metrics.
@@ -401,8 +402,6 @@ protected:

    bool mIsActive;

    MetricActivation::ActivationType mActivationType;

    FRIEND_TEST(MetricActivationE2eTest, TestCountMetric);
    FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation);
    FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations);
@@ -411,6 +410,8 @@ protected:
    FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations);
    FRIEND_TEST(StatsLogProcessorTest,
            TestActivationOnBootMultipleActivationsDifferentActivationTypes);
};

}  // namespace statsd
+2 −0
Original line number Diff line number Diff line
@@ -288,6 +288,8 @@ private:
    FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot);
    FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations);
    FRIEND_TEST(StatsLogProcessorTest,
            TestActivationOnBootMultipleActivationsDifferentActivationTypes);
};

}  // namespace statsd
Loading