From: Ripduman Sohan <[email protected]>

The server goes into degraded mode when a hashtable expansion fails as
every subsequent insert tries to trigger an expansion again.  Changed
semantics to stop expansion completely when once fails.

This can be improved to preventing expansions for the next N seconds
before retrying in case memory becomes available subsequently.

Signed-off-by: Ripduman Sohan <[email protected]>
---
 engines/default_engine/assoc.c |    6 ++++--
 engines/default_engine/assoc.h |    3 +++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/engines/default_engine/assoc.c b/engines/default_engine/assoc.c
index b3e2b88..f1cf9f5 100644
--- a/engines/default_engine/assoc.c
+++ b/engines/default_engine/assoc.c
@@ -161,6 +161,7 @@ static void assoc_expand(struct default_engine *engine) {
         }
     } else {
         engine->assoc.primary_hashtable = engine->assoc.old_hashtable;
+        engine->assoc.no_expansion = true;
         /* Bad news, but we can keep running. */
     }
 }
@@ -182,9 +183,10 @@ int assoc_insert(struct default_engine *engine, hash_item 
*it) {
 
     put_assoc_bucket_ref(engine, bucket);
 
-    if (! engine->assoc.expanding && engine->assoc.hash_items > 
(hashsize(engine->assoc.hashpower) * 3) / 2) {
+    if (! engine->assoc.no_expansion && ! engine->assoc.expanding &&
+        engine->assoc.hash_items > (hashsize(engine->assoc.hashpower) * 3) / 
2) {
         pthread_rwlock_wrlock(&engine->cache_lock);
-        if (! engine->assoc.expanding) /* re-check expansion condition after 
lock acquisition */
+        if (! engine->assoc.no_expansion && ! engine->assoc.expanding) /* 
re-check expansion condition after lock acquisition */
             assoc_expand(engine);
         pthread_rwlock_unlock(&engine->cache_lock);
     }
diff --git a/engines/default_engine/assoc.h b/engines/default_engine/assoc.h
index 47a2718..9d294a7 100644
--- a/engines/default_engine/assoc.h
+++ b/engines/default_engine/assoc.h
@@ -33,6 +33,9 @@ struct assoc {
     * far we've gotten so far. Ranges from 0 .. hashsize(hashpower - 1) - 1.
     */
    unsigned int expand_bucket;
+
+    /* No more expansions please */
+    bool no_expansion;
 };
 
 /* associative array */
-- 
1.7.1

Reply via email to