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
This commit is contained in:
Jin Qian 2017-07-17 15:06:11 -07:00
parent e6dfd45f00
commit 8847c62579
5 changed files with 76 additions and 31 deletions

View file

@ -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

View file

@ -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_ */

View file

@ -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);

View file

@ -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();
}

View file

@ -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()
{
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<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;
}