Etherpad-lite: 未捕获的错误:失败的断言:无效的变更集(checkRep失败)

创建于 2014-03-14  ·  94评论  ·  资料来源: ether/etherpad-lite

大家好。 我们正在使用稳定的软件,但有一个问题是某些键盘会随机停止工作,并在控制台中引发未捕获的错误。

Uncaught Error: Failed assertion: Invalid changeset (checkRep failed) 

例:

https://etherpad.tugraz.at/p/l3tsbet

发生这种情况时,“加载”叠加层会阻止任何操作。 这不太可能是复制粘贴问题,因为有时它完全是手写的。

有趣的是,timeslider(通过将/ timeslider附加到url中打开)始终可以正常工作。

https://etherpad.tugraz.at/p/l3tsbet/timeslider

现在,我们正在通过HTML导入/导出(丢失所有变更集)来手动修复这些打击垫。 知道怎么了吗?

Serious Bug Waiting on Testing

最有用的评论

杜德,错误出现在您的日志中!

[2020-05-05 00:04:12.541] [ERROR] console - table is not configured with charset utf8 -- This may lead to crashes when certain characters are pasted in pads
[2020-05-05 00:04:12.543] [INFO] console - RowDataPacket { character_set_name: 'utf8mb4' } utf8

参见: https :

所有94条评论

试试最新的Develop分支,让我们知道它是否仍然存在

这并非微不足道,因为它偶然在具有许多用户的产品服务器上发生,并且我无法复制它。
我只能测试破碎的垫子是否在​​显影时仍然断裂,如果有帮助的话。

是的,请

我将在下周将数据库复制到dev。 将尽快报告。 感谢您的快速回复。

不幸的是,发展起来并没有修复损坏的护垫。 有趣的是,移动服务器(简单的sql导出/导入)已经“修复”了其中的一个。 它可以在新服务器上运行(即使在1.3.0上也可以),但其他损坏垫则不行。 还是一样的错误。

这是一个非常奇怪的错误,即使在PROD上,填充垫有时也似乎只是“自我修复”,而我们却没有任何改变。

从理论上讲,这个问题根本不会发生,因为坏数据现在永远都不会找到它的方式。

我可以保持打开状态,如果它出现在新数据上,我们可以尝试解决它。

您对“新数据”是什么意思? 我是否需要将PROD投入开发并尝试获得新的破损垫?

嗯,那可能会很痛苦。也许要等待1.4,这应该会在几周后消失。

我们可以这样做。 非常感谢。

我也有同样奇怪的随机性的问题。 我更新到etherpad-lite 1.4,并且仍然存在。 其中一个垫的网址http://etherpad.usabilidoido.com.br:8080 / p / 07318a9b2b5666637d870fc50656323620af4df4

我现在正在升级到1.4,并希望可以使用新版本,因此在运行新版本后,我可以检查是否有新的缺陷出现在新版中。

@usabilidoido,您可以告诉用户导出-导入该http ://etherpad.usabilidoido.com.br:8080 / p / 07318a9b2b5666637d870fc50656323620af4df4 / timeslider

导出为html,然后导入新的键盘。

我在1.4中遇到此问题。 在破碎的键盘上,当浏览器显示Failed assertion错误时,命令行显示[WARN] client - Uncaught TypeError: Cannot read property 'length' of undefined

/ timeslider解决方法的提示给@ Ra1d3n 。 很高兴看到此处仍然可以访问便笺内容。

这只是预感,但如果您愿意,请尝试使用我刚刚创建的实验性try/client-init-remove-checkRep分支。 (这样做通常很危险,但是我认为值得尝试。)

我已将所有内容升级到1.4。 昨天我们的脚垫又破了。 可能仍然是在更新之前就坏掉的,但是我不确定。 我会继续寻找。

@marcelklehr不幸的是,我无法将生产服务器移到_dangerous_版本。 而且我无法将请求镜像到辅助服务器,因为我没有资源。 :-/

抱歉,我不清楚:不要在生产环境中运行try/client-init-remove-checkRep ,而是尝试使用在该分支上运行的etherpad来访问损坏的焊盘。

我在该分支中删除了checkRep ,因为我怀疑规范化在某些情况下可能无法正常工作。 因此,当折断的焊盘在该分支上正常工作而没有任何问题时,我们必须重新考虑此方法。

@marcelklehr我刚刚做过,不幸的是它没有帮助。

处理:

git fetch
git checkout try/client-init-remove-checkRep
git status
On branch try/client-init-remove-checkRep
Your branch is up-to-date with 'origin/try/client-init-remove-checkRep'.

我确认更改实际上是在文件系统中。 (这里有注释和换行符)错误仍然相同。

asd

我确实收到了@ericpedia提到的错误,除了损坏的键盘以外,其他键盘上都没有发生。

服务器上的控制台:

[2014-05-09 16:55:39.152] [WARN] client - Uncaught TypeError: Cannot read property 'length' of undefined -- { errorId: 'dTtndCRA5gonLZyvMlqw',
  msg: 'Uncaught TypeError: Cannot read property \'length\' of undefined',
  url: 'http://localhost:9001/p/OkTJWMYVNs',
  linenumber: 15,
  userAgent: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36' }

当我杀死服务器时,该消息也会显示在客户端中:

asd

我也许可以通过SQL导入损坏的护垫,但是您需要告诉我首先需要从数据库中提取什么。 :-)

实际的填充内容将非常有帮助,因此可以作为db键pad:<PADID> (http://etherpad.org/doc/v1.4.0/#index_pad_padid)以及最近的一些修订。

我想我越来越近了:

checkPad说:

$ bin/checkPad <padID>
[WARN] console - DirtyDB is used. This is fine for testing but not recommended for production.
[ERROR] console - Bad changeset at revision 4901 - Failed assertion: mismatched apply: 11636 / 11635
[ERROR] console - Bad changeset at revision 11401 - Failed assertion: mismatched apply: 42094 / 42093
[ERROR] console - Bad changeset at revision 12301 - Failed assertion: mismatched apply: 48875 / 48874
[ERROR] console - Bad changeset at revision 13601 - Failed assertion: mismatched apply: 60227 / 60226
[INFO] console - finished

在所有情况下都存在不匹配的情况,这意味着所讨论的变更集期望的字符数少于实际出现的字符数(因此,一个意外字符)。 在检查了db dump之后,我发现所有这些变更集都遵循带有附加文本的修订版本(并非所有修订版本都包含完整的pad内容,而是仅包含delta,但是,出于性能原因,每隔一段时间它就会包含完整的内容附上)。

大概是,在存储修订或为新的pad客户端创建当前文本时,此meta属性出现了问题。

我只是改写了checkPad以使用计算的文本,而不是缓存的文本和pad pass。 甚至缓存的文本都是正确的! 这使我认为某些算法中存在一个错误,该错误会为client_vars计算全文本!

到目前为止,Marcel做得很好。 听起来您即将解决此问题。

啊,这不是client_vars生成器。 负责创建缓存的文本的算法已损坏。

@ Ra1d3n作为一个revNo % 100 == 0 )中的atext meta属性来恢复损坏的键盘。 很久以前,据报道,“重新插入”所有与破碎垫有关的记录是对类似问题的解决方法-现在我们知道它为什么起作用:)

@marcelklehr会使EP在负载下从修订版0重建填充板吗? 我猜我不应该四处删除所有修订版中的所有atext属性... :-)是否希望使用正确的算法重建关键修订版的“重新生成Pad”脚本?

我对checkPad脚本进行了一些更改。 看到这里:#1653
但是,这更是一个肮脏的hack。 如果我的脚本可以解决此问题,我将编写一个脚本来修复护垫

太酷了,我很期待。 现在,我们每周只能得到一个破损的护垫,所以我倾向于等待适当的修复。 :-) 谢谢。

是的,我在想一个剧本。

因此,计算出的文本与缓存的文本之间的差异表明:“концертов”以某种方式变成了“ко цертов”。 在另一个版本中,“з”也被转换为“ ”。

我不确定这是怎么回事。 这些字符位于Unicode BMP中,即afaik,所以我不知道它们发生了什么。

@ Ra1d3n的pad中的突变发生在此脚本进行分析)

字符似乎很随意。 真的没有什么突出的。 我没有看到图案。

我怀疑在数据库中存储AttributedText时出了点问题。 由于有时键盘在损坏的键修订版本之间恢复,因此我猜测存储在内存中的文本是好的。 有时,当它存储在数据库中时,它会以某种方式损坏。 如果作者继续编辑该文档,直到创建下一个关键修订,并且该修订最终不会遭到破坏,那么没人会注意到任何事情。
但是,如果服务器关闭_before_以成功地将保存在内存中的有效AText保存到数据库中,则在下次服务器启动时将破坏该填充。

@marcelklehr我们遇到了etherpad崩溃并由于插件编码错误而恢复了几次,这可能是原因吗? 奇怪的是,每次都只有一个字母被损坏。

我创建了一个脚本来重新插入pad的所有数据库值。 在我破烂的垫子上,脚本无法正常工作。
@ Ra1d3n您可以在此处下载脚本: https :
执行此脚本时,请确保您的etherpad实例未运行。

@Gared您可以从脚本的哪里获取? 我建议关闭我的checkPad分支,对其进行调整以将重新计算的AttributedText值插入数据库。

我会说, @ Ra1d3n Etherpad崩溃不太可能导致数据损坏。

@marcelklehr这可能只是使问题更加明显,因为在这种情况下,我们失去了正确的内存值。

@marcelklehr该脚本是extractPadData脚本的分支。 值和键已加载到上面的函数中。 这些都是键盘的按键。

@Gared的repairPad.js脚本正在修复损坏的护垫。 此修复程序是否有可能纳入下一个etherpad-lite版本中?

当然可以发送拉请求或@Gared

已打开拉取请求#2210

我的etherpad在1.4.1上运行,并且遇到了上述相同问题的3倍:该垫无法加载,但/ timeslider可以正常工作。
他们中的两个现在不做任何事情就在重新运行。
在第三个键盘上,我尝试了repairPad.js失败。 它的网址是:+1: http ://portail.univ-lille1.fr/etherpad/link.jsp?groupID=g.jfobkKVrkydeTwLY&padID=SES_Grp8_Macroeconomie(您必须点击“ utilisez le pad avec l'invitexy”以访问自己。

也许有一个具有非正常值的变更集,repairPad并未考虑该变更集,或者我在git上没有看到过reparPad.js的任何新版本吗?

我们认为我们现在已解决此问题。 请进行开发和测试:)谢谢!

您好,我们刚刚发生过这种情况。 我们运行1.5.7,即最新发布的版本。 后端是一个MySQL数据库。 对于可能导致此问题的用户操作,我没有任何迹象。

有问题的垫板: https :

通过timeslider技巧获取pad数据可以正常工作。 但是,垫永远不会加载。

如果有帮助,可以将数据库中的所有内容转储并提供给调试。

嗨,我早上有这个讨论。
08:47 <webzwo0i>突变体:我调试了键盘。 您通常不应该这样做,但是如果您有数据库备份(并且在进行export / etherpad备份后
便笺本),您可以更改三个数据库条目,便笺本应该可以再次正常工作。 三个mysql命令是

mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning";
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7200";
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7300";

08:49 <webzwo0i>您可以检查数据库是否正在运行utf8mb4字符集或utf8吗?
08:51 <webzwo0i> oha ups,请不要应用mysql命令。 也许我有点快:-)需要先检查一下
09:08 <webzwo0i> mh nope应该没问题,请进行测试...很高兴知道您是否运行了最新版本或其他版本以及启用了哪些插件
09:47 <webzwo0i>我不知道您是否在wikimedia上互相了解,但是如果您可以找到谁是“ Brian”用户,您可以问他使用的是哪种浏览器? 的
原因是我可以看到错误是什么,但是我无法在浏览器中触发它(只能手动操作,但由于您对ppl不怀有敌意,因此可能不在
目的)
09:49 <webzwo0i>(所以我们可能有两个错误,一个是服务器端,一个是客户端)

我需要的信息是您的数据库是utf8还是utf8mb4
我已经提取了令人讨厌的变更集,如果您不同时申请,timeslider也将无法解决这些修订

mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7105";

加上上面的更新,这将使您的护垫再次可重复使用

@ webzwo0i

是的,我注意到突变体与您交谈。 我刚刚决定也跟进github问题。 我将追踪谁是“ Brian”,以及它们为您使用的浏览器。

因此,存储表在相当长一段时间内都是utf8mb4。 它是utf8,但由于6月的一系列不同问题,我们将其转换为utf8mb4。特别是2015年6月23日

https://github.com/ether/etherpad-lite/issues/2522#issuecomment-114441189 ;-)

无需找出用户/浏览器,我现在可以重现该错误。 谢谢!

因为您使用的是最新版本,所以需要在dbSettings内部的settings.json中插入“ charset”:“ utf8mb4”。 现在位于settings.json.template中。 您可以通过以下方法检查是否有必要

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

客户端(可能还有连接?)应该指示utf8mb4,如果不是,则数据库表本身可以存储4字节的utf8,但是服务器不希望4字节的utf8是客户端连接。
这不会修复您的旧护垫。 但是,您可以遍历所有垫板,并使用bin / checkPad.js来了解有多少垫板以及哪些垫板可能存在类似问题。 视情况而定,像上述情况一样,很容易修复(尽管某些字符会损坏)。 如果有很多破损的垫子,则可以自动执行此操作。

人们实际写作时看不到这些问题的原因是,大多数站点都使用ueberDB的内部缓存来提高性能。 这种纯JavaScript缓存完全了解Unicode。 一旦刷新缓存或重新启动etherpad,就需要从数据库中获取条目。

我已经按照您的指示修理了护垫。 有趣的是连续发现4个问号会损坏PAD。 而且与焊盘的尖端相比,损坏的变更集将是如此古老。 但是,您的解释是有道理的,谢谢。

我已经用“ charset”:“ utf8mb4”更新了配置。

我正在wikimedia上使用制粒机票,但那里没有帐户,所以我将其张贴在这里。

您的第二个破损垫也可以使用以下方法修复:

update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1120";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1254";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1216";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1108";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1106";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1200";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1300";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1400";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1500";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1600";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1700";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1800";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1900";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2000";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2100";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2200";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2300";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2400";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives";

症状是4个问号,因为iirc,四字节UTF8中的单个字节不是有效的UTF8。 (在UTF8中,仅前127个字符表示为单字节,多字节UTF8可能使用0x7f以上的字节)。 因此,实际上有4个问号代表一个4字节编码的UTF8字符串,它表示基本多语言平面(最可能是表情符号:-D)之外的代码点。 在Javascript中,这些代码点将使用UTF16的代理对(它们是2个16位值)进行编码。

checkRep问题是,在变更集中我们不仅存储字符,而且还存储变更的长度。 但是,Javascript的length()函数将代理对计算为2,因此,例如,表情符号的长度为2。当mysql将变更集的字符串解码为问号时,我们对变更集的表示不再有效。

用两个问号代替它不是一个真正的解决方案,因为我们不知道用户首先输入了哪个代码点(但是只要该值在ueberDB的缓存中,我们就可以从那里得到它)。

如果有人实际使用四个问号(我们的长度值将指示4,如果将其替换为2个问号,我们将得到一个checkRep错误),它将产生错误的结果,因此,如果我们要使修复脚本自动化,则需要检查如果应用更改后的字符串长度符合更改集的“添加了多少个字符”值。

如果有人实际使用了四个问号和诸如emoji表情之类的代码点,则可以解决该问题,我们还需要跟踪文档中替换问号的位置。

还请注意,并非每个checkRep-error都是由编码中断引起的

当然,上面的工作。 真棒! 我不知道该怎么感谢你才足够。 我希望通过适当的配置修复,这种情况不会再次发生。

我想知道您正在进行的调试是否是手动进行。 手动或如果您有一些更自动化的方式来获取和比较变更集及其长度。 我想无论如何我都可以创建自己的一个

<3 @ webzwo0i谢谢你,你很棒

@ webzwo0i最近我一直在做大量工作,从一个元素的X

通过使用单个表情符号(例如🐼)创建一个新键盘并重新启动etherpad,可以很容易地重现该错误,另请参阅#3340。

更新:截至2019年4月,即使重新启动后,此表情符号本身也不会破坏键盘。

我想检查所有垫子,所以我添加了checkAllPads工具(请参阅PR#3342)。

通过使用单个表情符号(例如panda_face)创建一个新键盘并重新启动etherpad,可以很容易地重现该错误,另请参阅#3340。

我不能完全按照上面的描述来重现此内容。 有关示例,请参见https://etherpad.wikimedia.org/p/ohmy (是的,我已经多次重启了etherpad)

我们也因这个错误而暂停了。 奇怪的是, checkPad,js没有发现任何问题,而repairPad.js可以运行而无需修复。 有什么方法可以确定哪个版本有问题吗?

编辑:啊,我发现https://gist.github.com/marcelklehr/a78d293571e7f06e3cf9为我指出了正确的方法。 这有可能包含在etherpad本身中吗? 现在已经非常有用,非常感谢! (但是,我不得不将console.log替换console.error才能看到任何修订号。我没有任何nodeJS经验,但是我想不出另一种方法来实际查看所有日志记录。 )

确实,执行“用???? ??代替???? ?? ”在这里也有帮助。 :)好像最后一个变更集是某人插入了表情符号(以$????结尾)。

但是,我不明白为什么将其归类为“小错误”。 此错误导致垫子完全丢失(直到有人注意到/timeslider的情况,在我们的案例中这花费了一周的时间,甚至历史也丢失了)。

我自己未分配,因为我不太可能解决此问题。 FWIW,此错误似乎是由于easysync库的限制,我推测该库不支持所有utf-8。 (UTF-8可能将一个字符编码为多个字节,即使只是一个字符,每个字节也会增加javascript中字符串的长度。)

-没关系-:D

FWIW,此错误似乎是由于easysync库的限制,我推测该库不支持所有utf-8。 (UTF-8可能将一个字符编码为多个字节,即使只是一个字符,每个字节也会增加javascript中字符串的长度。)

实际上,我们的填充区中一直都有变音符(äöü),在UTF-8中也为多字节。 根据以上所述,我认为问题实际上与UTF-16有关-最初设计时,其目的是每个字符正好有2个字节(实际上是代码点),但是现在我们有2个以上的字节。 16个代码点有一些需要4个字节,例如表情符号。 现在length()不再匹配代码点的数量,一切都变得混乱。

因此,也许更好的解决方法是完全拒绝任何代理对(4字节代码点)? 这样就不可能将etherpad与补充平面中的字符一起使用,但是无论如何看起来还是有可能被破坏了吗? 并且它应该保护数据库。 似乎有方法可以测试JS中的代理对(但是我对现代JavaScript的经验为零)。

为什么关闭了? 据我所知,Etherpad仍然会阻塞BMP之外的字符。 最近,我再次不得不手动维修这种损坏的垫子。

我关闭了它是因为我打开了2014年版,对此不再感兴趣。

好吧,对于其他人来说,这仍然是一个开放的问题,因此,如果您可以重新打开,不胜感激。

谢谢! :)

有人能可靠地破坏键盘的字符(序列)的例子吗? 我猜这将有助于调试。

Easysync库使用“字符”来描述文本(及其内容),但这是10年前的最低可行产品。 如今,我们应该考虑采用NFC标准化的UTF-8代码点。

只是想知道,我们是否能够通过将ueberdb值存储为二进制斑点而不是存储在整理的文本列中来解决问题?

当前,如果我们尝试将无效的utf8mb4字节序列(认为:包含多字节字符的一部分的变更集)放入utf8mb4列中,则只有两种可能的结果:数据库拒绝输入,或客户端(或服务器)需要删除(认为:用“?”替换)之前的无效“字符”或字节。

通过使用二进制blob列,数据库将不再关心字节序列是否为utf8mb4无效,因此我们可以避免字符替换。 如果easysync是我所知的编码不可知论者,那么它就可以工作(只要两个用户不要在同一位置同时插入多字节字符AB和CD,并且这些最终以单个变更集A,C,B,D结尾- order-,使合并结果无效utf8mb4)。

PS:我刚刚测试过插入一个4字节的UTF8字符(例如🍰)本身不是问题(尽管:我还没有重启,这可能是解释),所以我认为该bug要么需要并发(导致该字符分成两个或多个本身无效的变更集),或者它要求客户端发出一个删除该字符部分的变更集。

嗨,我们也在很多垫子上遇到了这个问题。

我正在尝试所有操作,但无法用replace替换,我尝试重新启动,使用不同的数据库后端(已正确配置)。

谁能提供复制我们更现代的代码库的步骤?

在🍰上按退格键确实将其替换为``,这显然很烂。

对我来说,到目前为止, replace(,'????','??')一直有效。 几个月没有发生。

我提供了一个有效的Check Pad Deltas更新版本,如果人们可以尝试一下一下,看看它是否对遇到此问题有所帮助,我将不胜感激。

我仍然认为基本问题是Etherpad数据模型是根据“字符”而不是规范化的UTF-8代码点来考虑的。

除非我们重新设计核心库,否则这将永远无法真正解决。 显然,任何缓解措施都是有用的。 只是说,我认为没有任何简单的解决方案可以保证100%正确。

令人惊讶的是,有多少编辑者(以及在开发人员中很受欢迎的编辑者)具有与Etherpad tho类似的经验。 今天玩,我有一些疯狂的经历。

我提供了一个有效的Check Pad Deltas更新版本,如果人们可以尝试一下一下,看看它是否对遇到此问题有所帮助,我将不胜感激。

通过#3717(14ae2ee95094)进入主分支。

嗨,我们的一个Pads遇到了类似的问题。
不幸的是,@ JohnMcLear的最新版本的checkPadDeltas没有帮助:/

@gnd您有公共实例吗?

您可以点击padId / export / etherpad网址并获取.etherpad文件吗?

您是否正在运行最新开发?

您的数据库后端是什么?

问题太多,请提供尽可能详细的信息

@JohnMcLear
是的,它是一个公共实例: https :
不幸的是,我在尝试获取.etherpad文件时收到502 Bad Gateway错误。
我们正在nodejs 12.16.3-1nodesource1上运行最新开发(git pull origin),数据库后端为10.3.22-MariaDB-0 + deb10u1。

我今天可以使用它来帮助您进行各种调试。 我已经尝试过checkPadDeltas的最新版本,但是它在启动后仅挂了几个小时。 这是它给出的唯一输出:

所有相对路径将相对于已识别的Etherpad基本目录进行解释:/ opt / etherpad
[2020-05-05 00:04:12.330] [DEBUG] AbsolutePaths-相对路径“ settings.json”可以重写为“ /opt/etherpad/settings.json”
[2020-05-05 00:04:12.346] [DEBUG] AbsolutePaths-相对路径“ credentials.json”可以重写为“ /opt/etherpad/credentials.json”
设置从以下位置加载:/opt/etherpad/settings.json
在/opt/etherpad/credentials.json中找不到凭证文件。 无视。
[2020-05-05 00:04:12.369] [INFO]控制台-在目录中使用皮肤“ no-skin”:/ opt / etherpad / src / static / skins / no-skin
[2020-05-05 00:04:12.371] [INFO]控制台-会话密钥从以下位置加载:/opt/etherpad/SESSIONKEY.txt
[2020-05-05 00:04:12.541] [错误]控制台-表未使用字符集utf8配置-将某些字符粘贴到打击垫中时,这可能导致崩溃
[2020-05-05 00:04:12.543] [INFO]控制台-RowDataPacket {character_set_name:'utf8mb4'} utf8

杜德,错误出现在您的日志中!

[2020-05-05 00:04:12.541] [ERROR] console - table is not configured with charset utf8 -- This may lead to crashes when certain characters are pasted in pads
[2020-05-05 00:04:12.543] [INFO] console - RowDataPacket { character_set_name: 'utf8mb4' } utf8

参见: https :

@JohnMcLear
我们的数据库有

+ ---------------------------- + -------------------- ---- +
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+ ---------------------------- + -------------------- ---- +
| utf8 | utf8_general_ci |
+ ---------------------------- + -------------------- ---- +

虽然商店桌子有

+ -------------------- +
| character_set_name |
+ -------------------- +
| utf8mb4 |
+ -------------------- +

所以我应该使用转换
ALTER DATABASE etherpad_lite_db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

@JohnMcLear

错误配置是双重的,数据库使用的是utf8和utf8_general_ci,而且在settings.json中,数据库的字符集设置为“ utf8”。 将所有问题都修复为utf8mb4仍然没有帮助,有问题的垫子无法加载,并且checkPadDeltas仍然挂起:

所有相对路径将相对于已识别的Etherpad基本目录进行解释:/ opt / etherpad
[2020-05-05 13:17:43.443] [DEBUG] AbsolutePaths-相对路径“ settings.json”可以重写为“ /opt/etherpad/settings.json”
[2020-05-05 13:17:43.444] [DEBUG] AbsolutePaths-相对路径“ credentials.json”可以重写为“ /opt/etherpad/credentials.json”
设置从以下位置加载:/opt/etherpad/settings.json
在/opt/etherpad/credentials.json中找不到凭证文件。 无视。
[2020-05-05 13:17:43.463] [INFO]控制台-在目录中使用皮肤“ no-skin”:/ opt / etherpad / src / static / skins / no-skin
[2020-05-05 13:17:43.464] [INFO]控制台-会话密钥从以下位置加载:/opt/etherpad/SESSIONKEY.txt

@gnd这是一个GiGo问题。 一旦有垃圾进入,就无法更改。 现在您所知道的是该问题将来不会出现!

@gnd这是一个GiGo问题。 一旦有垃圾进入,就无法更改。 现在您所知道的是该问题将来不会出现!

repairPad.js能够修复这些破损的护垫吗?

哦, @ caugner ,您好-抱歉,repairPad.js通常很烂,实际上并不起作用。 https://github.com/ether/etherpad-lite/blob/develop/bin/repairPad.js#L48

我能建议的最好的办法是将文本/文本从记事本中拉出,然后将其放入新的记事本中。

@gnd我可以为您编写脚本进行测试,以尝试尝试并获取文本(如果需要)?

bin/extractPadData.js更改为输出到stdout在这里可能就足够了。2分钟,我将创建一个extractPadText.js

@JohnMcLear确实会很有帮助)

提取中

使用node bin/extractPadData.js $padid
然后cat $padid.db | grep \"text\" | grep revNum | tail -1

文本是val.atext.text项,您可以在cli处进行json解析。如果需要,我将在下一步进行。.现在,请执行以下命令以确保将$ padid替换为PadID

解析中

sudo apt-get install jq安装jq,然后cat $padid.db | grep \"text\" | grep revNum | tail -1 | jq .val.atext.text仅查看文本。

将Pad文本写入文本文件cat $padid.db | grep \"text\" | grep revNum | tail -1 | jq .val.atext.text > $padid.txt

现在您有了填充文本,您可以将其放在文本文件中并导入,或者您可以使用setText API或其他任何方法...

Lemme知道提取是否失败,我将考虑另一种方法。

提取正在运行,但是速度很慢。 在文件CareCicle.db中,我看到最新的行是revs:80 ,而脚本已经运行了20m。 问题垫已超过12,000个修订版。

噢,伙计,这太糟了。我猜它在80次修订后就无法构建pad对象。.脚本只需要30秒左右即可运行。

最后一个建议是很大的建议,就是转储整个数据库并将其发送给我,然后我可以编写一个脚本来解析出您的需求。 另外,我可以尝试在此处编写脚本,但是可能会有一些来回操作以使其以这种方式工作。

@JohnMcLear ,您好,脚本终于完成了。 我不知道为什么要花这么长时间(将近40个小时)。 无论如何,在我看来,整个练习可以通过从存储表中选择最高可被100整除的修订并从中提取文本来完成的? 以后生病请手动做:)非常感谢您的帮助

确实如此,但是当我假设用户可以执行数据库查询时,我经常被用户告知,因此我尽量避免这样做。 我想我知道为什么花了这么长的时间,您使用MySQL @ Etherpad 1.8.3吗?

我正在使用git中的最新master(不确定是哪个版本)

假设MySQL是一个已知的错误,我们应该在今天发布该补丁。

是的,抱歉,其最新的MariaDB-10.3.22-MariaDB

@JohnMcLear很抱歉向该票发送垃圾邮件,但是您提到的MySQL补丁是否有未解决的问题? 我想看看它是否可以解决我们在etherpad上的性能问题。

不,只需要npm安装[email protected]即可修复

顺便说一句,用于存储其他文本的新逻辑已经存在,因此应该将其关闭,但是如果人们遇到问题,请创建一个新的问题并参考该问题。 我想逐个处理每个单独的问题原因,其主要目标是创建自动逻辑,以在检测到损坏时实时恢复填充。 那是梦想,因为不可避免的是腐败。

这是给人们最近(从旧版本的etherpad升级时)了解此消息的信息。

今天,我将etherpad服务从1.6.3升级到1.8.6 (真是个变化!!!!!!恭喜所有开发人员)

我一个垫子有问题,检查器(checkPad,checkAllPads等)无法检测到它(或者我不知道如何正常运行节点)。

我在我的settings.json中验证了charsetutf8mb4 (在settings.json.template看到了最新版本)。

  "dbType" : "mysql",
  "dbSettings" : {
    "user":     "etherpaduser",
    "host":     "localhost",
    "port":     3306,
    "password": "PASSWORD",
    "database": "etherpad_lite_db",
    "charset":  "utf8mb4"
  },

对于案例https://pad.example.com/p/my-broken-pad我做了:

mysql
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:my-broken-pad"

它再次起作用:tada::unicorn::sparkles:

该解决方案高于上述解决方案(我在以前的消息中加上了+1,并提供了解决方案以帮助找到它),但我想让它更清晰

我想我们可以在这里做的一件事就是检查? 垫内容中,并提供包含建议解决方案的警告。 @ pedro-nonfree,请您将补丁提交到checkPad.js或其他什么,然后我很乐意将其合并:)

此页面是否有帮助?
0 / 5 - 0 等级