The blr_master_close() is now called in the main worker thread.
The blr_master_close() is now called in the main worker thread by: blr_stop_slave() and blr_stop_start_master()
This commit is contained in:
@ -332,7 +332,7 @@ static void blr_start_master(void* data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback function to be called in the context of the main worker.
|
* Callback start function to be called in the context of the main worker.
|
||||||
*
|
*
|
||||||
* @param worker_id The id of the worker in whose context the function is called.
|
* @param worker_id The id of the worker in whose context the function is called.
|
||||||
* @param data The data to be passed to `blr_start_master`
|
* @param data The data to be passed to `blr_start_master`
|
||||||
@ -363,7 +363,43 @@ void blr_start_master_in_main(void* data)
|
|||||||
|
|
||||||
if (!mxs_worker_post_message(worker, MXS_WORKER_MSG_CALL, arg1, arg2))
|
if (!mxs_worker_post_message(worker, MXS_WORKER_MSG_CALL, arg1, arg2))
|
||||||
{
|
{
|
||||||
MXS_ERROR("Could not post message to main worker.");
|
MXS_ERROR("Could not post 'blr_start_master' message to main worker.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback close function to be called in the context of the main worker.
|
||||||
|
*
|
||||||
|
* @param worker_id The id of the worker in whose context the function is called.
|
||||||
|
* @param data The data to be passed to `blr_start_master`
|
||||||
|
*/
|
||||||
|
static void worker_cb_close_master(int worker_id, void* data)
|
||||||
|
{
|
||||||
|
// This is itended to be called only in the main worker.
|
||||||
|
ss_dassert(worker_id == 0);
|
||||||
|
|
||||||
|
blr_master_close(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close master connection in the main Worker.
|
||||||
|
*
|
||||||
|
* @param data Data intended for `blr_master_close`.
|
||||||
|
*/
|
||||||
|
void blr_close_master_in_main(void* data)
|
||||||
|
{
|
||||||
|
// The master should be connected to in the main worker, so we post it a
|
||||||
|
// message and call `blr_master_close` there.
|
||||||
|
|
||||||
|
MXS_WORKER* worker = mxs_worker_get(0); // The worker running in the main thread.
|
||||||
|
ss_dassert(worker);
|
||||||
|
|
||||||
|
intptr_t arg1 = (intptr_t)worker_cb_close_master;
|
||||||
|
intptr_t arg2 = (intptr_t)data;
|
||||||
|
|
||||||
|
if (!mxs_worker_post_message(worker, MXS_WORKER_MSG_CALL, arg1, arg2))
|
||||||
|
{
|
||||||
|
MXS_ERROR("Could not post 'blr_master_close' message to main worker.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,8 +526,15 @@ blr_master_close(ROUTER_INSTANCE *router)
|
|||||||
{
|
{
|
||||||
dcb_close(router->master);
|
dcb_close(router->master);
|
||||||
router->master = NULL;
|
router->master = NULL;
|
||||||
router->master_state = BLRM_UNCONNECTED;
|
|
||||||
|
spinlock_acquire(&router->lock);
|
||||||
|
if (router->master_state != BLRM_SLAVE_STOPPED)
|
||||||
|
{
|
||||||
|
router->master_state = BLRM_UNCONNECTED;
|
||||||
|
}
|
||||||
router->master_event_state = BLR_EVENT_DONE;
|
router->master_event_state = BLR_EVENT_DONE;
|
||||||
|
spinlock_release(&router->lock);
|
||||||
|
|
||||||
gwbuf_free(router->stored_event);
|
gwbuf_free(router->stored_event);
|
||||||
router->stored_event = NULL;
|
router->stored_event = NULL;
|
||||||
}
|
}
|
||||||
@ -1817,7 +1860,7 @@ blr_stop_start_master(ROUTER_INSTANCE *router)
|
|||||||
if (router->master->fd != -1 &&
|
if (router->master->fd != -1 &&
|
||||||
router->master->state == DCB_STATE_POLLING)
|
router->master->state == DCB_STATE_POLLING)
|
||||||
{
|
{
|
||||||
blr_master_close(router);
|
blr_close_master_in_main(router);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,6 +355,8 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
|
|||||||
MASTER_SERVER_CFG *current_master,
|
MASTER_SERVER_CFG *current_master,
|
||||||
CHANGE_MASTER_OPTIONS *change_master);
|
CHANGE_MASTER_OPTIONS *change_master);
|
||||||
extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
|
extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
|
||||||
|
extern void blr_close_master_in_main(void* data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process a request packet from the slave server.
|
* Process a request packet from the slave server.
|
||||||
*
|
*
|
||||||
@ -3525,7 +3527,7 @@ blr_stop_slave(ROUTER_INSTANCE* router, ROUTER_SLAVE* slave)
|
|||||||
if (router->master->fd != -1 &&
|
if (router->master->fd != -1 &&
|
||||||
router->master->state == DCB_STATE_POLLING)
|
router->master->state == DCB_STATE_POLLING)
|
||||||
{
|
{
|
||||||
blr_master_close(router);
|
blr_close_master_in_main(router);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user