3e7fcce0b1
build / build (push) Successful in 1m11s
新增迁移50与每5分钟/手动持久同步,API只读本地;同步失败保留、权限阻断、租约与质量失效原子激活。 保留全量稳定分页/固定列,已存质量批量读取,元数据不反复解压长答案;详情安全Markdown与原文。 已运行整仓 make verify、源与副本隔离PG -race、真实只读源及隔离浏览器。 实际同步2525条;固定窗口640条本地中位1.46秒,对照直接源33.10秒。 停worker、缺源凭据、重启API后仍可查询;未更新8088,未修改生产原问答。
27 lines
1010 B
Go
27 lines
1010 B
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
"knowledge-governance/internal/dobotaiops"
|
|
"knowledge-governance/internal/httpapi"
|
|
"knowledge-governance/internal/qaopsmirror"
|
|
"strings"
|
|
)
|
|
|
|
// API serving never constructs or probes a production-source client. The worker
|
|
// alone synchronizes the explicitly authorized local copy; this is not a fallback.
|
|
func openQAOperations(_ context.Context, getenv func(string) string, governanceDSN string, pool *pgxpool.Pool) (httpapi.QAOpsReader, dobotaiops.Settings) {
|
|
settings := dobotaiops.LoadSettings(getenv, governanceDSN)
|
|
if !settings.Enabled {
|
|
return nil, settings
|
|
}
|
|
if settings.TenantKey == "" || len(settings.TenantKey) > 128 || strings.ContainsRune(settings.TenantKey, 0) {
|
|
settings.Problem = "local_mirror_tenant_invalid"
|
|
return nil, settings
|
|
}
|
|
// Missing/offline source credentials stop synchronization, not last-good local reads.
|
|
settings.Problem = ""
|
|
return qaopsmirror.NewStore(pool, settings.TenantKey), settings
|
|
}
|