From 8847c62579282cd67a80d7354ccf26064aaed4e5 Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Mon, 17 Jul 2017 15:06:11 -0700 Subject: [PATCH] storaged: record userdata space utilization Update disk space utilization together with diskstats since we will use free space size to co-relate disk performance. Bug: 63629306 Change-Id: I4e5694aaff3b71aa56db451f1bc92ccfb07e5086 --- storaged/include/storaged.h | 3 ++ storaged/include/storaged_info.h | 37 +++++++++++--------- storaged/main.cpp | 2 +- storaged/storaged.cpp | 7 ++++ storaged/storaged_info.cpp | 58 +++++++++++++++++++++++--------- 5 files changed, 76 insertions(+), 31 deletions(-) diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h index 514798bff..fa6840638 100644 --- a/storaged/include/storaged.h +++ b/storaged/include/storaged.h @@ -256,6 +256,7 @@ private: uid_monitor mUidm; time_t mStarttime; sp battery_properties; + std::unique_ptr 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& who); + + void report_storage_info(); }; // Eventlog tag diff --git a/storaged/include/storaged_info.h b/storaged/include/storaged_info.h index 913c814ac..7d04c7a0d 100644 --- a/storaged/include/storaged_info.h +++ b/storaged/include/storaged_info.h @@ -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_ */ diff --git a/storaged/main.cpp b/storaged/main.cpp index 4d1e43014..6b82904d2 100644 --- a/storaged/main.cpp +++ b/storaged/main.cpp @@ -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); diff --git a/storaged/storaged.cpp b/storaged/storaged.cpp index 54d429cd8..06afea693 100644 --- a/storaged/storaged.cpp +++ b/storaged/storaged.cpp @@ -200,6 +200,10 @@ void storaged_t::binderDied(const wp& 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(); } diff --git a/storaged/storaged_info.cpp b/storaged/storaged_info.cpp index 434bd74ae..b5fb13e0c 100644 --- a/storaged/storaged_info.cpp +++ b/storaged/storaged_info.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -30,13 +31,42 @@ using namespace std; using namespace android::base; -void report_storage_health() -{ - emmc_info_t mmc; - ufs_info_t ufs; +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" +}; - mmc.report(); - ufs.report(); +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() +{ + struct statvfs buf; + if (statvfs(userdata_path.c_str(), &buf) != 0) { + PLOG_TO(SYSTEM, WARNING) << "Failed to get userdata info"; + return; + } + + 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 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; }