Loading cmds/statsd/src/condition/SimpleConditionTracker.cpp +20 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "SimpleConditionTracker.h" #include "guardrail/StatsdStats.h" #include "dimension.h" #include <log/logprint.h> Loading Loading @@ -171,12 +172,12 @@ void SimpleConditionTracker::handleConditionEvent(const HashableDimensionKey& ou // We get a new output key. newCondition = matchStart ? ConditionState::kTrue : ConditionState::kFalse; if (matchStart && mInitialValue != ConditionState::kTrue) { mSlicedConditionState[outputKey] = 1; mSlicedConditionState.insert(std::make_pair(outputKey, 1)); changed = true; } else if (mInitialValue != ConditionState::kFalse) { // it's a stop and we don't have history about it. // If the default condition is not false, it means this stop is valuable to us. mSlicedConditionState[outputKey] = 0; mSlicedConditionState.insert(std::make_pair(outputKey, 0)); changed = true; } } else { Loading Loading @@ -341,9 +342,25 @@ void SimpleConditionTracker::isConditionMet( conditionState = conditionState | (startedCountIt->second > 0 ? ConditionState::kTrue : ConditionState::kFalse); } else { // For unseen key, check whether the require dimensions are subset of sliced condition // output. bool seenDimension = false; for (const auto& slice : mSlicedConditionState) { if (IsSubDimension(slice.first.getDimensionsValue(), key.getDimensionsValue())) { seenDimension = true; conditionState = conditionState | (slice.second > 0 ? ConditionState::kTrue : ConditionState::kFalse); } if (conditionState == ConditionState::kTrue) { break; } } if (!seenDimension) { conditionState = conditionState | mInitialValue; } } } conditionCache[mIndex] = conditionState; VLOG("Predicate %lld return %d", (long long)mConditionId, conditionCache[mIndex]); } Loading cmds/statsd/src/dimension.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -331,13 +331,15 @@ bool IsSubDimension(const DimensionsValue& dimension, const DimensionsValue& sub case DimensionsValue::ValueCase::kValueFloat: return dimension.value_float() == sub.value_float(); case DimensionsValue::ValueCase::kValueTuple: { if (dimension.value_tuple().dimensions_value_size() < sub.value_tuple().dimensions_value_size()) { if (dimension.value_tuple().dimensions_value_size() < sub.value_tuple().dimensions_value_size()) { return false; } bool allSub = true; for (int i = 0; i < sub.value_tuple().dimensions_value_size(); ++i) { for (int i = 0; allSub && i < sub.value_tuple().dimensions_value_size(); ++i) { bool isSub = false; for (int j = 0; !isSub && j < dimension.value_tuple().dimensions_value_size(); ++j) { for (int j = 0; !isSub && j < dimension.value_tuple().dimensions_value_size(); ++j) { isSub |= IsSubDimension(dimension.value_tuple().dimensions_value(j), sub.value_tuple().dimensions_value(i)); } Loading cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ StatsdConfig CreateStatsdConfig() { auto isSyncingPredicate = CreateIsSyncingPredicate(); *isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions() = CreateDimensions( android::util::SYNC_STATE_CHANGED, {1 /* uid field */}); android::util::SYNC_STATE_CHANGED, {1 /* uid field */, 2 /* name field*/}); auto isInBackgroundPredicate = CreateIsInBackgroundPredicate(); *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() = Loading Loading
cmds/statsd/src/condition/SimpleConditionTracker.cpp +20 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "SimpleConditionTracker.h" #include "guardrail/StatsdStats.h" #include "dimension.h" #include <log/logprint.h> Loading Loading @@ -171,12 +172,12 @@ void SimpleConditionTracker::handleConditionEvent(const HashableDimensionKey& ou // We get a new output key. newCondition = matchStart ? ConditionState::kTrue : ConditionState::kFalse; if (matchStart && mInitialValue != ConditionState::kTrue) { mSlicedConditionState[outputKey] = 1; mSlicedConditionState.insert(std::make_pair(outputKey, 1)); changed = true; } else if (mInitialValue != ConditionState::kFalse) { // it's a stop and we don't have history about it. // If the default condition is not false, it means this stop is valuable to us. mSlicedConditionState[outputKey] = 0; mSlicedConditionState.insert(std::make_pair(outputKey, 0)); changed = true; } } else { Loading Loading @@ -341,9 +342,25 @@ void SimpleConditionTracker::isConditionMet( conditionState = conditionState | (startedCountIt->second > 0 ? ConditionState::kTrue : ConditionState::kFalse); } else { // For unseen key, check whether the require dimensions are subset of sliced condition // output. bool seenDimension = false; for (const auto& slice : mSlicedConditionState) { if (IsSubDimension(slice.first.getDimensionsValue(), key.getDimensionsValue())) { seenDimension = true; conditionState = conditionState | (slice.second > 0 ? ConditionState::kTrue : ConditionState::kFalse); } if (conditionState == ConditionState::kTrue) { break; } } if (!seenDimension) { conditionState = conditionState | mInitialValue; } } } conditionCache[mIndex] = conditionState; VLOG("Predicate %lld return %d", (long long)mConditionId, conditionCache[mIndex]); } Loading
cmds/statsd/src/dimension.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -331,13 +331,15 @@ bool IsSubDimension(const DimensionsValue& dimension, const DimensionsValue& sub case DimensionsValue::ValueCase::kValueFloat: return dimension.value_float() == sub.value_float(); case DimensionsValue::ValueCase::kValueTuple: { if (dimension.value_tuple().dimensions_value_size() < sub.value_tuple().dimensions_value_size()) { if (dimension.value_tuple().dimensions_value_size() < sub.value_tuple().dimensions_value_size()) { return false; } bool allSub = true; for (int i = 0; i < sub.value_tuple().dimensions_value_size(); ++i) { for (int i = 0; allSub && i < sub.value_tuple().dimensions_value_size(); ++i) { bool isSub = false; for (int j = 0; !isSub && j < dimension.value_tuple().dimensions_value_size(); ++j) { for (int j = 0; !isSub && j < dimension.value_tuple().dimensions_value_size(); ++j) { isSub |= IsSubDimension(dimension.value_tuple().dimensions_value(j), sub.value_tuple().dimensions_value(i)); } Loading
cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ StatsdConfig CreateStatsdConfig() { auto isSyncingPredicate = CreateIsSyncingPredicate(); *isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions() = CreateDimensions( android::util::SYNC_STATE_CHANGED, {1 /* uid field */}); android::util::SYNC_STATE_CHANGED, {1 /* uid field */, 2 /* name field*/}); auto isInBackgroundPredicate = CreateIsInBackgroundPredicate(); *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() = Loading