From 923e9a9d17241770bfe797108f232c2fe80b488f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 17 Jun 2009 15:46:49 -0700 Subject: [PATCH] rados: fix statfs definition Isolate posix lameness to uclient only. Unify 'rados df' and 'rados dfpools' --- src/client/Client.cc | 8 ++++---- src/include/ceph_fs.h | 6 ++---- src/include/librados.h | 6 ++---- src/librados.cc | 9 ++++----- src/mon/PGMonitor.cc | 8 ++++---- src/rados.cc | 43 ++++++++++++++++++++++++++---------------- 6 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index dea62357915ed..a095e2782adec 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3990,10 +3990,10 @@ int Client::statfs(const char *path, struct statvfs *stbuf) memset(stbuf, 0, sizeof(*stbuf)); //divide the results by 4 to give them as Posix expects - stbuf->f_blocks = stats.f_total/4; - stbuf->f_bfree = stats.f_free/4; - stbuf->f_bavail = stats.f_avail/4; - stbuf->f_files = stats.f_objects; + stbuf->f_blocks = stats.kb/4; + stbuf->f_bfree = stats.kb_avail/4; + stbuf->f_bavail = stats.kb_avail/4; + stbuf->f_files = stats.num_objects; //fill in rest to make Posix happy stbuf->f_bsize = 4096; stbuf->f_frsize = 4096; diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 9b96d17e988b3..bd74baa46fc1d 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -289,10 +289,8 @@ struct ceph_mon_statfs { }; struct ceph_statfs { - __le64 f_total; - __le64 f_free; /* used = total - free (KB) */ - __le64 f_avail; /* usable */ - __le64 f_objects; + __le64 kb, kb_used, kb_avail; + __le64 num_objects; }; struct ceph_mon_statfs_reply { diff --git a/src/include/librados.h b/src/include/librados.h index 0d2dccd365b74..ee9b76d061c30 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -37,10 +37,8 @@ struct rados_pool_stat_t { }; struct rados_statfs_t { - int f_total; - int f_free; - int f_avail; - int f_objects; + __u64 kb, kb_used, kb_avail; + __u64 num_objects; }; int rados_open_pool(const char *name, rados_pool_t *pool); diff --git a/src/librados.cc b/src/librados.cc index 2c8f9b47b899e..e36488bc90574 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -447,11 +447,10 @@ int RadosClient::get_fs_stats( rados_statfs_t& result ) { while (!done) cond.Wait(mylock); mylock.Unlock(); - //divide by 4 to give it as Posix expects. - result.f_total = stats.f_total / 4 ; - result.f_free = stats.f_free / 4; - result.f_avail = stats.f_avail / 4; - result.f_objects = stats.f_objects / 4; + result.kb = stats.kb; + result.kb_used = stats.kb_used; + result.kb_avail = stats.kb_avail; + result.num_objects = stats.num_objects; return 0; } diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 48fa4b1c7d0af..735e2962d560e 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -220,10 +220,10 @@ void PGMonitor::handle_statfs(MStatfs *statfs) reply = new MStatfsReply(mon->monmap->fsid, statfs->tid); // these are in KB. - reply->h.st.f_total = pg_map.osd_sum.kb; - reply->h.st.f_free = pg_map.osd_sum.kb_avail; - reply->h.st.f_avail = pg_map.osd_sum.kb_avail; - reply->h.st.f_objects = pg_map.pg_sum.num_objects; + reply->h.st.kb = pg_map.osd_sum.kb; + reply->h.st.kb_used = pg_map.osd_sum.kb_used; + reply->h.st.kb_avail = pg_map.osd_sum.kb_avail; + reply->h.st.num_objects = pg_map.pg_sum.num_objects; // reply mon->messenger->send_message(reply, statfs->get_orig_source_inst()); diff --git a/src/rados.cc b/src/rados.cc index d48d1bc2c4af6..45f00d4dfb441 100644 --- a/src/rados.cc +++ b/src/rados.cc @@ -34,7 +34,7 @@ void usage() */ cerr << "Commands:\n"; cerr << " lspools -- list pools\n"; - cerr << " dfpools -- show pool size, usage\n\n"; + cerr << " df -- show per-pool and total usage\n\n"; cerr << "Pool commands:\n"; cerr << " get objname -- fetch object\n"; @@ -285,13 +285,16 @@ int main(int argc, const char **argv) exit(1); } + int ret = 0; + // open pool? rados_pool_t p; if (pool) { int r = rados.open_pool(pool, &p); if (r < 0) { cerr << "error opening pool " << pool << ": " << strerror(-r) << std::endl; - exit(0); + ret = -1; + goto out; } } @@ -300,7 +303,8 @@ int main(int argc, const char **argv) int r = rados.snap_lookup(p, snapname, &snapid); if (r < 0) { cerr << "error looking up snap '" << snapname << "': " << strerror(-r) << std::endl; - exit(1); + ret = -1; + goto out; } } if (snapid != CEPH_NOSNAP) { @@ -308,7 +312,8 @@ int main(int argc, const char **argv) int r = rados.snap_get_name(p, snapid, &name); if (r < 0) { cerr << "snapid " << snapid << " doesn't exist in pool " << pool << std::endl; - exit(1); + ret = -1; + goto out; } rados.set_snap(p, snapid); cout << "selected snap " << snapid << " '" << snapname << "'" << std::endl; @@ -321,7 +326,8 @@ int main(int argc, const char **argv) for (vector::iterator i = vec.begin(); i != vec.end(); ++i) cout << *i << std::endl; } - else if (strcmp(nargs[0], "dfpools") == 0) { + else if (strcmp(nargs[0], "df") == 0) { + // pools vector vec; rados.list_pools(vec); @@ -337,6 +343,14 @@ int main(int argc, const char **argv) i->second.num_object_clones, i->second.num_objects_degraded); } + + // total + rados_statfs_t tstats; + rados.get_fs_stats(tstats); + printf(" total used %12lld %12lld\n", (long long unsigned)tstats.kb_used, + (long long unsigned)tstats.num_objects); + printf(" total avail %12lld\n", (long long unsigned)tstats.kb_avail); + printf(" total space %12lld\n", (long long unsigned)tstats.kb); } else if (strcmp(nargs[0], "ls") == 0) { @@ -357,14 +371,6 @@ int main(int argc, const char **argv) cout << *iter << std::endl; } } - else if (strcmp(nargs[0], "df") == 0) { - rados_statfs_t stats; - rados.get_fs_stats(stats); - cout << "Total space: " << stats.f_total << std::endl - << "Total free: " << stats.f_free << std::endl - << "Total available:" << stats.f_avail << std::endl - << "Total objects :" << stats.f_objects << std::endl; - } else if (strcmp(nargs[0], "get") == 0) { if (!pool || nargs.size() < 2) usage(); @@ -373,7 +379,8 @@ int main(int argc, const char **argv) int r = rados.read(p, oid, 0, outdata, 0); if (r < 0) { cerr << "error reading " << oid << " from pool " << pool << ": " << strerror(-r) << std::endl; - exit(0); + ret = -1; + goto out; } else writeData = true; @@ -389,7 +396,8 @@ int main(int argc, const char **argv) int r = rados.write_full(p, oid, indata); if (r < 0) { cerr << "error writing " << oid << " to pool " << pool << ": " << strerror(-r) << std::endl; - exit(0); + ret = -1; + goto out; } } else if (strcmp(nargs[0], "rm") == 0) { @@ -399,7 +407,8 @@ int main(int argc, const char **argv) int r = rados.remove(p, oid); if (r < 0) { cerr << "error removing " << oid << " from pool " << pool << ": " << strerror(-r) << std::endl; - exit(0); + ret = -1; + goto out; } } @@ -491,6 +500,8 @@ int main(int argc, const char **argv) } } + + out: if (pool) rados.close_pool(p); -- 2.39.5