diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2012-03-29 12:47:49 -0400 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-06-01 12:15:07 -0700 |
commit | e8eb0a9cb6539a7607d4c134daf331400a93d136 (patch) | |
tree | 6642d790b6cb130aaa70b30359b361eaffc78cbc /libglusterfs/src/dict.h | |
parent | 27620d0f7d9b101cc47a13a23928f767248a8cff (diff) |
Optimize for small dicts, and avoid an overrun.
As dicts get used more and more in the I/O path (especially for xattrs and
the new xdata feature), removing some of their inherent inefficiency
becomes more important. This patch addresses some of the issues around
allocating data_pair_t structures separately. Along the way, I found that
the way we're allocating the "members" hash table was subtly wrong, and
could lead to a memory overrun. This is a latent bug because nobody uses
dict_get_new_full that way, but I added an assert to guard against that
possibility. One beneficial side effect is that we now save four pointers'
worth of space per dict, offsetting the extra space used for the new
members.
Change-Id: Ie8c3e49f1e584daec4b0d2d8ce9dafbc76fb57b2
BUG: 827448
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.com/3040
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'libglusterfs/src/dict.h')
-rw-r--r-- | libglusterfs/src/dict.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h index 4e7cf2406eb..2a875039661 100644 --- a/libglusterfs/src/dict.h +++ b/libglusterfs/src/dict.h @@ -99,6 +99,9 @@ struct _dict { char *extra_free; char *extra_stdfree; gf_lock_t lock; + data_pair_t *members_internal; + data_pair_t free_pair; + gf_boolean_t free_pair_in_use; }; @@ -165,8 +168,6 @@ data_t * data_copy (data_t *old); dict_t *get_new_dict_full (int size_hint); dict_t *get_new_dict (); -data_pair_t *get_new_data_pair (); - void dict_foreach (dict_t *this, void (*fn)(dict_t *this, char *key, |