From c4b42a8623cb3079190e764025e31857ee186c6f Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 11 Jun 2009 14:51:12 -0700 Subject: [PATCH] Added support for MStatfs to librados and Objecter. --- src/include/librados.h | 15 +++++++++++++++ src/librados.cc | 37 +++++++++++++++++++++++++++++++++++-- src/osdc/Objecter.cc | 39 +++++++++++++++++++++++++++++++++++++++ src/osdc/Objecter.h | 16 +++++++++++++++- 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/include/librados.h b/src/include/librados.h index bb2c5a4e00a40..c7a8aadf95254 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -36,6 +36,20 @@ struct rados_pool_stat_t { long long unsigned num_objects_degraded; }; +struct ceph_stat_fs_t { + int f_bsize; + int f_frsize; + int f_blocks; + int f_bfree; + int f_bavail; + int f_files; + int f_ffree; + int f_favail; + int f_fsid; + int f_flag; + int f_namemax; +}; + int rados_open_pool(const char *name, rados_pool_t *pool); int rados_close_pool(rados_pool_t pool); void rados_set_snap(rados_pool_t pool, rados_snap_t snap); @@ -105,6 +119,7 @@ public: int list_pools(std::vector& v); int get_pool_stats(std::vector& v, std::map& stats); + int get_fs_stats(ceph_stat_fs_t& result); int snap_create(rados_pool_t pool, const char *snapname); int snap_remove(rados_pool_t pool, const char *snapname); diff --git a/src/librados.cc b/src/librados.cc index 4dedf6a2a2740..82074a39d2622 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -110,6 +110,7 @@ public: int list_pools(std::vector& ls); int get_pool_stats(std::vector& ls, map& result); + int get_fs_stats( ceph_stat_fs_t& result ); int list(PoolCtx& pool, int max_entries, std::list& entries, RadosClient::PGLSOp& op); @@ -385,7 +386,7 @@ int RadosClient::list_pools(std::vector& v) return 0; } -int RadosClient::get_pool_stats(std::vector& v, map& result) +int RadosClient::get_pool_stats(std::vector& pools, map& result) { map r; Mutex mylock("RadosClient::get_pool_stats::mylock"); @@ -393,7 +394,7 @@ int RadosClient::get_pool_stats(std::vector& v, mapget_pool_stats(v, &r, new C_SafeCond(&mylock, &cond, &done)); + objecter->get_pool_stats(pools, &r, new C_SafeCond(&mylock, &cond, &done)); lock.Unlock(); mylock.Lock(); @@ -417,6 +418,33 @@ int RadosClient::get_pool_stats(std::vector& v, mapget_fs_stats(stats, new C_SafeCond(&mylock, &cond, &done)); + lock.Unlock(); + + mylock.Lock(); + while (!done) cond.Wait(mylock); + mylock.Unlock(); + + result.f_bsize = 4096; + result.f_frsize = 4096; + result.f_blocks = stats.f_total / 4 ; + result.f_bfree = stats.f_free / 4; + result.f_bavail = stats.f_avail / 4; + result.f_files = stats.f_objects / 4; + result.f_ffree = -1; + result.f_favail = -1; + result.f_fsid = -1; + result.f_flag = 0; + result.f_namemax = 1024; + return 0; +} // SNAPS @@ -781,6 +809,11 @@ int Rados::get_pool_stats(std::vector& v, std::mapget_pool_stats(v, result); } +int Rados::get_fs_stats(ceph_stat_fs_t& result) { + if(!client) return -EINVAL; + return client->get_fs_stats(result); +} + int Rados::list(rados_pool_t pool, int max, std::list& entries, Rados::ListCtx& ctx) { if (!client) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index afa7d4192db85..3fedb3a4b3c9e 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -27,6 +27,8 @@ #include "messages/MGetPoolStats.h" #include "messages/MGetPoolStatsReply.h" +#include "messages/MStatfs.h" +#include "messages/MStatfsReply.h" #include "messages/MOSDFailure.h" @@ -70,6 +72,10 @@ void Objecter::dispatch(Message *m) handle_get_pool_stats_reply((MGetPoolStatsReply*)m); break; + case CEPH_MSG_STATFS_REPLY: + handle_fs_stats_reply((MStatfsReply*)m); + break; + default: dout(1) << "don't know message type " << m->get_type() << dendl; assert(0); @@ -672,10 +678,43 @@ void Objecter::handle_get_pool_stats_reply(MGetPoolStatsReply *m) } +void Objecter::get_fs_stats(ceph_statfs& result, Context *onfinish) { + dout(10) << "get_fs_stats" << dendl; + + StatfsOp *op = new StatfsOp; + op->tid = ++last_tid; + op->stats = &result; + op->onfinish = onfinish; + op_statfs[op->tid] = op; + fs_stats_submit(op); +} +void Objecter::fs_stats_submit(StatfsOp *op) { + dout(10) << "fs_stats_submit" << op->tid << dendl; + MStatfs *m = new MStatfs(monmap->fsid, op->tid); + int mon = monmap->pick_mon(); + messenger->send_message(m, monmap->get_inst(mon)); +} +void Objecter::handle_fs_stats_reply(MStatfsReply *m) { + dout(10) << "handle_fs_stats_reply " << *m << dendl; + tid_t tid = m->h.tid; + if (op_statfs.count(tid)) { + StatfsOp *op = op_statfs[tid]; + dout(10) << "have request " << tid << " at " << op << dendl; + op->stats = &(m->h.st); + op->onfinish->finish(0); + delete op->onfinish; + op_statfs.erase(tid); + delete op; + } else { + dout(10) << "unknown request " << tid << dendl; + } + dout(10) << "done" << dendl; + delete m; +} // scatter/gather diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 1177091da91fb..caec25e973949 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -36,6 +36,7 @@ class MonMap; class Message; class MGetPoolStatsReply; +class MStatfsReply; // ----------------------------------------- @@ -273,13 +274,19 @@ class Objecter { map *pool_stats; Context *onfinish; }; - + + struct StatfsOp { + tid_t tid; + ceph_statfs *stats; + Context *onfinish; + }; private: // pending ops hash_map op_read; hash_map op_modify; map op_poolstat; + map op_statfs; /** * track pending ops by pg @@ -462,6 +469,13 @@ public: void get_pool_stats(vector& pools, map *result, Context *onfinish); + // --------------------------- + // df stats +private: + void fs_stats_submit(StatfsOp *op); +public: + void handle_fs_stats_reply(MStatfsReply *m); + void get_fs_stats(ceph_statfs& result, Context *onfinish); // --------------------------- // some scatter/gather hackery -- 2.39.5