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

Commit 897ef529 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "storaged: record userdata space utilization"

parents 7473bc7b 8847c625
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ private:
    uid_monitor mUidm;
    time_t mStarttime;
    sp<IBatteryPropertiesRegistrar> battery_properties;
    std::unique_ptr<storage_info_t> storage_info;
public:
    storaged_t(void);
    ~storaged_t() {}
@@ -285,6 +286,8 @@ public:
    void init_battery_service();
    virtual void batteryPropertiesChanged(struct BatteryProperties props);
    void binderDied(const wp<IBinder>& who);

    void report_storage_info();
};

// Eventlog tag
+22 −15
Original line number Diff line number Diff line
@@ -27,39 +27,46 @@ using namespace std;
class storage_info_t {
protected:
    FRIEND_TEST(storaged_test, storage_info_t);
    // emmc lifetime
    uint16_t eol;                   // pre-eol (end of life) information
    uint16_t lifetime_a;            // device life time estimation (type A)
    uint16_t lifetime_b;            // device life time estimation (type B)
    string version;                 // version string
    // free space
    const string userdata_path = "/data";
    uint64_t userdata_total_kb;
    uint64_t userdata_free_kb;

    storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0),
        userdata_total_kb(0), userdata_free_kb(0) {}
    void publish();
    storage_info_t* s_info;
public:
    storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0) {}
    static storage_info_t* get_storage_info();
    virtual ~storage_info_t() {}
    virtual bool report() = 0;
    virtual void report() {};
    void refresh();
};

class emmc_info_t : public storage_info_t {
private:
    const string emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/";
    const string emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd";
    const char* emmc_ver_str[9] = {
        "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1"
    };
public:
    virtual ~emmc_info_t() {}
    bool report();
    bool report_sysfs();
    bool report_debugfs();
public:
    static const string emmc_sysfs;
    static const string emmc_debugfs;
    static const char* emmc_ver_str[];

    virtual ~emmc_info_t() {}
    virtual void report();
};

class ufs_info_t : public storage_info_t {
private:
    const string health_file = "/sys/devices/soc/624000.ufshc/health";
public:
    static const string health_file;

    virtual ~ufs_info_t() {}
    bool report();
    virtual void report();
};

void report_storage_health();

#endif /* _STORAGED_INFO_H_ */
+1 −1
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ void* storaged_main(void* /* unused */) {
    storaged = new storaged_t();

    storaged->init_battery_service();
    storaged->report_storage_info();

    LOG_TO(SYSTEM, INFO) << "storaged: Start";

@@ -113,7 +114,6 @@ int main(int argc, char** argv) {
    }

    if (flag_main_service) { // start main thread
        report_storage_health();
        // Start the main thread of storaged
        pthread_t storaged_main_thread;
        errno = pthread_create(&storaged_main_thread, NULL, storaged_main, NULL);
+7 −0
Original line number Diff line number Diff line
@@ -200,6 +200,10 @@ void storaged_t::binderDied(const wp<IBinder>& who) {
    }
}

void storaged_t::report_storage_info() {
    storage_info->report();
}

/* storaged_t */
storaged_t::storaged_t(void) {
    if (access(MMC_DISK_STATS_PATH, R_OK) < 0 && access(SDA_DISK_STATS_PATH, R_OK) < 0) {
@@ -222,6 +226,8 @@ storaged_t::storaged_t(void) {
    mConfig.periodic_chores_interval_uid_io =
        property_get_int32("ro.storaged.uid_io.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO);

    storage_info.reset(storage_info_t::get_storage_info());

    mStarttime = time(NULL);
}

@@ -229,6 +235,7 @@ void storaged_t::event(void) {
    if (mConfig.diskstats_available) {
        mDiskStats.update();
        mDsm.update();
        storage_info->refresh();
        if (mTimer && (mTimer % mConfig.periodic_chores_interval_disk_stats_publish) == 0) {
            mDiskStats.publish();
        }
+42 −14
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <stdio.h>
#include <string.h>
#include <sys/statvfs.h>

#include <android-base/file.h>
#include <android-base/parseint.h>
@@ -30,13 +31,42 @@
using namespace std;
using namespace android::base;

void report_storage_health()
const string emmc_info_t::emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/";
const string emmc_info_t::emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd";
const char* emmc_info_t::emmc_ver_str[9] = {
    "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1"
};

const string ufs_info_t::health_file = "/sys/devices/soc/624000.ufshc/health";

static bool FileExists(const std::string& filename)
{
  struct stat buffer;
  return stat(filename.c_str(), &buffer) == 0;
}

storage_info_t* storage_info_t::get_storage_info()
{
    if (FileExists(emmc_info_t::emmc_sysfs) ||
        FileExists(emmc_info_t::emmc_debugfs)) {
        return new emmc_info_t;
    }
    if (FileExists(ufs_info_t::health_file)) {
        return new ufs_info_t;
    }
    return new storage_info_t;
}

void storage_info_t::refresh()
{
    emmc_info_t mmc;
    ufs_info_t ufs;
    struct statvfs buf;
    if (statvfs(userdata_path.c_str(), &buf) != 0) {
        PLOG_TO(SYSTEM, WARNING) << "Failed to get userdata info";
        return;
    }

    mmc.report();
    ufs.report();
    userdata_total_kb = buf.f_bsize * buf.f_blocks >> 10;
    userdata_free_kb = buf.f_bfree * buf.f_blocks >> 10;
}

void storage_info_t::publish()
@@ -46,13 +76,12 @@ void storage_info_t::publish()
        << LOG_ID_EVENTS;
}

bool emmc_info_t::report()
void emmc_info_t::report()
{
    if (!report_sysfs() && !report_debugfs())
        return false;
        return;

    publish();
    return true;
}

bool emmc_info_t::report_sysfs()
@@ -136,21 +165,21 @@ bool emmc_info_t::report_debugfs()
    return true;
}

bool ufs_info_t::report()
void ufs_info_t::report()
{
    string buffer;
    if (!ReadFileToString(health_file, &buffer)) {
        return false;
        return;
    }

    vector<string> lines = Split(buffer, "\n");
    if (lines.empty()) {
        return false;
        return;
    }

    char rev[8];
    if (sscanf(lines[0].c_str(), "ufs version: 0x%7s\n", rev) < 1) {
        return false;
        return;
    }

    version = "ufs " + string(rev);
@@ -175,10 +204,9 @@ bool ufs_info_t::report()
    }

    if (eol == 0 || (lifetime_a == 0 && lifetime_b == 0)) {
        return false;
        return;
    }

    publish();
    return true;
}