这一段有点停滞,想从读写锁或者mini transaction入手,但是调用的地方太多了。虽然尝试导入数据库,过滤出既有加锁也有解锁的那些锁,还是不够直观。还得再试试。
老不出成果也不是个事。转向我之前看过的和page访问相关的代码。把gdb跟踪用的python代码以及jupytor notebook里跑的python改来改去。貌似有一点曙光了。先上图。
这两个函数是在page树以及page中查找符合条件的记录位置。
block=是函数的第一个参数
index是第二个参数,我在pyhton里把这个参数的两个属性给拼在一起了。其中mysql/columns是表名,table_id是索引名。即这个索引是mysql database中的columns表上的table_id索引。
上面这图,最下面应该是用来存统计数据的表的主键。右侧是一个和slot相关的函数,slot是page中用来保存记录的位置的一种结构。可以看到这个函数被调用了多次,是要得到不同page的slot。回头可以考虑把page id存下来,替代那个指针的值,更直观一些。
这5个block应该都属于同一个索引。
虽然还不够理想,但是感觉出现了索引名和表名之后,已经能够提供更多的直观信息了。
gdb python扩展代码中最主要的修改是:
#如果有需要查看的参数值,参数名和值单独成一个节点
#如果有多个参数,要把这些节点顺序连接起来
args = getFunctionArgs(name)
for i in range(len(args)):
argname = args[i]
#argvalue = frm.read_var( argname )
if( argname == "index" ):
argvalue = gdb.parse_and_eval("index->table_name").string() + " " + gdb.parse_and_eval("index->name->m_name").string()
vnodename = argname + "=" + argvalue
else:
argvalue = gdb.parse_and_eval( argname )
vnodename = argname + "=" + hex(long(argvalue))
nodes.append({"starttime":starttime,"stopid":MySQL_last_log.stopid,"name":vnodename})
if(i>0):
#如果有多个参数,要把这些节点顺序连接起来
links.append({"starttime":starttime,"stopid":MySQL_last_log.stopid,"linkorder":linkorder,"source":last_vnodename, "target":vnodename})
else:
links.append({"starttime":starttime,"stopid":MySQL_last_log.stopid,"linkorder":linkorder,"source":short_name, "target":vnodename})
linkorder += 1
last_vnodename = vnodename
当然,更重要的是,ACMUG成都活动马上开始了。咱们8月10日成都见吧。报名报名。
【成都】安可数据库论坛暨「ACMUG」技术沙龙www.huodongxing.com