summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/nfs/server/src/nfs.c53
-rw-r--r--xlators/nfs/server/src/nfs.h8
-rw-r--r--xlators/nfs/server/src/nfs3-helpers.c28
3 files changed, 85 insertions, 4 deletions
diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c
index fb664715218..6f0e4132899 100644
--- a/xlators/nfs/server/src/nfs.c
+++ b/xlators/nfs/server/src/nfs.c
@@ -39,6 +39,7 @@
#include "mount3.h"
#include "nfs3.h"
#include "nfs-mem-types.h"
+#include "statedump.h"
/* Every NFS version must call this function with the init function
* for its particular version.
@@ -701,6 +702,8 @@ init (xlator_t *this) {
goto err;
}
+ LOCK_INIT (&nfs->lock);
+
gf_log (GF_NFS, GF_LOG_INFO, "NFS service started");
err:
@@ -750,9 +753,59 @@ fini (xlator_t *this)
return 0;
}
+int
+nfs_priv_dump (xlator_t *this)
+{
+
+ char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, };
+ struct nfs_state *nfs = NULL;
+ int64_t ino_cnt = 0;
+ int64_t entry_cnt = 0;
+ int64_t intvl_ino_cnt = 0;
+ int64_t intvl_entry_cnt = 0;
+
+ if (!this || !this->private)
+ goto out;
+
+ nfs = this->private;
+
+ gf_proc_dump_build_key (key_prefix, "xlator.nfs",
+ "priv");
+ gf_proc_dump_add_section (key_prefix);
+
+ LOCK (&nfs->lock);
+ {
+ intvl_ino_cnt = nfs->res_stat.intvl_ino_cnt;
+ intvl_entry_cnt = nfs->res_stat.intvl_entry_cnt;
+ ino_cnt = nfs->res_stat.ino_cnt;
+ entry_cnt = nfs->res_stat.entry_cnt;
+
+ nfs->res_stat.intvl_ino_cnt = 0;
+ nfs->res_stat.intvl_entry_cnt = 0;
+ }
+ UNLOCK (&nfs->lock);
+
+ gf_proc_dump_write ("Interval hard resolution (inode)", "%ld",
+ intvl_ino_cnt);
+ gf_proc_dump_write ("Interval hard resolution (entry)", "%ld",
+ intvl_entry_cnt);
+ gf_proc_dump_write ("Aggregate hard resolution (inode)", "%ld",
+ ino_cnt);
+ gf_proc_dump_write ("Aggregate hard resoluton (entry)", "%ld",
+ entry_cnt);
+
+out:
+ return 0;
+}
+
struct xlator_cbks cbks = { };
struct xlator_fops fops = { };
+struct xlator_dumpops dumpops = {
+ .priv = nfs_priv_dump,
+};
+
+
/* TODO: If needed, per-volume options below can be extended to be export
+ * specific also because after export-dir is introduced, a volume is not
+ * neccessarily an export whereas different subdirectories within that volume
diff --git a/xlators/nfs/server/src/nfs.h b/xlators/nfs/server/src/nfs.h
index ed91b79bb42..a015cb6cac5 100644
--- a/xlators/nfs/server/src/nfs.h
+++ b/xlators/nfs/server/src/nfs.h
@@ -58,6 +58,12 @@ struct nfs_initer_list {
rpcsvc_program_t *program;
};
+typedef struct nfs_hard_res_stats {
+ int64_t ino_cnt;
+ int64_t entry_cnt;
+ int64_t intvl_ino_cnt;
+ int64_t intvl_entry_cnt;
+} nfs_hard_res_stats_t;
struct nfs_state {
rpcsvc_t *rpcsvc;
@@ -74,6 +80,8 @@ struct nfs_state {
int dynamicvolumes;
int enable_ino32;
unsigned int override_portnum;
+ gf_lock_t lock;
+ nfs_hard_res_stats_t res_stat;
};
#define gf_nfs_dvm_on(nfsstt) (((struct nfs_state *)nfsstt)->dynamicvolumes == GF_NFS_DVM_ON)
diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c
index 1c4f69fad22..e59d3ba7601 100644
--- a/xlators/nfs/server/src/nfs3-helpers.c
+++ b/xlators/nfs/server/src/nfs3-helpers.c
@@ -2909,8 +2909,9 @@ err:
int
nfs3_fh_resolve_inode_hard (nfs3_call_state_t *cs)
{
- int ret = -EFAULT;
- nfs_user_t nfu = {0, };
+ int ret = -EFAULT;
+ nfs_user_t nfu = {0, };
+ struct nfs_state *nfs = NULL;
if (!cs)
return ret;
@@ -2929,6 +2930,16 @@ nfs3_fh_resolve_inode_hard (nfs3_call_state_t *cs)
", hashcount: %d, current hashidx %d",
uuid_utoa (cs->resolvefh.gfid),
cs->resolvefh.hashcount, cs->hashidx);
+
+ nfs = THIS->private;
+
+ LOCK (&nfs->lock);
+ {
+ nfs->res_stat.ino_cnt++;
+ nfs->res_stat.intvl_ino_cnt++;
+ }
+ UNLOCK (&nfs->lock);
+
ret = nfs_root_loc_fill (cs->vol->itable, &cs->resolvedloc);
if (ret == 0) {
@@ -2951,8 +2962,9 @@ out:
int
nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)
{
- int ret = -EFAULT;
- nfs_user_t nfu = {0, };
+ int ret = -EFAULT;
+ nfs_user_t nfu = {0, };
+ struct nfs_state *nfs = NULL;
if (!cs)
return ret;
@@ -2962,6 +2974,14 @@ nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)
gf_log (GF_NFS3, GF_LOG_TRACE, "FH hard resolution: gfid: %s "
", entry: %s, hashidx: %d", uuid_utoa (cs->resolvefh.gfid),
cs->resolventry, cs->hashidx);
+ nfs = THIS->private;
+
+ LOCK (&nfs->lock);
+ {
+ nfs->res_stat.entry_cnt++;
+ nfs->res_stat.intvl_entry_cnt++;
+ }
+ UNLOCK (&nfs->lock);
ret = nfs_entry_loc_fill (cs->vol->itable, cs->resolvefh.gfid,
cs->resolventry, &cs->resolvedloc,