0

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

但我今天看到了这个。

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

{'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”被标记为“new”(不是),然后我想我应该做一个“查询”来请求内容,但是我不明白为什么我会收到新文件的通知无论如何都应该扫描目录,因为它是“新的”(不是)。

我发现守望者语义真的很混乱。文档导航很糟糕,我没有看到任何我可以研究的例子。

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

这种情况是 100% 可重现的。如果我在订阅过程中创建文件,我会看到“is_fresh_instance=False”。如果我的监视器处于脱机状态,并且当它返回时它会请求带有最新时钟的“since”,我会收到相同的通知(目录和文件),但带有“is_fresh_instance = True”。

帮助!。Python 代码示例?

4

1 回答 1

1

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

什么是新鲜实例结果?

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

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

新的实例结果是什么意思?

Watchman 想要确保您不会错过您感兴趣的事件,所以它永远是错误的或错过了什么,它会告诉您一切,以防万一。

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

你应该怎么做?

如果您从先前的 watchman 查询中获得了有关文件系统的任何缓存信息,则必须丢弃它,因为它现在已经过时了。watchman 的结果包括有关当前存在的所有文件的信息。这是一个重要的信号,有助于防止守望者数据的有状态消费者偏离世界观。这可以防止的有问题的情况是:

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

如果你不清除你的缓存,你可能会错误地认为它A仍然存在,基于它在你的缓存状态中的存在。

如果你没有任何缓存信息,那么你不需要做任何不同的事情,你可以忽略这个标志。

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

对于一些消费者,尤其是那些拥有非常大的树的消费者,如果遇到新的实例结果集,可能需要执行一些其他应用程序定义的回退处理。

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

如果您决定使用此标志,我建议您跟进查询结果中返回的守望者查询sinceclockis_fresh_instance确保您没有错过回退处理期间可能发生的任何其他更改。

一般来说,我不推荐使用这个标志,除非你真的确定你需要它。

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

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

  • watchman-make - 使用订阅触发构建
  • watchman -wait - 像 inotifywait 工具
  • 善变的fsmonitor 扩展;大多数守望者特定代码都在init .py中。此代码使用轮询模型,因为它不是一个长期存在的过程。fsmonitor 维护一个缓存,因此正确处理新的实例结果很重要,否则 repo 中提交的内容开始发生奇怪的事情!
于 2018-01-29T06:17:36.853 回答