}
/*------ DEBUG LOG END ------*/
conn->sorry_conn_flag = 0;
- conn->old_dest = NULL;
l7vs_iomux_add(conn->ciom, iom_read);
// connect real server immediately if all lsock services are fast schedule.
}
/*------ DEBUG LOG END ------*/
- //is real server connected?
if (-1 != conn->riom->fd) {
- // check sorry status of service
- // argment 0 means no connection count check
+ // Connection to real/sorry server is already ESTABLISHED
+
+ // Check force-sorry-flag and existance of real servers
sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
if (sorry_state) {
- // check connect to sorry-server now
+ // force-sorry-flag is ON or no real servers
+
if (!conn->sorry_conn_flag) {
- // get sorry-server destination (argment 0)
- d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
+ // Current connection is to real server,
+ // so close the connection.
/*-------- DEBUG LOG --------*/
if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- char sorry_dest_str1[DEBUG_STR_LEN] = {0};
- l7vs_dest_c_str(sorry_dest_str1, d);
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
- "pointer_assign: d=%s",
- sorry_dest_str1);
+ LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
+ "iom->status change: %d->%d",
+ iom->status, iomux_conn_disconnected);
}
/*------ DEBUG LOG END ------*/
- if (!d) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
- "iom->status change: %d->%d",
- iom->status, iomux_conn_rs_connect_error);
- }
- /*------ DEBUG LOG END ------*/
- iom->status = iomux_conn_rs_connect_error;
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
- "out_function: static int l7vs_conn_is_rs_connected("
- "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
- "return_value: 0");
- }
- /*------ DEBUG LOG END ------*/
- return 0;
- }
- conn->old_dest = conn->dest;
+ iom->status = iomux_conn_disconnected;
/*-------- DEBUG LOG --------*/
if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- char old_dest_str[DEBUG_STR_LEN] = {0};
- l7vs_dest_c_str(old_dest_str, conn->old_dest);
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
- "pointer_assign: conn->old_dest=%s",
- old_dest_str);
+ LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
+ "out_function: static int l7vs_conn_is_rs_connected("
+ "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+ "return_value: 0");
}
/*------ DEBUG LOG END ------*/
- // change connection to sorry-server
- if (!l7vs_conn_change_connect_rs(conn, d)) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
- "iom->status change: %d->%d",
- iom->status, iomux_conn_rs_connect_error);
- }
- /*------ DEBUG LOG END ------*/
- iom->status = iomux_conn_rs_connect_error;
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
- "out_function: static int l7vs_conn_is_rs_connected("
- "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
- "return_value: 0");
- }
- /*------ DEBUG LOG END ------*/
- return 0;
- }
- conn->sorry_conn_flag = 1;
+ return 0;
}
- } else {
- // check connect to sorry-server now
- if (conn->sorry_conn_flag) {
- // get old real-server destination (argment 1)
- d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- char sorry_dest_str2[DEBUG_STR_LEN] = {0};
- l7vs_dest_c_str(sorry_dest_str2, d);
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
- "pointer_assign: d=%s",
- sorry_dest_str2);
- }
- /*------ DEBUG LOG END ------*/
- if (!d) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
- "iom->status change: %d->%d",
- iom->status, iomux_conn_rs_connect_error);
- }
- /*------ DEBUG LOG END ------*/
- iom->status = iomux_conn_rs_connect_error;
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
- "out_function: static int l7vs_conn_is_rs_connected("
- "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
- "return_value: 0");
- }
- /*------ DEBUG LOG END ------*/
- return 0;
- }
- // change connection to real-server
- if (!l7vs_conn_change_connect_rs(conn, d)) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
- "iom->status change: %d->%d",
- iom->status, iomux_conn_rs_connect_error);
- }
- /*------ DEBUG LOG END ------*/
- iom->status = iomux_conn_rs_connect_error;
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
- "out_function: static int l7vs_conn_is_rs_connected("
- "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
- "return_value: 0");
- }
- /*------ DEBUG LOG END ------*/
- return 0;
- }
- conn->sorry_conn_flag = 0;
+ else {
+ // Current connection is already changed to sorry server,
+ // so do nothing.
}
+ } else {
+ // force-sorry-flag is OFF and real servers exist,
+ // then keep the connection to real/sorry server.
}
/*-------- DEBUG LOG --------*/
if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
/*------ DEBUG LOG END ------*/
return 0;
}
- // save old destination
- conn->old_dest = conn->dest;
- /*-------- DEBUG LOG --------*/
- if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
- char old_dest_str[DEBUG_STR_LEN] = {0};
- l7vs_dest_c_str(old_dest_str, conn->old_dest);
- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
- "pointer_assign: conn->old_dest=%s",
- old_dest_str);
- }
- /*------ DEBUG LOG END ------*/
// close real-server connection
l7vs_conn_close_rsock(conn);
// connect to new destination
struct l7vs_dest *dest;
int ret, val;
struct l7vs_service *srv_tmp = NULL; //! temporary for srv
- struct l7vs_dest *dest_tmp = NULL; //! temporary for dest
size_t len_tmp = 0; //! temporary for len
int sorry_save = 0; //! sorry dest save flag
struct l7vs_service *srv_tmp2 = NULL; //! temporary for srv when select_dest NG
- struct l7vs_dest *dest_tmp2 = NULL; //! temporary for dest when select_dest NG
size_t len_tmp2 = 0; //! temporary for len when select_dest NG
int sorry_save2 = 0; //! sorry dest save flag when select_dest NG
if (ret == 0) {
// check sorry status if ret == 0
// sorry_check argument 1 means check connection count
+ // Check the connection count(--upper, maxconn)
if (l7vs_sched_sorry_check(srv, 1)) {
if (!sorry_save) {
// save sorry dest to xxx_tmp only first time
srv_tmp = srv;
- dest_tmp = dest;
len_tmp = len;
sorry_save = 1;
}
}
}
// when select_dest NG
+ // No suitable realservers exist
if (!sorry_save2) {
// save sorry dest to xxx_tmp2 only first time
srv_tmp2 = srv;
- dest_tmp2 = dest;
len_tmp2 = len;
sorry_save2 = 1;
}
l = g_list_next(l);
}
+ // Over maximum connections
if (sorry_save) {
// saved sorry dest is exist
// set sorry-server destination
- //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 1);
- *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 0);
+ *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL);
if (!*dest_ret) {
LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,2, "sorry-server dest is NULL");
if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
conn->cldata_len = len_tmp;
conn->sorry_conn_flag = 1;
val = 1;
+
+ // No suitable realservers exist
} else if (sorry_save2) {
// saved sorry dest2 is exist
// set sorry-server destination
- //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 1);
- *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 0);
+ *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL);
if (!*dest_ret) {
LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,3, "sorry-server dest is NULL");
if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
}
/*!
- * Get sorry-server destination or old real-server destination.
+ * Get sorry-server destination
* @param[in] *srv service pointer
* @param[in] *conn connection pointer
- * @param[in] reverse specification which get sorry-server or old real-server
* @return l7vs_dest* sorry-server or old real-server destination
*/
struct l7vs_dest *
-l7vs_sched_sorry_dest(struct l7vs_service *srv, struct l7vs_conn *conn, int reverse)
+l7vs_sched_sorry_dest(struct l7vs_service *srv, struct l7vs_conn *conn)
{
struct l7vs_dest* dest = NULL;
l7vs_conn_c_str(conn_str, conn);
LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SCHEDULE,21,
"in_function: struct l7vs_dest* l7vs_sched_sorry_dest(struct l7vs_service* srv, "
- "struct l7vs_conn* conn, int reverse): srv=&(%s), conn=&(%s), reverse=%d",
- srv_str, conn_str, reverse);
+ "struct l7vs_conn* conn, int reverse): srv=&(%s), conn=&(%s)",
+ srv_str, conn_str);
}
/*------ DEBUG LOG END ------*/
// argument check
- if (reverse != 0 && reverse != 1) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,13,"Invalid reverse value");
+ if (!srv) {
+ LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,14,"Argument srv is NULL pointer");
goto sorry_dest_out;
}
- if (!reverse) {
- // argument check
- if (!srv) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,14,"Argument srv is NULL pointer");
- goto sorry_dest_out;
- }
- // return sorry-server destination
- dest = srv->sorry_dest;
- } else {
- // argument check
- if (!conn) {
- LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,15,"Argument srv is NULL pointer");
- goto sorry_dest_out;
- }
- // return old real-server destination
- dest = conn->old_dest;
- }
+ // return sorry-server destination
+ dest = srv->sorry_dest;
sorry_dest_out:
l7vs_dest_c_str(dest_str, dest);
LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SCHEDULE,22,
"out_function: struct l7vs_dest* l7vs_sched_sorry_dest(struct l7vs_service* srv, "
- "struct l7vs_conn* conn, int reverse): return_value=&(%s)", dest_str);
+ "struct l7vs_conn* conn): return_value=&(%s)", dest_str);
}
/*------ DEBUG LOG END ------*/