PG-1863 Do not try to delete keys or log WAL for temporary tables

We forgot to have a check against trying to delete leftover SMGR keys
for temporary tables which is a useless operation since they are store
in memory.

Additionally we forgot to prevent WAL from being written when creating
or removing a key in smgrcreate() for temporary tables.
pull/238/head
Andreas Karlsson 1 month ago committed by Andreas Karlsson
parent d83b36e58d
commit bccaa7ab15
  1. 68
      contrib/pg_tde/src/smgr/pg_tde_smgr.c

@ -70,6 +70,26 @@ static bool tde_smgr_has_temp_key(const RelFileLocator *rel);
static void tde_smgr_remove_temp_key(const RelFileLocator *rel);
static void CalcBlockIv(ForkNumber forknum, BlockNumber bn, const unsigned char *base_iv, unsigned char *iv);
static void
tde_smgr_log_create_key(const RelFileLocator *rlocator)
{
XLogRelKey xlrec = {.rlocator = *rlocator};
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, sizeof(xlrec));
XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_RELATION_KEY);
}
static void
tde_smgr_log_delete_key(const RelFileLocator *rlocator)
{
XLogRelKey xlrec = {.rlocator = *rlocator};
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, sizeof(xlrec));
XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_RELATION_KEY);
}
static InternalKey *
tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator)
{
@ -80,23 +100,14 @@ tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator)
if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
tde_smgr_save_temp_key(&smgr_rlocator->locator, key);
else
{
pg_tde_save_smgr_key(smgr_rlocator->locator, key);
tde_smgr_log_create_key(&smgr_rlocator->locator);
}
return key;
}
static void
tde_smgr_log_create_key(const RelFileLocatorBackend *smgr_rlocator)
{
XLogRelKey xlrec = {
.rlocator = smgr_rlocator->locator,
};
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, sizeof(xlrec));
XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_RELATION_KEY);
}
void
tde_smgr_create_key_redo(const RelFileLocator *rlocator)
{
@ -111,17 +122,22 @@ tde_smgr_create_key_redo(const RelFileLocator *rlocator)
}
static void
tde_smgr_delete_key(const RelFileLocatorBackend *smgr_rlocator)
tde_smgr_remove_key(const RelFileLocatorBackend *smgr_rlocator)
{
XLogRelKey xlrec = {
.rlocator = smgr_rlocator->locator,
};
pg_tde_free_key_map_entry(smgr_rlocator->locator);
if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
tde_smgr_remove_temp_key(&smgr_rlocator->locator);
else
pg_tde_free_key_map_entry(smgr_rlocator->locator);
}
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, sizeof(xlrec));
XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_RELATION_KEY);
static void
tde_smgr_delete_key(const RelFileLocatorBackend *smgr_rlocator)
{
if (!RelFileLocatorBackendIsTemp(*smgr_rlocator))
{
pg_tde_free_key_map_entry(smgr_rlocator->locator);
tde_smgr_log_delete_key(&smgr_rlocator->locator);
}
}
void
@ -148,15 +164,6 @@ tde_smgr_get_key(const RelFileLocatorBackend *smgr_rlocator)
return pg_tde_get_smgr_key(smgr_rlocator->locator);
}
static void
tde_smgr_remove_key(const RelFileLocatorBackend *smgr_rlocator)
{
if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
tde_smgr_remove_temp_key(&smgr_rlocator->locator);
else
pg_tde_free_key_map_entry(smgr_rlocator->locator);
}
static bool
tde_smgr_should_encrypt(const RelFileLocatorBackend *smgr_rlocator, RelFileLocator *old_locator)
{
@ -393,7 +400,6 @@ tde_mdcreate(RelFileLocator relold, SMgrRelation reln, ForkNumber forknum, bool
}
key = tde_smgr_create_key(&reln->smgr_rlocator);
tde_smgr_log_create_key(&reln->smgr_rlocator);
tdereln->encryption_status = RELATION_KEY_AVAILABLE;
tdereln->relKey = *key;

Loading…
Cancel
Save