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

Commit aa5b2010 authored by Chenjie Yu's avatar Chenjie Yu
Browse files

Fix StatsCompanionService sometimes can be null

Bug: 75970648
Test: will add cts test for puller alarms
Change-Id: I51b7d13f855d3c8ded8325d7cf0f614531eceea5
parent de51e0c6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ statsd_common_src := \
    src/storage/StorageManager.cpp \
    src/StatsLogProcessor.cpp \
    src/StatsService.cpp \
    src/statscompanion_util.cpp \
    src/subscriber/IncidentdReporter.cpp \
    src/subscriber/SubscriberReporter.cpp \
    src/HashableDimensionKey.cpp \
+8 −45
Original line number Diff line number Diff line
@@ -49,33 +49,6 @@ namespace statsd {
constexpr const char* kPermissionDump = "android.permission.DUMP";
#define STATS_SERVICE_DIR "/data/misc/stats-service"

/**
 * Watches for the death of the stats companion (system process).
 */
class CompanionDeathRecipient : public IBinder::DeathRecipient {
public:
    CompanionDeathRecipient(const sp<AlarmMonitor>& anomalyAlarmMonitor,
                            const sp<AlarmMonitor>& periodicAlarmMonitor,
                            const sp<StatsLogProcessor>& processor)
        : mAnomalyAlarmMonitor(anomalyAlarmMonitor),
          mPeriodicAlarmMonitor(periodicAlarmMonitor),
          mProcessor(processor) {}
    virtual void binderDied(const wp<IBinder>& who);

private:
    sp<AlarmMonitor> mAnomalyAlarmMonitor;
    sp<AlarmMonitor> mPeriodicAlarmMonitor;
    sp<StatsLogProcessor> mProcessor;
};

void CompanionDeathRecipient::binderDied(const wp<IBinder>& who) {
    ALOGW("statscompanion service died");
    mProcessor->WriteDataToDisk();
    mAnomalyAlarmMonitor->setStatsCompanionService(nullptr);
    mPeriodicAlarmMonitor->setStatsCompanionService(nullptr);
    SubscriberReporter::getInstance().setStatsCompanionService(nullptr);
}

StatsService::StatsService(const sp<Looper>& handlerLooper)
    : mAnomalyAlarmMonitor(new AlarmMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS,
       [](const sp<IStatsCompanionService>& sc, int64_t timeMillis) {
@@ -791,21 +764,6 @@ void StatsService::sayHiToStatsCompanion() {
    }
}

sp<IStatsCompanionService> StatsService::getStatsCompanionService() {
    sp<IStatsCompanionService> statsCompanion = nullptr;
    // Get statscompanion service from service manager
    const sp<IServiceManager> sm(defaultServiceManager());
    if (sm != nullptr) {
        const String16 name("statscompanion");
        statsCompanion = interface_cast<IStatsCompanionService>(sm->checkService(name));
        if (statsCompanion == nullptr) {
            ALOGW("statscompanion service unavailable!");
            return nullptr;
        }
    }
    return statsCompanion;
}

Status StatsService::statsCompanionReady() {
    VLOG("StatsService::statsCompanionReady was called");

@@ -821,9 +779,8 @@ Status StatsService::statsCompanionReady() {
                "statscompanion unavailable despite it contacting statsd!");
    }
    VLOG("StatsService::statsCompanionReady linking to statsCompanion.");
    IInterface::asBinder(statsCompanion)
        ->linkToDeath(new CompanionDeathRecipient(
            mAnomalyAlarmMonitor, mPeriodicAlarmMonitor, mProcessor));
    IInterface::asBinder(statsCompanion)->linkToDeath(this);
    mStatsPullerManager.SetStatsCompanionService(statsCompanion);
    mAnomalyAlarmMonitor->setStatsCompanionService(statsCompanion);
    mPeriodicAlarmMonitor->setStatsCompanionService(statsCompanion);
    SubscriberReporter::getInstance().setStatsCompanionService(statsCompanion);
@@ -969,6 +926,12 @@ Status StatsService::unsetBroadcastSubscriber(int64_t configId,


void StatsService::binderDied(const wp <IBinder>& who) {
    ALOGW("statscompanion service died");
    mProcessor->WriteDataToDisk();
    mAnomalyAlarmMonitor->setStatsCompanionService(nullptr);
    mPeriodicAlarmMonitor->setStatsCompanionService(nullptr);
    SubscriberReporter::getInstance().setStatsCompanionService(nullptr);
    mStatsPullerManager.SetStatsCompanionService(nullptr);
}

}  // namespace statsd
+1 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include "config/ConfigManager.h"
#include "external/StatsPullerManager.h"
#include "packages/UidMap.h"
#include "statscompanion_util.h"

#include <android/os/BnStatsManager.h>
#include <android/os/IStatsCompanionService.h>
@@ -132,9 +133,6 @@ public:
    /** Inform statsCompanion that statsd is ready. */
    virtual void sayHiToStatsCompanion();

    /** Fetches and returns the StatsCompanionService. */
    static sp<IStatsCompanionService> getStatsCompanionService();

    /** IBinder::DeathRecipient */
    virtual void binderDied(const wp<IBinder>& who) override;

+13 −7
Original line number Diff line number Diff line
@@ -20,10 +20,9 @@
#include <android/os/IStatsCompanionService.h>
#include <binder/IPCThreadState.h>
#include <private/android_filesystem_config.h>
#include "../stats_log_util.h"
#include "../statscompanion_util.h"
#include "StatsCompanionServicePuller.h"
#include "StatsService.h"
#include "stats_log_util.h"
#include "guardrail/StatsdStats.h"

using namespace android;
using namespace android::base;
@@ -44,11 +43,18 @@ const int kLogMsgHeaderSize = 28;
StatsCompanionServicePuller::StatsCompanionServicePuller(int tagId) : StatsPuller(tagId) {
}

void StatsCompanionServicePuller::SetStatsCompanionService(
        sp<IStatsCompanionService> statsCompanionService) {
    AutoMutex _l(mStatsCompanionServiceLock);
    sp<IStatsCompanionService> tmpForLock = mStatsCompanionService;
    mStatsCompanionService = statsCompanionService;
}

bool StatsCompanionServicePuller::PullInternal(vector<shared_ptr<LogEvent> >* data) {
    sp<IStatsCompanionService> statsCompanion = StatsService::getStatsCompanionService();
    sp<IStatsCompanionService> statsCompanionServiceCopy = mStatsCompanionService;
    if (statsCompanionServiceCopy != nullptr) {
        vector<StatsLogEventWrapper> returned_value;
    if (statsCompanion != NULL) {
        Status status = statsCompanion->pullData(mTagId, &returned_value);
        Status status = statsCompanionServiceCopy->pullData(mTagId, &returned_value);
        if (!status.isOk()) {
            ALOGW("error pulling for %d", mTagId);
            return false;
+6 −0
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@ class StatsCompanionServicePuller : public StatsPuller {
public:
    StatsCompanionServicePuller(int tagId);
    bool PullInternal(vector<std::shared_ptr<LogEvent> >* data) override;

    void SetStatsCompanionService(sp<IStatsCompanionService> statsCompanionService) override;

private:
    Mutex mStatsCompanionServiceLock;
    sp<IStatsCompanionService> mStatsCompanionService = nullptr;
};

}  // namespace statsd
Loading