wildfirechat / im-server

即时通讯(IM)系统
http://docs.wildfirechat.cn
Other
7.84k stars 1.78k forks source link

未读数角标不同步问题 #603

Closed yoffey closed 1 year ago

yoffey commented 1 year ago

操作说明

app端进入会话,清除了会话的未读数之后,pc端再登录

表现现象

pc端同一个会话还是会显示未读数

预期结果

pc端同一个会话不应该显示未读数,要同步清除

补充条件

偶现,安卓端和ios端也有出现未读数不同的问题,用的是2022-11月份的sdk

排查信息

查看xlog后,发现ug成功callback后, image 有报sqlite的报错,报错信息如下: [E][2023-04-03 +8.0 09:39:18.369][18396, 636][mars::proto][DB2.cc, mars::stn::RecyclableStatement::executeInsert, 126][sql insert error:19, errorInfo:UNIQUE constraint failed: t_conversation._conv_type, t_conversation._conv_line, t_conversation._conv_target, sql:insert into t_conversation(_conv_type,_conv_target,_conv_line,_timestamp,_issilent,_istop) values(?,?,?,?,?,?) [E][2023-04-03 +8.0 09:39:18.369][18396, 636][mars::proto][DB2.cc, mars::stn::RecyclableStatement::~RecyclableStatement, 314][finalize_db err:UNIQUE constraint failed: t_conversation._conv_type, t_conversation._conv_line, t_conversation._conv_target, code:19 [E][2023-04-03 +8.0 09:39:18.370][18396, 636][mars::proto][DB2.cc, mars::stn::RecyclableStatement::executeInsert, 126][sql insert error:19, errorInfo:UNIQUE constraint failed: t_conversation._conv_type, t_conversation._conv_line, t_conversation._conv_target, sql:insert into t_conversation(_conv_type,_conv_target,_conv_line,_timestamp,_issilent,_istop) values(?,?,?,?,?,?) [E][2023-04-03 +8.0 09:39:18.370][18396, 636][mars::proto][DB2.cc, mars::stn::RecyclableStatement::~RecyclableStatement, 314][finalize_db err:UNIQUE constraint failed: t_conversation._conv_type, t_conversation._conv_line, t_conversation._conv_target, code:19

yoffey commented 1 year ago

后面看了下本地的sqlite数据库,存在问题的会话,t_user_setting表scope=7的记录是更新成功的,t_conversation表的_timestamp和_last_message_id的值也是对的,但是_unread_count和_unread_mention_all这两个记录未读数的字段没有清零。 怀疑是不是t_user_setting表同时存在scope为1和7的记录时,并发生成t_conversation表导致的?

heavyrain2012 commented 1 year ago

同步到最新版本应该就好了,请同步到最新版本

yoffey commented 1 year ago

@heavyrain2012 最新版本是针对这块有做什么修复吗?因为我们的sdk升级服务已经过期了,要升级的话还要走公司的预算申请,所以需要知道新版本做了什么修改,是否能解决我们碰到的问题。

heavyrain2012 commented 1 year ago

最新版本没有这个问题了,不太确定是什么时候修复的。你可以更新我们最新代码编译demo测试看看。也可以购买升级服务后如果有问题可以要求我们解决

yoffey commented 1 year ago

好,那我这边先试下

yoffey commented 1 year ago

@heavyrain2012 安卓端升级最新sdk后,确实没有这个sql的报错了,但是会话的未读数还是会不同步。 看数据,在pc端清除会话的未读数后,安卓端的t_user_setting表已经把value更新成该会话最新一条消息的时间戳 image image 然后t_conversation表的_timestamp和_last_message_id都是更新对的,但是_unread_count的值没有更新成0 image 麻烦帮忙看下,什么场景下t_conversation表会更新_timestamp和_last_message_id,但是不会更新_unread_count?

heavyrain2012 commented 1 year ago

代码里,更新7的设置时会更新未读数的

heavyrain2012 commented 1 year ago

看图上消息的状态还是5,奇怪为什么没有清掉。用我们demo客户端测试过吗,demo上有这个问题不?

yoffey commented 1 year ago

@heavyrain2012 发现问题出在哪了,并且用官方demo可以复现。 ====问题原因==== 当出现未读数角标问题时,都有一个同样的过程。 先mp拉取到n条消息,然后发起ug正常响应,然后短时间内再次mp,并且这次mp的request.getId()和上次一样,返回了n条一样的消息。如果这n条消息里面,有被刚刚的ug清除过未读数的话,就会被还原成之前的未读数。 我这边疑惑的点有三个: 1、什么情况下会在一次mp成功后,很快再次发起一次mp,并且request.getId()和第一次mp一样。(这个是偶发的,我没找打必现步骤) 2、第二次mp的时候,request.getId()不应该跟上次一样,应该是上次返回的消息里面最新的id。并且有看到第一次mp的时候,xlog有打印更新timeline的日志。(难道是更新timline失败了,触发了第二次的mp?但是xlog看不到对应的报错) 3、第二次mp就算拉取到同样的n条消息,但是usersettting里面scope=7的数据是最新的,通过这个来算未读数的话,也不应该被还原成之前的未读数。

====复现步骤===== 1、pc端登录,查看本地sqlite中t_timeline表head字段的值,并记录下来,假设值是x 2、pc端不要点击任何会话,用其他账号给pc端发消息,pc端确认会话的未读数,假设未读数是n,然后用同一个账号的app端进入会话清除未读数 image

3、查看pc端的t_usersetting表和t_conversation表,确认数据更新正常 4、pc端退出登录,修改本地sqlite中t_timeline表head字段的值,重新改为x,并保存(模拟第二次mp时request.getId()和第一次mp时一样) 5、pc端登录,触发一次mp,看到步骤2对应会话已清除的未读数n又重新出现了 image

heavyrain2012 commented 1 year ago

====问题原因==== 当出现未读数角标问题时,都有一个同样的过程。 先mp拉取到n条消息,然后发起ug正常响应,然后短时间内再次mp,并且这次mp的request.getId()和上次一样,返回了n条一样的消息。如果这n条消息里面,有被刚刚的ug清除过未读数的话,就会被还原成之前的未读数。 我这边疑惑的点有三个: 1、什么情况下会在一次mp成功后,很快再次发起一次mp,并且request.getId()和第一次mp一样。(这个是偶发的,我没找打必现步骤) 2、第二次mp的时候,request.getId()不应该跟上次一样,应该是上次返回的消息里面最新的id。并且有看到第一次mp的时候,xlog有打印更新timeline的日志。(难道是更新timline失败了,触发了第二次的mp?但是xlog看不到对应的报错) 3、第二次mp就算拉取到同样的n条消息,但是usersettting里面scope=7的数据是最新的,通过这个来算未读数的话,也不应该被还原成之前的未读数。

你把协议栈日志发给我们看看,我们分析一下为什么第一次MP没有结束又发起了第二次MP?发到邮箱sales@wildfirechat.cn

yoffey commented 1 year ago

好的,已发送