  We present a general technique for garbage collecting old versions for
multiversion concurrency control that simultaneously achieves good time and
space complexity. Our technique takes only $O(1)$ time on average to reclaim
each version and maintains only a constant factor more versions than needed
(plus an additive term). It is designed for multiversion schemes using version
lists, which are the most common.
  Our approach uses two components that are of independent interest. First, we
define a novel range-tracking data structure which stores a set of old versions
and efficiently finds those that are no longer needed. We provide a wait-free
implementation in which all operations take amortized constant time. Second, we
represent version lists using a new lock-free doubly-linked list algorithm that
supports efficient (amortized constant time) removals given a pointer to any
node in the list. These two components naturally fit together to solve the
multiversion garbage collection problem--the range-tracker identifies which
versions to remove and our list algorithm can then be used to remove them from
their version lists. We apply our garbage collection technique to generate
end-to-end time and space bounds for the multiversioning system of Wei et al.
(PPoPP 2021).
