场景工具的条件执行
全库目录221
本文目录10
场景工具接收规划器的目标后,还要防止输入过期、重复执行和旧执行者迟到写入。本文以任务J在房间R内创建桌子T、再执行移动A和B为例;R与T是稳定对象ID,r、v和c分别表示对象与集合版本。几何规则见资产布局的几何验证,这里说明宿主何时有权提交变更。
读取版本与条件执行
J根据房间R的世界变换r1,把局部位置换成桌子T的世界位置。人工随后把R移动到r2,T对象版本和父子关系都可能保持原值。此时仅比较T,执行器仍会接纳按r1算出的旧位置。问题出在操作读取了R,却只保护了T的写入。
计划因此保存读取集合与修改集合。读取项记录稳定ID、字段语义和版本;修改项记录目标ID、预期版本及绝对目标值。J使用以下依赖:
| 输入 | 版本保护的内容 | 变化后的处理 |
|---|---|---|
| R及祖先变换、边界、门窗、其他家具 | 变换、几何、碰撞与挂接记录 | 重建受影响世界变换和可行域,重算布局与碰撞 |
| 区域对象集合 | 区域集合版本,包含新增与移除 | 重新枚举障碍,防止只比较旧对象漏掉新椅子 |
| 桌子资产 | 不可变资产哈希,尺寸、枢轴、碰撞与LOD依赖哈希 | 重新选型或按新版本重算尺寸和预算 |
| 导航与角色 | 导航区域代次、源几何哈希、角色半径与规则版本 | 等待匹配源几何的导航构建,重新查询通路 |
| 技术与视觉检查 | 规则、相机、预览配置及实际场景清单哈希 | 产生新的验证尝试及批准候选 |
读取集合从同一场景快照建立。空间查询同时登记覆盖区域的集合版本;即使查询结果为空,新增对象也会改变该版本。宿主若不能提供细粒度版本,就比较整个暂存场景快照代次。版本粒度粗会增加重算,却能保持依赖完整。外部资产、导航和规则采用已固定的不可变版本,宿主保存其引用;外部服务的活动入口先解析为具体哈希,再参与计划,避免在两个系统之间假设一次原子比较。
执行器在宿主提交边界共同检查读取集合、修改集合、场景令牌和任务许可,通过后才写对象、关系、新版本与操作回执。所有场景写入者,包括人工工具,都经过同一版本化入口。检查与写入之间没有可插入的场景修改;采用快照方案时,条件替换活动快照,并把回执放在同一快照内。只在调度器中检查一次,再向宿主发送普通移动命令,会重新打开竞争窗口。
R从r1变成r2时,旧操作得到DependencyChanged及不匹配的读取项,场景不发生该操作的修改。调度器关闭这份计划的后续派发,使其技术报告、预览和批准失效;读取新快照,重新求世界位置、碰撞和导航。即使最终局部位置仍相同,也生成新计划版本、新验证尝试和新操作ID。已经应用的A保留原回执,新的B以A的实际输出为输入;取消时仍按真实操作链补偿。不得把新读取版本填进原操作后直接执行旧目标。
执行中的读取集合也随本任务写入变化。创建T使区域集合从c0变c1,移动A使T从v1变v2;B必须消费相应宿主回执,将这些输出加入新的快照,再做自身的计划校验。只有登记在回执上的精确承接可以更新输入;“同一任务写入”不能自动证明导航、布局和预算仍然成立。
本设计采用以下返工终止规则:每次报告保存失败规则ID、位置、相关对象与实际值,规划器每轮只提交有限候选;同一规则在相同资产集合和输入版本下连续3轮未改善则停止自动返工,进入人工审核或失败队列。技术通过只推进到视觉审核,发布前再次核对产物哈希和批准版本,不能把工具执行成功当作任务批准。
在J中,移动A后的实际布局形成验证尝试V1,通路失败报告引用桌子T及其版本;移动B消费新快照并重新验证,形成V2。V1的迟到成功不能替代V2,因为验证回执同时绑定场景快照哈希、完整输入依赖、规则版本和尝试ID。执行器完成的只是移动,V2通过后才允许视觉审核这份布局;审核期间任一对象变化都会使绑定的候选哈希失效。
操作登记与恢复对账
工具返回超时以后,调度器只知道没有收到结果,不知道场景是否已经写入。创建操作先生成稳定目标ID与操作ID,把期望变更写入任务记录;执行器检查目标ID是否存在,存在时核对内容版本,缺失时才创建。操作结果写入失败时,恢复过程据目标ID重新读取产物并补齐记录。
登记表保存Prepared、Applied、Recorded三种状态。Prepared先落盘;调用工具后,只有收到成功回执或读取到匹配的持久操作标记,才能记Applied;结果与产物清单写入同一登记事务后记Recorded。崩溃可能让表仍是Prepared而场景实际已应用,因此状态名本身不能证明副作用发生与否。恢复Prepared时先按操作ID查询宿主持久回执与接纳状态;已应用则补登记,仍在执行则等待或对账,确认未接纳,并关闭旧请求的提交权限、确认旧队列项及在途调用退出后,才考虑派发。此时任务必须仍允许正向执行,并重新比较原读取、修改集合;条件已过期就记DependencyChanged并返工,取消中则终结未接纳项,禁止补发。Applied补写结果,Recorded直接返回原结果。工具若不支持稳定ID或查询,则需要隔离暂存场景,通过场景差异与清单对账;模型不能凭聊天里的“成功”替代这份证据。
场景对账完成后,产物清单进入技术验证;人工修改形成新哈希和新验证尝试。补偿按对象ID、操作标记和版本共同定位,只恢复仍属于该次操作的内容,发布步骤另按批准记录与发布代次仲裁。
工具执行的并发交接
“查询目标不存在,再创建”有两个执行者同时通过检查的竞争。每个暂存场景由一个串行执行器持有,调度器分配带代次的场景写入令牌。工具入口在同一互斥区核对场景ID与令牌代次,再把请求放入归属该代次的串行写入队列。接管先关闭旧代次,排空已经接纳的调用并确定其终态,随后才开放新代次。
代次检查与实际写入之间也要保持这份授权。检查通过以后,如果请求又被转交给不核验代次的普通线程,旧执行者仍可能在接管后写入。因此宿主拥有串行队列与写入口,排空针对这条实际执行路径,而不只观察调度器是否停止发送。
排空失败时保持接管未完成,停止旧宿主及持有场景写权限的工具子进程,确认它们已经终止、写入队列已关闭,再恢复宿主并重建场景快照。这些条件成立后才启用新执行器。无法确认旧调用终止时,使用新的隔离场景和独立写入口恢复任务;原场景继续隔离,旧结果不得进入新场景。租约到期或重启请求已发出,都不能代替实际终止与写权限隔离。
创建操作与持久标记
在这个单写前提下,创建操作先登记操作ID、确定的目标ID、资产版本、期望变换、场景代次。稳定操作参数的摘要包含目标ID、资产版本、期望变换、计划哈希和读取/修改集合;场景写入令牌代次属于本次调用的授权封套,单独核对并记录,不进入稳定业务摘要。同一操作ID带不同业务参数直接报告冲突;参数一致时检查目标实例上保存的操作ID与版本,存在且匹配就返回该实例。接管后的执行器以新令牌重试原操作ID,先证明自己拥有当前写权限,再对账旧操作内容;若把旧场景代次也作为不可变业务参数,就会在接管时把合法恢复误判成异参。
确认原操作未接纳且目标不存在时,先检查完整读取、修改集合。创建在未挂接的对象上准备资产版本、变换与操作标记,再在宿主事务内复核条件,共同挂接完整对象、推进版本并保存操作回执,最后返回结果。宿主若不支持这种事务,就在隔离场景副本完成全部属性和标记,以完整场景快照作为提交单位,不能把多个可中断字段写入假装成一次原子创建。若创建后进程崩溃,接管者读取场景标记补齐记录;标记存在但内容已被人工修改,则进入冲突审核,不能覆盖人工版本。
没有可持久标记的宿主,先保存隔离场景快照和对象清单,再据快照差异对账,正式场景始终在批准后接收完整版本。
移动操作在同一串行入口登记目标ID、预期对象版本、绝对目标变换和原变换。宿主原子地写入目标变换、新版本与操作标记;恢复时若标记和目标状态匹配,就补登记并返回原结果,不能再叠加一次位移。若目标仍是登记的原版本且完整读取集合仍匹配,才执行这次变更;若已变成第三个版本,即使位置碰巧相同也进入冲突,避免覆盖人工编辑。宿主不能原子保存这些字段时,仍以隔离场景的完整快照提交。补偿的首步要求当前版本等于最后一次移动产出的版本;同一任务后续操作已经补偿时,使用场景补偿的版本承接中的持久记录确定预期版本。每次恢复都生成新版本,外部写入造成的版本变化进入冲突。创建的稳定ID解决对象重复,移动的版本比较解决同一对象上的重复写与覆盖,两者共同支持完整布局重试。
失败恢复
幂等与重试
同一操作ID的重试返回已有结果或继续未完成操作。布局更新可以描述完整期望状态,执行器比较当前场景后只应用差异。生成目标ID、写场景和记录结果之间的空隙,按前述恢复对账处理。
输入验证失败进入修正流程;服务繁忙与短暂断连采用有限退避重试;容量不足交给调度器更换工作进程或采用批准的降级参数。模型、种子、分辨率或候选变化会形成新的变体ID,使原始请求与降级产物可区分。
重试策略记录次数上限、退避、抖动、可重试错误码和总截止时间。相同输入稳定触发工具缺陷时保存诊断,进入修复队列。重复请求不会改变确定性错误的根因。
生成服务与不确定结果
图像或模型生成可能在场景写入之前调用外部服务。请求登记同时保存提供方任务ID或提供方支持的幂等键,超时后先查询该任务;成功时把输出下载到任务的不可变产物目录,核对哈希后才进入导入。改变种子或降级模型形成新变体ID,原任务记录继续保留,便于取消迟到结果或回收费用与资源。
提供方若既不支持幂等键也不能查询,响应丢失后便无法判断它是否已经计算。此时登记为结果不确定,停止自动重复付费调用;可明确建立新尝试,但每次尝试各自记录成本,只有被选中的输出进入下游。稳定场景目标ID能避免重复放置资产,却不能让这种外部计算自动变成恰好一次。
实现与证据
本页说明资产管线的设计协议与接口条件,未部署Agent、连接DCC、构建实际导航或执行资产发布。公式与数例可作机制推演,宿主事务、幂等性、恢复和发布仍需由各工具实现验证。事务边界的可运行示例见RPC。
相关主题
参考资料
- SQLite Transaction:本地操作登记的事务边界。
- etcd API guarantees:条件事务与发布指针仲裁;场景工具不由数据库自动获得原子性。