Re: add function for creating/attaching hash table in DSM registry
Sami Imseih <samimseih@gmail.com>
From: Sami Imseih <samimseih@gmail.com>
To: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Cc: Nathan Bossart <nathandbossart@gmail.com>, pgsql-hackers@postgresql.org
Date: 2025-06-05T18:38:25Z
Lists: pgsql-hackers
Thanks for this patch! I have implemented this pattern several times,
so this is really helpful.
I have a few early comments, but I plan on trying this out next.
1/
> > +typedef struct NamedDSMHashState
> > +{
> > + dsa_handle dsah;
> > + dshash_table_handle dshh;
> > + int dsa_tranche;
> > + char dsa_tranche_name[68]; /* name + "_dsa" */
> > + int dsh_tranche;
> > + char dsh_tranche_name[68]; /* name + "_dsh" */
> > +} NamedDSMHashState;
>
> I don't have enough knowledge to review the rest of the patch, but
> shouldn't this use NAMEDATALEN, rather than hard-coding the default
> length?
NamedLWLockTrancheRequest uses NAMEDATALEN = 64 bytes for the
tranche_name
typedef struct NamedLWLockTrancheRequest
{
char tranche_name[NAMEDATALEN];
int num_lwlocks;
} NamedLWLockTrancheRequest;
but in the case here, "_dsa" or "_dsh" will occupy another 4 bytes.
I think instead of hardcoding, we should #define a length,
i.e. #define NAMEDDSMTRANCHELEN (NAMEDATALEN + 4)
2/ Can you group the dsa and dsh separately. I felt this was a bit
difficult to read?
+ /* Initialize LWLock tranches for the DSA and dshash table. */
+ state->dsa_tranche = LWLockNewTrancheId();
+ state->dsh_tranche = LWLockNewTrancheId();
+ sprintf(state->dsa_tranche_name, "%s_dsa", name);
+ sprintf(state->dsh_tranche_name, "%s_dsh", name);
+ LWLockRegisterTranche(state->dsa_tranche,
state->dsa_tranche_name);
+ LWLockRegisterTranche(state->dsh_tranche,
state->dsh_tranche_name);
3/ It will be good to "Assert(dsh)" before "return dsh;" for safety?
MemoryContextSwitchTo(oldcontext);
LWLockRelease(DSMRegistryLock);
return dsh;
}
--
Sami Imseih
Amazon Web Services (AWS)
Commits
-
Fix cross-version upgrade test breakage from commit fe07100e82.
- 0c2b7174c362 19 (unreleased) landed
-
Add GetNamedDSA() and GetNamedDSHash().
- fe07100e82b0 19 (unreleased) landed
-
Remove dynamic_shared_memory_type=none
- bcbd940806a2 12.0 cited
-
Introduce dynamic shared memory areas.
- 13df76a537cc 10.0 cited
-
Relax the requirement that all lwlocks be stored in a single array.
- ea9df812d850 9.4.0 cited