MB-23263: DefragmenterVisitor: Check blob refcount 58/76958/10
authorolivermd <oliver.downard@couchbase.com>
Wed, 19 Apr 2017 08:55:34 +0000 (09:55 +0100)
committerDave Rigby <daver@couchbase.com>
Wed, 19 Apr 2017 14:41:14 +0000 (14:41 +0000)
commit27ea3fea4d2b25d9175b9862cddbf7fde6820037
tree3454deb688bf6fd6e121702c765224bc56e3725b
parent663d0762b438cf730f103757f05b67a26055b160
MB-23263: DefragmenterVisitor: Check blob refcount

This patch adds the facility to check the refcount value of a
SingleThreadedRCPTR and uses this to ensure that the refcount of the
blob is less than 2 before the defragmenter reallocates it. This is to
ensure that we do not end up just creating a copy of the blob thus
increasing memory usage which would be the opposite of what you would
expect from the defragmenter.

It's worth noting that it appears as though something could create
another reference to the blob without holding the hashtable lock. This
could lead to a soft data race on the refcount. This means that we
cannot give a hard guarantee that the defragmenter doesn't duplicate the
blob, just that it will in most cases. The case where it won't will be
where the other thing creating the reference doesn't hold the hash
bucket lock and happens to create a reference after refcount is read but
before the blob is reallocated, which seems rare.

Change-Id: I3a8b8812ac039445451952384cb5b40ce8b433cb
Reviewed-on: http://review.couchbase.org/76958
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>
src/atomic.h
src/defragmenter_visitor.cc
tests/module_tests/defragmenter_test.cc