前言
skynet_fly_demo 项目被开着5千机器人跑了一晚上之后,我第二天查下一下有没有啥异常日志,结果发现有一个机器人邮件插入失败,是因为主键冲突,插入的邮件是全服邮件,因为使用的批量插入并没有触发断言,并不能第一时间发现调用来源。只有错误日志。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| [:0000001a][20250123 05:30:33 84][error][orm_table_m][...fly/lualib/skynet-fly/db/ormadapter/ormadapter_mysql.lua:591]"_insert err " "email" { ["errno"] = 1062, ["sqlstate"] = "23000", ["badresult"] = true, ["err"] = "Duplicate entry '1999900010000001-1581044515209216' for key 'email.PRIMARY'", } { [1] = { ["from_id"] = 0, ["del_flag"] = 0, ["content"] = "欢迎来到中国象棋!!!!!!!!!!!!!!", ["create_time"] = 1737581433, ["guid"] = 1581044515209216, ["item_flag"] = 0, ["item_list"] = { [1] = { ["id"] = 10000002, ["count"] = 100, } } ["read_flag"] = 0, ["title"] = "欢迎来到中国象棋", ["email_type"] = 1, ["player_id"] = 1999900010000001, ["vaild_time"] = 0, } } [:0000003a][20250123 05:30:33 84][error][room_game_hall_m][./hall/email/email_logic.lua:122]change_global_email add email err guid[1581044515209216]
|
因为插入全服邮件的触发点有两个地方,一个是用户登录时候的检查,一个是全服邮件同步时的差异处理。有2个位置,这时候并不能立马想到是哪里出的问题,不过通过观察时间,5.30正是room_hall_room触发自动热更滚服的时候,我猜想大概率是全服邮件同步的逻辑导致的,因为同步后会对比之前的邮件,因为是刚刚启动服务,之前的全服邮件列表是空的,这时候认定同步过来的全服邮件全部是新的,就给在线的玩家全部添加了一遍,可能刚好这个机器人的号已经从旧服切换过来了,就只给它调用了插入。虽然发现了问题,但是我还是想用一下录像。我在触发全服邮件同步的逻辑中加上了日志之后启动录像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| run hallserver load_mods_1.lua 0 ../../records/hallserver_1/room_game_hall_m-2-4-20250123-053030.record make ./make/hallserver_config.lua read strseed -1464976427 from recordfile ../../records/hallserver_1/room_game_hall_m-2-4-20250123-053030.record [:00000000][20250123 05:30:32 33]Version:1.2.0 [:00000000][20250123 05:30:32 33]start play record >>> ../../records/hallserver_1/room_game_hall_m-2-4-20250123-053030.record [:00000000][20250123 05:30:32 33]skynet_record_parse_open starttime[1737542297] currenttime[3913511] strseed[-1464976427]
[:0000003a][20250123 05:30:32 33]LAUNCH snlua hot_container room_game_hall_m 4 2025-01-23[05:30:30] 1737581430 2 1 [:0000003a][20250123 05:30:33 84][info][room_game_hall_m][./hall/email/email_logic.lua:114]"on_recv_global_emails >>>" { [1] = 1999900010000001, } { [1] = { ["title"] = "欢迎来到中国象棋", ["item_list"] = { [1] = { ["id"] = 10000002, ["count"] = 100, } } ["content"] = "欢迎来到中国象棋!!!!!!!!!!!!!!", ["guid"] = 1581044515209216, ["vaild_time"] = 0, } }
[:0000003a][20250123 05:30:33 84][error][room_game_hall_m][./hall/email/email_logic.lua:127]change_global_email add email err guid[1581044515209216] [:00000000][20250123 05:33:20 78]record speed of progress[1%] curindex[634915] total_len[63490533] [:00000000][20250123 05:35:47 59]record speed of progress[2%] curindex[1269858] total_len[63490533]
|
果然和我的判断一致。不过使用过程中发现了一个不够便利的地方,我无法快速定位到我需要播放哪一个录像。
总共有2天的录像:
1 2 3 4 5 6 7 8 9 10 11 12
| room_game_hall_m-1-1-20250122-183822.record room_game_hall_m-1-2-20250122-183822.record room_game_hall_m-1-3-20250122-183822.record room_game_hall_m-1-4-20250122-183822.record room_game_hall_m-1-5-20250122-183822.record room_game_hall_m-1-6-20250122-183822.record room_game_hall_m-2-1-20250123-053030.record room_game_hall_m-2-2-20250123-053030.record room_game_hall_m-2-3-20250123-053030.record room_game_hall_m-2-4-20250123-053030.record room_game_hall_m-2-5-20250123-053030.record room_game_hall_m-2-6-20250123-053030.record
|
能快速确定的是日期20250123
,至于1-6启动索引是哪个,没法快速确定,还需要借助服务地址0000003a
来确定,因为文件名并没有写服务地址,我是逐个打开录像文件查看写在头部位置的服务地址来确定的0000003a
。后续需要把服务地址也写到录像文件名中。