最初发表在"异口同声"笔记上.
我为视频管道建造了YouTube上传站台,流线在纸上看起来相当干净:开始一个可复述的会话,PUT文件,拿回视频ID,验证上传实际落地方式,再写出当地记录来标注剧集的上传方式.
四步相接,每步相依于上.
问题是后两者之间的依赖性。
序列,如果它打破了这里的验证,则意味着在上传完成后重新对视频进行填充,以确认可见度没有默默地被降级,上传没有被拒绝,并且元数据实际上被传播.
这很合理,可以检查——YouTube的上传API可以在运输层上报告成功,而平台-侧处理则做了你没有要求的事情.
但是,如果这个核查电话上升,例外会直线传播,而当地的记录——我会拨打的JSON文件——永远不会被写入.
不是"用错误标记写成" 从来没有写,时期。
然而,当这个例外发生时,视频已经存在于YouTube上。
PUT成功.
视频身份是真实的 频道有公有(或非公有)视频坐放,而磁盘上完全没有知道此事.
之后再次运行同样的指令,而本应回答"我已经上传了这个吗"的后卫——一个是否存在的检查——航行右转,因为它不存在.
结果不是重试 这是同一段视频的第二个完全独立的上传. "不重复"其实意味着 模块的docstring表示重试不会产生重复视频.
该行没有错,确切地说,它的范围比它所读的要窄.
低等文件-PUT函数内部的重试是真实的,在重试时重用同一次可重复的会话URI,因此上传时的运输层打嗝确实可以安全地重试.
它没有覆盖的是有人在失败后从外部重新运行整个指挥部.
这是一种完全不同的代码路径,通过重复的后卫而不是重复的会话,而没有任何关于内在再试安全延伸到它的内容.
道克弦中的一句话,"回想"的两个不同含义,只有一句实际上受到保护.
同样的错误的第二个复制件, 已经直播了, 在追踪到这个的时候, 我发现了一个相同的根源的第二例, 已经在同一个寄存器中。
在这个上传阶段存在之前,有五集已经经过了不同的路径——MCP工具——而该路径也从未被写出.
也就是说,这个全新的重复警卫 不仅容易受到未来的验证失败的影响, 而且已经对5个特定的视频视而不见, 视频现在在频道直播。
新指令的一跑,指向了这5个中的任何1个,都找不到任何记录,看似没有理由停放,并在频道上放出每个记录的复制.
缺陷不是警卫逻辑中的缺陷.
警卫的逻辑很好 缺点是,第二道路可以创造出同一种资源,从不告诉第一道路的簿记.
值得一提这是如何过去的测试, 因为每个相关的单位测试都是绿色的。
快乐之路 失踪的档案后卫 公众视线检查 重复后卫 甚至一个测试断言核查在发现降级时会投出——全部被覆盖,全部通过.
他们都查不到的是 例外被开除后 磁盘上还剩下什么状态 测试倾向于问一个函数返回什么和它投掷什么.
被扔的对吗 很容易说 档案系统被抛出后仍然坐着的是一个不同的问题, 像这样的残存状态的虫子之所以具体地生活着,是因为没有人的断言指向它.
修补:在核实前写作,不是在修补移出检查站后写作,不是支票. )