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:
parent
e6dfd45f00
commit
8847c62579
5 changed files with 76 additions and 31 deletions
|
@ -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
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue