Repository: incubator-quickstep
Updated Branches:
  refs/heads/master 539e1ebe0 -> d1dbb0d9b


Fix the hanging problem of SeparateChainingHashTable::resize()


Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/d1dbb0d9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/d1dbb0d9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/d1dbb0d9

Branch: refs/heads/master
Commit: d1dbb0d9bc2d1f001deee4039157b0be464870f4
Parents: 539e1eb
Author: Jianqiao Zhu <jianq...@cs.wisc.edu>
Authored: Sun Feb 18 01:16:07 2018 -0600
Committer: Jianqiao Zhu <jianq...@cs.wisc.edu>
Committed: Sun Feb 18 01:16:07 2018 -0600

----------------------------------------------------------------------
 storage/SeparateChainingHashTable.hpp | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/d1dbb0d9/storage/SeparateChainingHashTable.hpp
----------------------------------------------------------------------
diff --git a/storage/SeparateChainingHashTable.hpp 
b/storage/SeparateChainingHashTable.hpp
index 2403623..2594f61 100644
--- a/storage/SeparateChainingHashTable.hpp
+++ b/storage/SeparateChainingHashTable.hpp
@@ -243,9 +243,10 @@ class SeparateChainingHashTable : public HashTable<ValueT,
                                         HashTablePreallocationState 
*prealloc_state);
 
   // Determine whether it is actually necessary to resize this hash table.
-  // Checks that there is at least one unallocated bucket, and that there is
+  // Checks that there are sufficient unallocated buckets, and that there are
   // at least 'extra_variable_storage' bytes of variable-length storage free.
-  bool isFull(const std::size_t extra_variable_storage) const;
+  bool isFull(const std::size_t extra_buckets,
+              const std::size_t extra_variable_storage) const;
 
   // Helper object to manage key storage.
   HashTableKeyManager<serializable, force_key_copy> key_manager_;
@@ -1131,7 +1132,7 @@ void SeparateChainingHashTable<ValueT, resizable, 
serializable, force_key_copy,
   // Recheck whether the hash table is still full. Note that multiple threads
   // might wait to rebuild this hash table simultaneously. Only the first one
   // should do the rebuild.
-  if (!isFull(extra_variable_storage)) {
+  if (!isFull(extra_buckets, extra_variable_storage)) {
     return;
   }
 
@@ -1505,9 +1506,11 @@ template <typename ValueT,
           bool force_key_copy,
           bool allow_duplicate_keys>
 bool SeparateChainingHashTable<ValueT, resizable, serializable, 
force_key_copy, allow_duplicate_keys>
-    ::isFull(const std::size_t extra_variable_storage) const {
-  if (header_->buckets_allocated.load(std::memory_order_relaxed) >= 
header_->num_buckets) {
-    // All buckets are allocated.
+    ::isFull(const std::size_t extra_buckets,
+             const std::size_t extra_variable_storage) const {
+  if (header_->buckets_allocated.load(std::memory_order_relaxed)
+          + extra_buckets >= header_->num_buckets) {
+    // Not enough buckets.
     return true;
   }
 

Reply via email to