MB-24246: Combine 'writeLock' & 'highSeqnosLock' into one in BasicLinkedList 58/77958/7
authorManu Dhundi <manu@couchbase.com>
Fri, 12 May 2017 16:25:52 +0000 (09:25 -0700)
committerManu Dhundi <manu@couchbase.com>
Fri, 12 May 2017 17:49:45 +0000 (17:49 +0000)
commit59253c54ad8b4f607d45c38629fa3870115b3338
treee9b3c7f8503527247f53c783ce57dd4b83d12586
parent9c7b2ace719a50bb83f831585384aa1f08bc7175
MB-24246: Combine 'writeLock' & 'highSeqnosLock' into one in BasicLinkedList

Functionally 'writeLock' and 'highSeqnosLock' both result in the
serialization of the BasicLinkedList write and other list operations.
Hence this commit combines the 2 locks into one lock.

As a consequence this commit ensures that the writeLock is held on
the BasicLinkedList until the sequence number for the newly added,
updated and soft-deleted is generated. While this is strictly not
needed in new add, it is necessary in update and soft delete as
explained below.

(a) New Add :
   A1, B2, C3 and we are trying to add D4
   A1, B2, C3, D? added but no seqno yet.
   Now we don't really care if range read starts here as it can read
   only A1, B2, C3 in the snapshot.

   But to maintain uniformity (hence simpler code) with update
   and soft-delete we grab writeLock such that we append to list
   + update highSeqno as an atomic operation.

(b) Update (and Soft-delete):
   A1, B2, C3 and we are trying to update B to B4
   A1, B2, C3, B? added but no seqno yet and/or no B2_stale yet
   Now we cannot start the range read here because we do not wait
   for range read to finish to mark the item stale (note that we
   are planning to not send stale(duplicate) items in a snapshot).

   This was already in case (b) using highSeqnosLock, this commit
   uses just writeLock for the same.

The commit also adds documentation regarding the desired heirarchy of
the lock acquisition in BasicLinkedList.

Change-Id: I10a80f55a763d1496adec24fa12bc75d83ea1573
Reviewed-on: http://review.couchbase.org/77958
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>
src/ephemeral_tombstone_purger.cc
src/ephemeral_vb.cc
src/linked_list.cc
src/linked_list.h
src/seqlist.h
tests/mock/mock_basic_ll.h
tests/module_tests/basic_ll_test.cc
tests/module_tests/ephemeral_vb_test.cc