DataChecksumsStateStruct cost_delay fields and locking

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Daniel Gustafsson <daniel(at)yesql(dot)se>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: DataChecksumsStateStruct cost_delay fields and locking
Date: 2026-06-17 07:42:54
Message-ID: 2176020b-ecbc-438b-9fc3-9c3593d9e6fc@iki.fi
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

The comment in the DataChecksumsStateStruct says:

>
> /*
> * These fields indicate the target state that the launcher is currently
> * working towards. They can be different from the corresponding launch_*
> * fields, if a new pg_enable/disable_data_checksums() call was made while
> * the launcher/worker was already running.
> *
> * The below members are set when the launcher starts, and are only
> * accessed read-only by the single worker. Thus, we can access these
> * without a lock. If multiple workers, or dynamic cost parameters, are
> * supported at some point then this would need to be revisited.
> */
> DataChecksumsWorkerOperation operation;
> int cost_delay;
> int cost_limit;

The "only accessed read-only by the single worker" part isn't true,
because DataChecksumsWorkerMain() does this:

> /*
> * Check if the cost settings changed during runtime and if so, update
> * to reflect the new values and signal that the access strategy needs
> * to be refreshed.
> */
> LWLockAcquire(DataChecksumsWorkerLock, LW_EXCLUSIVE);
> if ((DataChecksumState->launch_cost_delay != DataChecksumState->cost_delay)
> || (DataChecksumState->launch_cost_limit != DataChecksumState->cost_limit))
> {
> costs_updated = true;
> VacuumCostDelay = DataChecksumState->launch_cost_delay;
> VacuumCostLimit = DataChecksumState->launch_cost_limit;
> VacuumUpdateCosts();
>
> DataChecksumState->cost_delay = DataChecksumState->launch_cost_delay;
> DataChecksumState->cost_limit = DataChecksumState->launch_cost_limit;
> }
> else
> costs_updated = false;
> LWLockRelease(DataChecksumsWorkerLock);

So contrary to the comment, the cost_delay fields are updated by the worker.

Some other observations:

- at the beginning of DataChecksumsWorkerMain(), it reads
DataChecksumState->cost_delay and cost_limit without holding the lock,
and also DataChecksumState->process_shared_catalogs. I think that's OK,
but I would just add locking to it, to remove all doubt.

- the comment says "These fields indicate the target state that the
launcher is currently working towards". It took me a moment to
understand what the means. At first, I thought that it means that it's
the target state of the launcher, but not necessarily what it's
currently using. That's wrong. Those are in fact the values that the
*worker* is *currently* using. launch_cost_delay/limit are the "target"
values, which will eventually be copied into the current
cost_delay/limit values. Perhaps change "... launcher is currently
working towards" into "... worker is currently running with" or
something like that.

- Heikki

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Ewan Young 2026-06-17 08:39:39 btree_gist: Fix NaN handling in float4 and float8 opclasses
Previous Message Amit Kapila 2026-06-17 07:35:48 Re: Improving the names generated for indexes on expressions