Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 48a3853

Browse files
committed
Fixed segfault -- we tried to close pq connection of failed tasks.
Task type was zerod, which means 'MOVE_PRIMARY', and we tried to cast it to MovePartState and close its prev_conn, that is, close piece of invalid memory.
1 parent fb13d4b commit 48a3853

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

src/copypart.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -381,18 +381,22 @@ init_cp_state(CopyPartState *cps)
381381
*/
382382
static void finalize_cp_state(CopyPartState *cps)
383383
{
384-
if (cps->src_conn != NULL)
385-
reset_pqconn(&cps->src_conn);
386-
if (cps->dst_conn != NULL)
387-
reset_pqconn(&cps->dst_conn);
388-
if (cps->type == COPYPARTTASK_MOVE_PRIMARY ||
389-
cps->type == COPYPARTTASK_MOVE_REPLICA)
384+
/* Failed tasks never open pq connections */
385+
if (cps->res != TASK_FAILED)
390386
{
391-
MovePartState *mps = (MovePartState *) cps;
392-
if (mps->prev_conn != NULL)
393-
reset_pqconn(&mps->prev_conn);
394-
if (mps->next_conn != NULL)
395-
reset_pqconn(&mps->next_conn);
387+
if (cps->src_conn != NULL)
388+
reset_pqconn(&cps->src_conn);
389+
if (cps->dst_conn != NULL)
390+
reset_pqconn(&cps->dst_conn);
391+
if (cps->type == COPYPARTTASK_MOVE_PRIMARY ||
392+
cps->type == COPYPARTTASK_MOVE_REPLICA)
393+
{
394+
MovePartState *mps = (MovePartState *) cps;
395+
if (mps->prev_conn != NULL)
396+
reset_pqconn(&mps->prev_conn);
397+
if (mps->next_conn != NULL)
398+
reset_pqconn(&mps->next_conn);
399+
}
396400
}
397401
}
398402

src/shard.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,12 @@ set_replevel(Cmd *cmd)
287287
if (rc.count < replevel)
288288
{
289289
CreateReplicaState *crs = palloc0(sizeof(CreateReplicaState));
290-
init_cr_state(crs, rc.part_name, workers[rand() % num_workers]);
290+
int32 dst_node = workers[rand() % num_workers];
291+
init_cr_state(crs, rc.part_name, dst_node);
291292
tasks[ntasks] = (CopyPartState *) crs;
292293
ntasks++;
294+
shmn_elog(DEBUG1, "Adding replica for shard %s on node %d",
295+
rc.part_name, dst_node);
293296
}
294297
}
295298

0 commit comments

Comments
 (0)