summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2009-10-07 03:43:12 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-10-07 02:36:23 -0700
commitfee63b09862e228eb95f5354c533d237e3a462b7 (patch)
tree908ff2c397bf21c1a44c2497399ba08877a9e3b3 /xlators
parent02e934c0aeedf44c3213829e593f10ccaf4e6bba (diff)
performance/stat-prefetch: change behaviour of sp_lookup when xattr_req is not NULL.
- if the xattr_req is empty (fuse just creates an empty dictionary and sends along lookup) we can still use the cache prefetched during readdir, since we need not fill the reply dictionary. Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 284 (performance actually decreases for 'ls -l' on a directory containing large number of files with stat-prefetch loaded) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=284
Diffstat (limited to 'xlators')
-rw-r--r--xlators/performance/stat-prefetch/src/stat-prefetch.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/xlators/performance/stat-prefetch/src/stat-prefetch.c b/xlators/performance/stat-prefetch/src/stat-prefetch.c
index d44aa4949..1b19a58d1 100644
--- a/xlators/performance/stat-prefetch/src/stat-prefetch.c
+++ b/xlators/performance/stat-prefetch/src/stat-prefetch.c
@@ -494,22 +494,42 @@ out:
}
+void
+sp_is_empty (dict_t *this, char *key, data_t *value, void *data)
+{
+ char *ptr = data;
+
+ if (ptr && *ptr) {
+ *ptr = 0;
+ }
+}
+
+
int32_t
sp_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)
{
- sp_local_t *local = NULL;
+ sp_local_t *local = NULL;
gf_dirent_t dirent;
- int32_t ret = -1, op_ret = -1, op_errno = EINVAL;
- sp_cache_t *cache = NULL;
- struct stat *postparent = NULL, *buf = NULL;
- call_frame_t *wind_frame = NULL;
- char lookup_behind = 0;
+ int32_t ret = -1, op_ret = -1, op_errno = EINVAL;
+ sp_cache_t *cache = NULL;
+ struct stat *postparent = NULL, *buf = NULL;
+ call_frame_t *wind_frame = NULL;
+ char lookup_behind = 0;
+ char xattr_req_empty = 1;
if (loc == NULL) {
goto unwind;
}
- if (xattr_req || (loc->parent == NULL) || (loc->name == NULL)) {
+ if ((loc->parent == NULL) || (loc->name == NULL)) {
+ goto wind;
+ }
+
+ if (xattr_req != NULL) {
+ dict_foreach (xattr_req, sp_is_empty, &xattr_req_empty);
+ }
+
+ if (!xattr_req_empty) {
goto wind;
}