
G. Sheffi, P. Ramalhete and E. Petrank 23:5
read-copy-update (RCU) [40] to support multiple updates. RLU yields relatively simple implementa-
tions, but its integration involves re-designing the entire data-structure. In addition, similarly to RCU,
it suffers from high overheads in write-extensive workloads.
Arbel-Raviv and Brown exploited the EBR manual reclamation to support range queries [3]. Their
technique uses EBR’s global epoch clock for associating data-structure items with their insertion and
deletion timestamps. EEMARQ uses a similar technique for associating data-structure modifications
with respective timestamps. They also took advantage of EBR’s retire-lists, in order to locate nodes
that were deleted during a range query scan. However, while their solution indeed avoids extensive
scanning helping when deleting an item from the data-structure (as imposed by the Snapcollector [51]),
it may still impose significant performance overheads (as shown in Section 4). EEMARQ minimizes
these overheads by keeping a reachable path to deleted nodes (for more details, see Section 3.2).
Multi-Version Concurrency Control
MVCC easily provides isolation between concurrent
reads and updates. I.e., range queries can work on a consistent view of the data, while not interfering
with update operations. This powerful technique is widely used in commercial systems [19, 21], as
well as in research-oriented DBMS [33,53], in-memory shared environments [44,65] and transactional
memory [23, 32, 36, 49, 50]. MVCC has been investigated in the DBMS setting for the last four
decades, both from a theoretical [9, 10, 35, 48, 68] and a practical [19, 33, 37, 42, 53] point of view.
A lot of effort has been put in designing MVCC implementations and addressing the unwanted
side-effects of long version lists. This issue is crucial both for accelerating version list scans and
for reducing the contention between updates and garbage collection. Accelerating DBMS version
list scans (independently of the constant need to prone them) has been investigated in [35]. Most
DBMS-related work that focuses on this issue, tries to minimize the problem by eagerly collecting
unnecessary versions [2, 11, 21, 34, 38, 42, 53].
Safe Memory Reclamation
Most existing in-memory environments that enable linearizable
range queries, avoid managing their memory, by relying on automatic (and blocking) garbage
collection of old versions [7,22,51,67]. Solutions that do manually manage their allocated memory [3,
44, 65], use EBR for safe reclamation. In EBR, a shared epoch counter is incremented periodically,
and upon each operation invocation, the threads announce their observed epoch. The epoch clock
can be advanced when no executing thread has an announcement with a previous epoch. During
reclamation, only nodes that had been retired at least two epochs ago are reclaimed. EBR is safe for
MVCC because a running scan prevents the advance of the epoch clock, and also the reclamation of
any node in the data-structure that was not deleted before the scan.
The MVCC-oriented garbage collector from [8] incorporates reference counting (RC) [17, 18, 28],
in order to maintain lock-freedom while safely reclaiming old versions. Any object can be immediately
reclaimed once its reference count reaches zero, without the need in invoking explicit retire() calls.
While RC simplifies reclamation, it incurs high performance overheads and does not guarantee a tight
bound on unreclaimed garbage (i.e., it is not robust).
Other reclamation schemes were also considered when designing EEMARQ. NBR [61] was one
of the strongest candidates, as it is fast and lock-free (under some hardware assumptions). However,
it is not clear whether NBR can be integrated into a skip list implementation (which serves as one of
our fast indexes). Pointer–based reclamation methods (e.g., Hazard Pointers [41]) allow threads to
protect specific objects (i.e., temporarily prevent their reclamation), by announcing their future access
to these objects, or publishing an announcement indicating the protection of a bigger set of objects
(e.g., Hazard Eras [56], Interval-Based Reclamation [66], Margin Pointers [62]). Although these
schemes are robust (as opposed to EBR), it is unclear how they can be used in MVCC environments.
They require that reaching a reclaimed node from a protected one would be impossible (even if the
CVIT 2016