@@ -26,34 +26,35 @@ static void bg_worker_main(Datum main_arg);
26
26
27
27
typedef struct PartitionArgs
28
28
{
29
- Oid dbid ;
30
- Oid relid ;
29
+ Oid dbid ;
30
+ Oid relid ;
31
31
#ifdef HAVE_INT64_TIMESTAMP
32
32
int64 value ;
33
33
#else
34
34
double value ;
35
35
#endif
36
- Oid value_type ;
36
+ Oid value_type ;
37
37
bool by_val ;
38
- Oid result ;
38
+ Oid result ;
39
+ bool crashed ;
39
40
} PartitionArgs ;
40
41
41
42
/*
42
43
* Starts background worker that will create new partitions,
43
44
* waits till it finishes the job and returns the result (new partition oid)
44
45
*/
45
46
Oid
46
- create_partitions_bg_worker (Oid relid , Datum value , Oid value_type )
47
+ create_partitions_bg_worker (Oid relid , Datum value , Oid value_type , bool * crashed )
47
48
{
48
49
BackgroundWorker worker ;
49
50
BackgroundWorkerHandle * worker_handle ;
50
51
BgwHandleStatus status ;
51
52
dsm_segment * segment ;
52
53
dsm_handle segment_handle ;
53
54
pid_t pid ;
54
- PartitionArgs * args ;
55
+ PartitionArgs * args ;
55
56
Oid child_oid ;
56
- TypeCacheEntry * tce ;
57
+ TypeCacheEntry * tce ;
57
58
58
59
/* Create a dsm segment for the worker to pass arguments */
59
60
segment = dsm_create (sizeof (PartitionArgs ), 0 );
@@ -98,6 +99,7 @@ create_partitions_bg_worker(Oid relid, Datum value, Oid value_type)
98
99
99
100
/* Wait till the worker finishes its job */
100
101
status = WaitForBackgroundWorkerShutdown (worker_handle );
102
+ * crashed = args -> crashed ;
101
103
child_oid = args -> result ;
102
104
103
105
/* Free dsm segment */
@@ -112,7 +114,7 @@ create_partitions_bg_worker(Oid relid, Datum value, Oid value_type)
112
114
static void
113
115
bg_worker_main (Datum main_arg )
114
116
{
115
- PartitionArgs * args ;
117
+ PartitionArgs * args ;
116
118
dsm_handle handle = DatumGetInt32 (main_arg );
117
119
118
120
/* Create resource owner */
@@ -134,7 +136,7 @@ bg_worker_main(Datum main_arg)
134
136
PushActiveSnapshot (GetTransactionSnapshot ());
135
137
136
138
/* Create partitions */
137
- args -> result = create_partitions (args -> relid , PATHMAN_GET_DATUM (args -> value , args -> by_val ), args -> value_type );
139
+ args -> result = create_partitions (args -> relid , PATHMAN_GET_DATUM (args -> value , args -> by_val ), args -> value_type , & args -> crashed );
138
140
139
141
/* Cleanup */
140
142
SPI_finish ();
@@ -148,7 +150,7 @@ bg_worker_main(Datum main_arg)
148
150
* Create partitions and return an OID of the partition that contain value
149
151
*/
150
152
Oid
151
- create_partitions (Oid relid , Datum value , Oid value_type )
153
+ create_partitions (Oid relid , Datum value , Oid value_type , bool * crashed )
152
154
{
153
155
int ret ;
154
156
RangeEntry * ranges ;
@@ -163,6 +165,7 @@ create_partitions(Oid relid, Datum value, Oid value_type)
163
165
FmgrInfo cmp_func ;
164
166
char * schema ;
165
167
168
+ * crashed = false;
166
169
schema = get_extension_schema ();
167
170
168
171
prel = get_pathman_relation_info (relid , NULL );
@@ -178,16 +181,25 @@ create_partitions(Oid relid, Datum value, Oid value_type)
178
181
/* Perform PL procedure */
179
182
sql = psprintf ("SELECT %s.append_partitions_on_demand_internal($1, $2)" ,
180
183
schema );
181
- ret = SPI_execute_with_args (sql , 2 , oids , vals , nulls , false, 0 );
182
- if (ret > 0 )
184
+ PG_TRY ();
183
185
{
184
- /* Update relation info */
185
- free_dsm_array (& rangerel -> ranges );
186
- free_dsm_array (& prel -> children );
187
- load_check_constraints (relid , GetCatalogSnapshot (relid ));
186
+ ret = SPI_execute_with_args (sql , 2 , oids , vals , nulls , false, 0 );
187
+ if (ret > 0 )
188
+ {
189
+ /* Update relation info */
190
+ free_dsm_array (& rangerel -> ranges );
191
+ free_dsm_array (& prel -> children );
192
+ load_check_constraints (relid , GetCatalogSnapshot (relid ));
193
+ }
188
194
}
189
- else
195
+ PG_CATCH ();
196
+ {
190
197
elog (WARNING , "Attempt to create new partitions failed" );
198
+ if (crashed != NULL )
199
+ * crashed = true;
200
+ return 0 ;
201
+ }
202
+ PG_END_TRY ();
191
203
192
204
/* Repeat binary search */
193
205
ranges = dsm_array_get_pointer (& rangerel -> ranges );
0 commit comments