使用套接字接口不断发送溢出警告

Using socket interface keeps sending overflow warnings

我是通过socket接口建立watch,然后订阅变化。

对于每个传入的 PDU,如果地图有一个 "warning" 键,我将警告输出到 console/user,正如文档所建议的那样。

然而,当溢出发生时,看起来我并没有只得到一次 "warning" 键,而是每个传入的 PDU 一遍又一遍地有相同的警告 ("recrawl happened 1 time") ( AFAICT?),所以我最终用相同的错误消息向控制台发送垃圾邮件。

对我来说,如果 Watchman 在每个溢出事件中只发送一次 "warning" 键会更好。否则我正在考虑必须缓存 "warnings already shown to the user" 以避免向控制台发送垃圾邮件。

此外,就一般的溢出行为而言,警告说:

To resolve, please review the information on
https://facebook.github.io/watchman/docs/troubleshooting.html#recrawl
To clear this warning, run:
`watchman watch-del ... ; watchman watch-project ...`

但我更希望有一种方法可以重置警告,而不必取消并重新订阅我的订阅。例如。现在我必须 control-c 终止我的程序,运行 watchman watch-del 命令,然后重新启动我的程序。

我可以在内部实现自动化,例如让我的程序检测到 "overflow happened" 警告消息,终止它的订阅,发出 watch-del,然后重新发出 watch.

但是,即使我可以通过套接字接口重置警告,或者在内部执行此操作 watch-del,我想知道为什么需要重置警告——例如理论上,如果 watchman 已经进行了重新抓取,并且我告诉用户它发生了(通过将其记录到控制台),那么现在应该没问题了吧?为什么首先需要 watch-del + re-watch

例如只要溢出不是经常发生,看起来守望者正在重新抓取(因此与文件系统恢复同步)+发出一个警告 PDU 应该意味着一切都恢复正常,理想情况下,我的用户程序可以保持 dumb/simple 并继续在其 same/existing 订阅上获取 post-overflow/post-recrawl PDU。

抱歉,这还不够清楚。

首先:您不必严格执行此处的操作,因为 watchman 服务已经从溢出中恢复。

只是提示您可能是本地配置问题;如果你在 Linux,你可以考虑增加各种 inotify sysctl 参数。如果您在 mac 上,您将无能为力。警告是粘性的,因此它会强制出现在用户面前。后来有用户要求有办法抑制,所以增加了删除重启手表的建议。

结果是一个非常嘈杂的警告,引起了更多的混乱。

在 watchman 4.7 中,我们添加了一个配置选项来关闭此警告:https://facebook.github.io/watchman/docs/config.html#suppress_recrawl_warnings 此处的目的是向不知道如何(或没有权限)修复系统配置的用户隐藏警告。它与(未记录的)perf 采样配置选项结合使用可以很好地记录重新抓取的数量并将其报告给特定站点的报告系统。