@@ -322,6 +322,7 @@ static void
322
322
tde_mdcreate (RelFileLocator relold , SMgrRelation reln , ForkNumber forknum , bool isRedo )
323
323
{
324
324
TDESMgrRelation * tdereln = (TDESMgrRelation * ) reln ;
325
+ InternalKey * key ;
325
326
326
327
/* Copied from mdcreate() in md.c */
327
328
if (isRedo && tdereln -> md_num_open_segs [forknum ] > 0 )
@@ -334,36 +335,46 @@ tde_mdcreate(RelFileLocator relold, SMgrRelation reln, ForkNumber forknum, bool
334
335
335
336
mdcreate (relold , reln , forknum , isRedo );
336
337
337
- if (forknum == MAIN_FORKNUM || forknum == INIT_FORKNUM )
338
+ if (forknum != MAIN_FORKNUM )
338
339
{
339
340
/*
340
- * Only create keys when creating the main/init fork. Other forks can
341
- * be created later, even during tde creation events. We definitely do
341
+ * Only create keys when creating the main fork. Other forks can be
342
+ * created later, even during tde creation events. We definitely do
342
343
* not want to create keys then, even later, when we encrypt all
343
344
* forks!
344
345
*
345
346
* Later calls then decide to encrypt or not based on the existence of
346
347
* the key.
347
- *
348
- * Since event triggers do not fire on the standby or in recovery we
349
- * do not try to generate any new keys and instead trust the xlog.
350
348
*/
351
- InternalKey * key = tde_smgr_get_key (& reln -> smgr_rlocator );
349
+ return ;
350
+ }
352
351
353
- if (!isRedo && !key && tde_smgr_should_encrypt (& reln -> smgr_rlocator , & relold ))
354
- key = tde_smgr_create_key (& reln -> smgr_rlocator );
352
+ if (!tde_smgr_should_encrypt (& reln -> smgr_rlocator , & relold ))
353
+ {
354
+ tdereln -> encryption_status = RELATION_NOT_ENCRYPTED ;
355
+ return ;
356
+ }
355
357
356
- if (key )
357
- {
358
- tdereln -> encryption_status = RELATION_KEY_AVAILABLE ;
359
- tdereln -> relKey = * key ;
360
- pfree (key );
361
- }
362
- else
363
- {
364
- tdereln -> encryption_status = RELATION_NOT_ENCRYPTED ;
365
- }
358
+ if (isRedo )
359
+ {
360
+ /*
361
+ * If we're in redo, the WAL record for creating the key has already
362
+ * happened and we can just fetch it.
363
+ */
364
+ key = tde_smgr_get_key (& reln -> smgr_rlocator );
365
+
366
+ Assert (key );
367
+ if (!key )
368
+ elog (ERROR , "could not get key when creating encrypted relation" );
366
369
}
370
+ else
371
+ {
372
+ key = tde_smgr_create_key (& reln -> smgr_rlocator );
373
+ }
374
+
375
+ tdereln -> encryption_status = RELATION_KEY_AVAILABLE ;
376
+ tdereln -> relKey = * key ;
377
+ pfree (key );
367
378
}
368
379
369
380
/*
0 commit comments