Month: 五月 2015

hanldersocket 167错误的原因

用HandlerSocket大量并发插入数据到多个InnoDB的表(都使用自增id)的时候就会大量出现167的错误,从而TPS下降极为厉害.

让我们来分析这个bug是怎么产生的.

 

我们先来重现这个bug:

先建两个表:

 

然后用HandlerSocket大并发的执行类似这样SQL的命令:

 

那么很快就会出现167的错误

那我们来看看167是什么意思, 167是

 

返回的错误码,即

 

表示已经越界了

查看可能返回HA_ERR_AUTOINC_ERANGE的地方,就在int handler::update_auto_increment()这个方法里,当

 

时,会有问题

而什么时候nr会等于ULONGLONG_MAX呢,看上面的代码

 

在nr= compute_next_insert_id(nr-1, variables); 这一步会导致nr等于ULONGLONG_MAX

那么在get_auto_increment()这步的时候nr返回就必须是0,而nr传进去的时候就是0

那么就是get_auto_increment()没有起效果

我们再看InnoDB的get_auto_increment()实现