ThearchyHelios
|
eb9af51abb
|
复核 R-b14(PostgreSQL 单进程墙钟一跳就隔离自己):取得到计入休眠的钟(SLEEP_AWARE)时 stale() 只看它,墙钟只在取不到时当后备(两只里走得多的那只);两只钟对不上(jumped)不再直接隔离,先续一次租——续租那一句按库的时钟核对「自己的租约还没过期」,以它为准:续上了只记一条日志照常,续不上才隔离。README「多进程」补一句:库服务器自己的时钟往前跳超过一个租约时所有进程一起隔离、怎么恢复,往回跳时真没了的进程要多等,本机墙钟跳了不隔离。补测试:墙钟往前往后跳一小时不算续晚了、只算对不上,计入休眠的钟走过两个租约照样算,取不到时墙钟当后备;PostgreSQL 单进程墙钟 ±1 小时续租照常续上、不隔离,真过期仍隔离;执行到一半墙钟 ±1 小时,运行照常跑完、世代不变(改前的写法往前跳那条不过)
|
2026-10-19 15:07:17 +08:00 |
|
ThearchyHelios
|
ba22b82b3d
|
复核 R-b9(Fenced 打到不该打的地方):check() 续晚了谁问到都隔离,但只对绑定了世代的执行(运行的一段执行、后台任务)抛 Fenced,HTTP 处理、调度那一拍、进程间请求问到时只隔离不抛;调度循环、心跳、办进程间请求也接住 Fenced;续租的任务不再因为一下出错就退出——续租、隔离之后重新登记都包住,照实记日志、退避着重试(最长一个租约时长)。隔离时马上换身份(之后新建的行记新身份),新身份登记上之前心跳不争当班、不接手,新开始的运行、后台任务在 fence.ready() 上等(最多一个租约时长,等不到就不开始,那几行由别的进程按属主不在了处理,这边同时放弃这个一直没登记上的身份、再换一个)。日志写出新旧完整身份。补测试:没绑定的调用者只隔离不抛、绑定在隔离之前的抛、新身份登记上之前 ready 等着;调度循环被 Fenced 打到一拍之后照常;重新登记先被版本守卫拦、再碰上库连不上,续租任务都不退出,登记上之后照常续租
|
2026-10-19 14:33:45 +08:00 |
|
ThearchyHelios
|
7fcce90f95
|
复核 R-b7(休眠、时钟偏差下隔离失灵):租约改用库的时钟——续租、登记写 lease_until = 库的 clock_timestamp() + 租约,判活、清理过期登记、版本守卫看谁活着都比库的时钟,调度当班的租约同样按库的时钟接班、续租,本地判还当不当班改看计入休眠的单调钟,机器之间墙钟差多少都不起作用;隔离改用计入休眠的钟(Linux CLOCK_BOOTTIME,macOS clock_gettime(CLOCK_MONOTONIC),取不到退回 monotonic),并且一律同时比墙钟,两只钟里走得多的那只说过了一个租约就算续晚了;续租时两只钟差出一个租约(墙钟跳了、休眠没计)也隔离;续租那一句带上「库里自己的租约还没过期」的条件,过期了或者登记不见了就不再续这个身份、隔离换身份(以前登记不见了是用旧身份重新登记)。补测试:单调钟不走而墙钟过了两个租约、墙钟往回拨,都算续晚了;本机墙钟快一小时,别的进程照样活着、当班租约抢不走;库的时钟过了自己的租约时续租不续、隔离一次
|
2026-10-19 14:27:55 +08:00 |
|
ThearchyHelios
|
35ab097b45
|
复核 R-b1(卡住但没死的进程被当成没了):续租约挪到单独的任务、专用连接(不走连接池,不被同一拍别的活拖住);进程间请求另起任务办,不在心跳里等收尾;新增 cluster/fence 自我隔离——离上次续上租约超过一个租约时长,或者这段执行属于上一次隔离之前,执行在写事件、写断点、开审批、发外部写入、后台任务写库之前就停手(Fenced 是 BaseException,节点里的 except Exception 拦不住),续租时发现续晚了就隔离:停掉手上的运行和后台任务、不写终态,换一个身份重新登记;运行收尾先占住那一行、属主不是自己就不写;别的进程按租约过期再多等一个租约时长才算不在了(两边中间留一段);run_events 的 (run_id, seq) 改成唯一索引(存量库先数重复,有就照实记日志、这一次不建,不让启动失败)。补测试:卡住期间被接手之后不盖终态、不写事件、序号不重;被接手的那次在别处接着跑完只结束一次、后面那一步只跑一次;收尾按属主写;撞号被库拒绝;多进程端到端加 6b、6c(真 SIGSTOP / SIGCONT)
|
2026-10-19 13:15:56 +08:00 |
|