Skip to content

Commit 756b7f3

Browse files
committed
abort running concurrent partitioning task if table is not partitioned anymore
1 parent 9555f74 commit 756b7f3

File tree

1 file changed

+33
-20
lines changed

1 file changed

+33
-20
lines changed

src/pathman_workers.c

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "utils/datum.h"
3737
#include "utils/memutils.h"
3838
#include "utils/lsyscache.h"
39+
#include "utils/syscache.h"
3940
#include "utils/typcache.h"
4041
#include "utils/resowner.h"
4142
#include "utils/snapmgr.h"
@@ -488,6 +489,17 @@ bgw_main_concurrent_part(Datum main_arg)
488489
int ret;
489490
bool isnull;
490491

492+
/* Make sure that relation exists and has partitions */
493+
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(part_slot->relid)) ||
494+
get_pathman_relation_info(part_slot->relid) == NULL)
495+
{
496+
/* Fail fast */
497+
failures_count = PART_WORKER_MAX_ATTEMPTS;
498+
499+
elog(ERROR, "relation %u is not partitioned (or does not exist)",
500+
part_slot->relid);
501+
}
502+
491503
ret = SPI_execute_with_args(sql, 2, types, vals, nulls, false, 0);
492504
if (ret == SPI_OK_SELECT)
493505
{
@@ -525,25 +537,6 @@ bgw_main_concurrent_part(Datum main_arg)
525537

526538
FreeErrorData(error);
527539

528-
/*
529-
* The most common exception we can catch here is a deadlock with
530-
* concurrent user queries. Check that attempts count doesn't exceed
531-
* some reasonable value
532-
*/
533-
if (failures_count >= PART_WORKER_MAX_ATTEMPTS)
534-
{
535-
/* Mark slot as FREE */
536-
cps_set_status(part_slot, CPS_FREE);
537-
538-
elog(LOG,
539-
"concurrent partitioning worker has canceled the task because "
540-
"maximum amount of attempts (%d) had been exceeded, "
541-
"see the error message below",
542-
PART_WORKER_MAX_ATTEMPTS);
543-
544-
return; /* exit quickly */
545-
}
546-
547540
/* Set 'failed' flag */
548541
failed = true;
549542
}
@@ -552,7 +545,27 @@ bgw_main_concurrent_part(Datum main_arg)
552545
SPI_finish();
553546
PopActiveSnapshot();
554547

555-
if (failed)
548+
/*
549+
* The most common exception we can catch here is a deadlock with
550+
* concurrent user queries. Check that attempts count doesn't exceed
551+
* some reasonable value
552+
*/
553+
if (failures_count >= PART_WORKER_MAX_ATTEMPTS)
554+
{
555+
AbortCurrentTransaction();
556+
557+
/* Mark slot as FREE */
558+
cps_set_status(part_slot, CPS_FREE);
559+
560+
elog(LOG,
561+
"concurrent partitioning worker has canceled the task because "
562+
"maximum amount of attempts (%d) had been exceeded, "
563+
"see the error message below",
564+
PART_WORKER_MAX_ATTEMPTS);
565+
566+
return;
567+
}
568+
else if (failed)
556569
{
557570
/* Abort transaction and sleep for a second */
558571
AbortCurrentTransaction();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy