Files
neon/pageserver/ctl
Christian Schwarz 6db427edc3 page_cache: use try_write in drop_buffers_for_immutable
In #5023, we want to make the slot locks async.

The `drop_buffers_for_immutable` is used by `EphemeralFile::drop`
and locks the slot locks.

Drop impls can't be async, so, we must find a workaround.

Some background on drop_buffers_for_immutable: it's really just a
nice courtesy to proactively give back the slots. After dropping
the EphemeralFile, we're not going to use them in the future and
so, `find_victim` will repurpose them eventually.
The only part that is important is `remove_mapping`, because if
we don't do that, we'll never get back to removing the
materialized_page_map / immutable_page_map, thereby effectively
leaking memory.

So, how to work around the lack of async destructors: the simple way
would be to push the work into a background queue. This has an obvious
perf penalty.

So, this PR takes another approach, based on the insight that the
BlockLease/PageReadGuards handed out by EphemeralFile barely outlive
the EphemeralFile. This PR changes the lifetime of the PageReadGuard
returned by EphemeralFile to _ensure_ this in the type system.

With that, we can switch to try_write(), and be quite certain that
there are no outstanding PageReadGuards for the EphemeralFile that
is being dropped.
So, we know we're doing the slot clean-up work.

Note: this PR does not debate whether the slot cleanup work is really
necessary. In my opinion, we can just not do it and let the pages get
find_victim'ed a little later than now.
But, let's have that discussion another day.
2023-08-28 17:49:16 +02:00
..