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 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 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 * static InternalKey *
tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator) tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator)
{ {
@ -80,23 +100,14 @@ tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator)
if (RelFileLocatorBackendIsTemp(*smgr_rlocator)) if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
tde_smgr_save_temp_key(&smgr_rlocator->locator, key); tde_smgr_save_temp_key(&smgr_rlocator->locator, key);
else else
{
pg_tde_save_smgr_key(smgr_rlocator->locator, key); pg_tde_save_smgr_key(smgr_rlocator->locator, key);
tde_smgr_log_create_key(&smgr_rlocator->locator);
}
return key; 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 void
tde_smgr_create_key_redo(const RelFileLocator *rlocator) tde_smgr_create_key_redo(const RelFileLocator *rlocator)
{ {
@ -111,17 +122,22 @@ tde_smgr_create_key_redo(const RelFileLocator *rlocator)
} }
static void static void
tde_smgr_delete_key(const RelFileLocatorBackend *smgr_rlocator) tde_smgr_remove_key(const RelFileLocatorBackend *smgr_rlocator)
{ {
XLogRelKey xlrec = { if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
.rlocator = smgr_rlocator->locator, tde_smgr_remove_temp_key(&smgr_rlocator->locator);
}; else
pg_tde_free_key_map_entry(smgr_rlocator->locator);
pg_tde_free_key_map_entry(smgr_rlocator->locator); }
XLogBeginInsert(); static void
XLogRegisterData((char *) &xlrec, sizeof(xlrec)); tde_smgr_delete_key(const RelFileLocatorBackend *smgr_rlocator)
XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_RELATION_KEY); {
if (!RelFileLocatorBackendIsTemp(*smgr_rlocator))
{
pg_tde_free_key_map_entry(smgr_rlocator->locator);
tde_smgr_log_delete_key(&smgr_rlocator->locator);
}
} }
void void
@ -148,15 +164,6 @@ tde_smgr_get_key(const RelFileLocatorBackend *smgr_rlocator)
return pg_tde_get_smgr_key(smgr_rlocator->locator); 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 static bool
tde_smgr_should_encrypt(const RelFileLocatorBackend *smgr_rlocator, RelFileLocator *old_locator) 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); key = tde_smgr_create_key(&reln->smgr_rlocator);
tde_smgr_log_create_key(&reln->smgr_rlocator);
tdereln->encryption_status = RELATION_KEY_AVAILABLE; tdereln->encryption_status = RELATION_KEY_AVAILABLE;
tdereln->relKey = *key; tdereln->relKey = *key;

Loading…
Cancel
Save