arkdb/inception

ddl时调用osc异常:Execute: Got an error reading communication packets.

pandakll opened this issue · 3 comments

Hi,
各位有遇到么,有什么解决办法么!
直接脚本执行,例子很简单,报错如下:
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | 2 | EXECUTED | 2 | Execute failed | Execute: Got an error reading communication packets. |

比较小的表执行成功,不过看到osc进程变成了僵尸进程
image

这个问题已解决:仔细分析是由于inception会有一个连接直接去数据库查询,没有释放连接,导致触发到wait_timeout时间设置;
具体解决办法:将sql目录下的sql_parse.cc文件下的mysql_get_remote_variables函数修改为如下:
int mysql_get_remote_variables(THD* thd)
{
char set_format[1024];
MYSQL_RES * source_res;
MYSQL_ROW source_row;
MYSQL* mysql;

DBUG_ENTER("mysql_get_remote_variables");

mysql= thd->get_audit_connection();
if (mysql == NULL)
DBUG_RETURN(ER_NO);

sprintf(set_format, "show variables where
Variable_name in ('explicit_defaults_for_timestamp', 'sql_mode');");
if (mysql_real_query(mysql, set_format, strlen(set_format)))
{
my_message(mysql_errno(mysql), mysql_error(mysql), MYF(0));
DBUG_RETURN(ER_NO);
}

if ((source_res = mysql_store_result(mysql)) == NULL)
{
my_message(mysql_errno(mysql), mysql_error(mysql), MYF(0));
DBUG_RETURN(ER_NO);
}

source_row = mysql_fetch_row(source_res);
while(source_row)
{
if (strcasecmp(source_row[0], "explicit_defaults_for_timestamp") == 0)
thd->variables.explicit_defaults_for_timestamp=strcmp("OFF", source_row[1]) ? 1 : 0;
else if (strcasecmp(source_row[0], "sql_mode") == 0)
get_sql_mode(thd, source_row[1]);

source_row = mysql_fetch_row(source_res);

}

mysql_free_result(source_res);
sprintf(set_format,"set session wait_timeout=3600;");
if (mysql_real_query(mysql, set_format, strlen(set_format)))
{
my_message(mysql_errno(mysql), mysql_error(mysql), MYF(0));
DBUG_RETURN(ER_NO);
}

DBUG_RETURN(false);
}

你好,这种解决办法,表面上解决了,但是僵尸进程仍然在递增,请问有没有靠谱的解决办法,谢谢。