Description
Two aspects of old timestep eviction are surprising (to me at least):
- Eviction is performed without consideration of whether it is required. This is fine if version always increments by one, but suppose we have max_versions = 5, and the following versions are written:
0 2 4 5 7
Here we wrote 5 time steps, so as a user I would expect all of them to still be stored. But it is not so! Five overwrote 0 and 7 overwrote 2. So I only have three timesteps in dataspaces after this sequence of puts.
- Eviction is based upon overlap of bounding boxes. Suppose max_versions = 1. Consider the following three scenarios:
a. {version:0, lb:{0,0}, ub:{3,3}} followed by {version: 1, lb:{0,0}, ub:{3,3}}. The first put is evicted and replaced. So far, so good.
b. {version:0, lb:{0,0}, ub:{3,3} } followed by {version: 1, lb:{4,4}, ub:{7,7}}. Nothing is evicted, both are in memory. This seems to violate "max_versions = 1".
c. {version:0, lb:{0,0}, ub:{3,3} } followed by {version: 1, lb:{3,3}, ub:{6,6}}. The first put is evicted and replaced. This honors max_versions, but inconsistent with b.
Fixing 1 seems to just require adding some logic when checking for eviction. We only want to evict if we actually have max_versions objects stored that are eligible for eviction otherwise.
Fixing 2 gets at a semantics issue of what we mean by max_version. So do we mean that we will hold max_version versions of each element of each variable, or do we mean that we will hold elements for up to max_threads, or something else?