diff options
author | N Balachandran <nbalacha@redhat.com> | 2018-06-22 10:42:42 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2018-06-29 11:10:47 +0000 |
commit | b3c2116d99a5c049e4ee0f88f35440258b49496e (patch) | |
tree | 20215379c379842c07746bda8c3bea3c54024c83 /xlators/cluster/dht/src/dht-helper.c | |
parent | c0e66dddcd8964871e0d574f927684ee7e3c4904 (diff) |
cluster/dht: Do not try to use up the readdirp buffer
DHT attempts to use up the entire buffer in readdirp before
unwinding in an attempt to reduce the number of calls.
However, this has 2 disadvantages:
1. This can cause a stack overflow when parallel readdir
is enabled. If the buffer only has a little space,rda can send back
only one or two entries. If those entries are stripped out by
dht_readdirp_cbk (linkto files for example) it will once again
wind down to rda in an attempt to fill the buffer before unwinding to FUSE.
This process can continue for several iterations, causing the stack
to grow and eventually overflow, causing the process to crash.
2. If parallel readdir is disabled, dht could send readdirp
calls with small buffers to the bricks, thus increasing the
number of network calls.
We are therefore reverting to the existing behaviour.
Please note, this only mitigates the stack overflow, it does
not prevent it from happening. This is still possible if
a subvol has thousands of linkto files for instance.
Change-Id: I291bc181c5249762d0c4fe27fa4fc2631166adf5
fixes: bz#1593548
Signed-off-by: N Balachandran <nbalacha@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-helper.c')
-rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index c301b1fd47e..2f2ca1f635e 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -818,8 +818,6 @@ dht_local_wipe (xlator_t *this, dht_local_t *local) if (local->ret_cache) GF_FREE (local->ret_cache); - gf_dirent_free (&local->entries); - mem_put (local); } @@ -859,7 +857,6 @@ dht_local_init (call_frame_t *frame, loc_t *loc, fd_t *fd, glusterfs_fop_t fop) inode); } - INIT_LIST_HEAD (&local->entries.list); frame->local = local; out: |