@@ -329,7 +329,64 @@ smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
329
329
}
330
330
331
331
/*
332
- *smgrdounlink() -- Immediately unlink a relation.
332
+ *smgrdounlink() -- Immediately unlink all forks of a relation.
333
+ *
334
+ *All forks of the relation are removed from the store. This should
335
+ *not be used during transactional operations, since it can't be undone.
336
+ *
337
+ *If isRedo is true, it is okay for the underlying file(s) to be gone
338
+ *already.
339
+ *
340
+ *This is equivalent to calling smgrdounlinkfork for each fork, but
341
+ *it's significantly quicker so should be preferred when possible.
342
+ */
343
+ void
344
+ smgrdounlink (SMgrRelation reln ,bool isRedo )
345
+ {
346
+ RelFileNodeBackend rnode = reln -> smgr_rnode ;
347
+ int which = reln -> smgr_which ;
348
+ ForkNumber forknum ;
349
+
350
+ /* Close the forks at smgr level */
351
+ for (forknum = 0 ;forknum <=MAX_FORKNUM ;forknum ++ )
352
+ (* (smgrsw [which ].smgr_close )) (reln ,forknum );
353
+
354
+ /*
355
+ * Get rid of any remaining buffers for the relation. bufmgr will just
356
+ * drop them without bothering to write the contents.
357
+ */
358
+ DropRelFileNodeAllBuffers (rnode );
359
+
360
+ /*
361
+ * It'd be nice to tell the stats collector to forget it immediately, too.
362
+ * But we can't because we don't know the OID (and in cases involving
363
+ * relfilenode swaps, it's not always clear which table OID to forget,
364
+ * anyway).
365
+ */
366
+
367
+ /*
368
+ * Send a shared-inval message to force other backends to close any
369
+ * dangling smgr references they may have for this rel. We should do this
370
+ * before starting the actual unlinking, in case we fail partway through
371
+ * that step. Note that the sinval message will eventually come back to
372
+ * this backend, too, and thereby provide a backstop that we closed our
373
+ * own smgr rel.
374
+ */
375
+ CacheInvalidateSmgr (rnode );
376
+
377
+ /*
378
+ * Delete the physical file(s).
379
+ *
380
+ * Note: smgr_unlink must treat deletion failure as a WARNING, not an
381
+ * ERROR, because we've already decided to commit or abort the current
382
+ * xact.
383
+ */
384
+ for (forknum = 0 ;forknum <=MAX_FORKNUM ;forknum ++ )
385
+ (* (smgrsw [which ].smgr_unlink )) (rnode ,forknum ,isRedo );
386
+ }
387
+
388
+ /*
389
+ *smgrdounlinkfork() -- Immediately unlink one fork of a relation.
333
390
*
334
391
*The specified fork of the relation is removed from the store. This
335
392
*should not be used during transactional operations, since it can't be
@@ -339,16 +396,16 @@ smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
339
396
*already.
340
397
*/
341
398
void
342
- smgrdounlink (SMgrRelation reln ,ForkNumber forknum ,bool isRedo )
399
+ smgrdounlinkfork (SMgrRelation reln ,ForkNumber forknum ,bool isRedo )
343
400
{
344
401
RelFileNodeBackend rnode = reln -> smgr_rnode ;
345
402
int which = reln -> smgr_which ;
346
403
347
- /* Close the fork */
404
+ /* Close the forkat smgr level */
348
405
(* (smgrsw [which ].smgr_close )) (reln ,forknum );
349
406
350
407
/*
351
- * Get rid of any remaining buffers for therelation . bufmgr will just
408
+ * Get rid of any remaining buffers for thefork . bufmgr will just
352
409
* drop them without bothering to write the contents.
353
410
*/
354
411
DropRelFileNodeBuffers (rnode ,forknum ,0 );