守望者:“is_fresh_instance”

时间:2018-01-28 22:18:06

标签: watchman

到目前为止,我已将“is_fresh_instance”视为“我不知道以前的历史,所以我再次向您发送所有数据”。当我的“自”为“0”或类似时,这种方法很好。我得到了所有内容,我将“is_fresh_instance”解释为这不是增量更新而是完全转储的信号。

但我今天看到了这一点。

我正在监视一棵树,其中包含200多个目录和12.000个文件。我在里面创建了一个新文件。我的文件监视器处于脱机状态(守望者进程正在运行,但没有人订阅)。我启动了我的文件监视器,它请求“增量”转储“自”。我明白了:

{'unilateral': True, 'subscription': 'Buffy', 'root': '/home/meta', 'is_fresh_instance': True, 'version': '4.9.0', 'clock': 'c:1517109517:10868:2:97', 'files': [{'name': 'dir', 'exists': True, 'oclock': 'c:1517109517:10868:2:97', 'ctime_ns': 1517168825691348944, 'new': True, 'mode': 16877}, {'name': 'dir/FILE.TXT', 'exists': True, 'oclock': 'c:1517109517:10868:2:97', 'ctime_ns': 1517168825787349000, 'new': True, 'mode': 33188}]}

这里我收到“is_fresh_instance = True”,但我收到了增量通知。如何进行?。目录“dir”被标记为“新”(它不是)然后我想我应该做一个“查询”来请求内容,但后来我不明白为什么我得到新文件的通知,如果我是应该扫描目录,因为它是“新的”(它不是)。

我觉得守望者的语义真的很混乱。文档导航很糟糕,我没有看到任何我可以学习的例子。

当我得到“is_fresh_instance = True”时,守望者期待我做什么?

此案例100%可重复。如果我在订阅过程中创建文件,我会看到“is_fresh_instance = False”。如果我的显示器处于脱机状态,并且当它返回时它会请求具有最新时钟的“自”,我会收到相同的通知(目录和文件),但是“is_fresh_instance = True”。

帮助! Python代码示例?。

1 个答案:

答案 0 :(得分:0)

我怀疑你的一些问题与https://stackoverflow.com/a/48493592/149111有关,但你说我们的文档可能更好是正确的,所以这里有一些背景信息。

什么是新的实例结果?

当守望者无法告诉您在您请求的时间范围内发生的事件时,会生成一个新的实例结果。有几种情况可以触发:

  • 自上次查询以来,守望者服务器已重新启动
  • 手表被取消并重新启动。
  • 系统无法跟上监视文件的变化率,内核刷新队列以跟上。 (我们将其称为重新抓取,因为我们必须重新检查已观看的树)
  • 您正在使用时间戳而非时钟,且时间戳超出了已知事件的范围。
  • 您正在使用named cursor并且之前没有使用该名称。
  • 您在查询中使用since生成器的空白时钟字符串(这与查询表达式中的since项不同!)

新实例结果意味着什么?

守望者希望确保你不会错过你感兴趣的事件,所以它是错误的或错过的东西,它会告诉你一切,以防万一。

is_fresh_instance标志在这些情况下设置,这意味着它会告诉您查询时存在和匹配的所有内容。

你应该怎么做呢?

如果您有来自先前监视器查询的文件系统的任何缓存信息,则必须丢弃它,因为它现在已过时。 watchman的结果包括有关当前存在的所有文件的信息。这是一个重要的信号,有助于防止有状态的消费者的守望者数据偏离世界的观点。这会阻止的问题是:

  • 文件A已存在并显示在先前的查询结果中,并且您缓存了该信息
  • 守望者停止
  • 文件A已删除
  • 守望者开始

如果您没有清除缓存,则可能会错误地认为A仍然存在,因为它在缓存状态下存在。

如果您没有任何缓存信息,那么您无需执行任何其他操作,您可以忽略该标记。

如果我不想要所有文件的列表怎么办?

对于某些消费者,特别是那些树木非常大的消费者,如果您遇到新的实例结果集,可能需要执行一些其他应用程序定义的后备处理。

您可以在查询中设置empty_on_fresh_instance: true,告诉守望者为您提供一个空的files: []列表,而不是有关所有当前文件的信息。

如果您决定使用此标记,我建议您跟进since clock is_fresh_instance /* Renew cookie at every page load */ function renew_wp_cookie() { //Return early if its on login/logout page if(in_array($GLOBALS['pagenow'], array('wp-login.php'))) return; if (is_user_logged_in() && current_user_can('user_role')) { $current_logged_user = get_current_user_id(); wp_set_auth_cookie($current_logged_user, true); } } add_action('init', 'renew_wp_cookie'); 查询结果中的{{1}}密码,以确保您还没有错过在后备处理过程中可能发生的任何其他更改。

一般情况下,除非您确定需要,否则我不建议使用此标志。

我在哪里可以找到一些python示例?

我们在python中没有很多教育示例,但您可以查看一些真正的程序:

  • watchman-make - 使用订阅来触发构建
  • watchman-wait - 与inotifywait工具一样
  • mercurial fsmonitor extension;大部分守望者特定代码都在init.py。此代码使用轮询模型,因为它不是一个长期存在的过程。 fsmonitor维护一个缓存,因此正确处理新的实例结果非常重要,否则奇怪的事情就会发生在repo的提交内容中!