Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
8ecdb41
fix: wait for DDL visibility on all working CNs
ck89119 Aug 27, 2026
d6603f6
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 27, 2026
bc0d8e0
fix: fence DDL visibility across CN admission
ck89119 Aug 27, 2026
b6a3a3a
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 27, 2026
47dd6dd
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 27, 2026
7d6b812
fix: withdraw DDL barrier before CN shutdown
ck89119 Aug 27, 2026
144f093
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 27, 2026
877db80
fix: revalidate failed DDL barrier targets
ck89119 Aug 27, 2026
3df6a5c
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
cfb7717
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
7340575
fix: fence live DDL protocol activation
ck89119 Aug 28, 2026
eaa66da
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
b0b7032
fix: linearize DDL during protocol activation
ck89119 Aug 28, 2026
6b1e497
fix: order activation readiness publication
ck89119 Aug 28, 2026
1679fd3
merge main and fix DDL activation recovery
ck89119 Aug 28, 2026
8dc075e
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
d43ae04
fix: require distributed DDL activation cut
ck89119 Aug 28, 2026
d51de66
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
de8c5d6
fix: fence live background DDL activation
ck89119 Aug 28, 2026
af91a1e
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
c11ce76
fix: retain DDL barrier eligibility on failure
ck89119 Aug 28, 2026
9a7eebd
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 28, 2026
421656c
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 29, 2026
000e9ce
fix: keep v36 startup ingress closed until activation
ck89119 Aug 29, 2026
5a1a570
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 29, 2026
e426854
fix: separate default runtime from DDL activation
ck89119 Aug 29, 2026
4753ae5
Merge remote-tracking branch 'mo/main' into issue-27743-main
ck89119 Aug 29, 2026
2ae5ed5
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 29, 2026
ae22c36
test: align DDL activation with protocol v38
ck89119 Aug 29, 2026
b8e84b3
fix: durably stage DDL activation fence
ck89119 Aug 29, 2026
234f702
fix: persist cluster DDL activation epoch
ck89119 Aug 29, 2026
b4bf842
fix: gate DDL epoch on HAKeeper capability
ck89119 Aug 29, 2026
9b39b7e
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 30, 2026
2518eeb
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 30, 2026
537d3ac
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 30, 2026
4b6c44a
fix: atomically commit DDL activation membership
ck89119 Aug 30, 2026
231fb0f
Merge remote-tracking branch 'mo/main' into issue-27756-main
ck89119 Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pkg/clusterservice/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,8 @@ func newCNService(cn logpb.CNStore) metadata.CNService {
ViewMetadataAdmissionGeneration: cn.ViewMetadataAdmissionGeneration,
ViewMetadataAdmissionReady: cn.ViewMetadataAdmissionReady,
ViewMetadataObservedEpoch: cn.ViewMetadataObservedEpoch,
DDLVisibilityBarrierReady: cn.DDLVisibilityBarrierReady,
ViewMetadataIngressReady: cn.ViewMetadataIngressReady,
}
}

Expand Down
10 changes: 10 additions & 0 deletions pkg/clusterservice/cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ func TestClusterAdmissionSnapshotFiltersEveryPublicInventory(t *testing.T) {
UUID: "pending",
WorkState: metadata.WorkState_Working,
ViewMetadataAdmissionGeneration: 11,
DDLVisibilityBarrierReady: true,
ViewMetadataIngressReady: true,
},
}
hc.Unlock()
Expand All @@ -189,12 +191,20 @@ func TestClusterAdmissionSnapshotFiltersEveryPublicInventory(t *testing.T) {
require.Equal(t, []string{"ready"}, withoutWorkState)

var raw []string
pendingBarrierReady := false
pendingIngressReady := false
require.NoError(t, GetCNServiceRawWithContext(
context.Background(), c, NewSelector(), func(service metadata.CNService) bool {
raw = append(raw, service.ServiceID)
if service.ServiceID == "pending" {
pendingBarrierReady = service.DDLVisibilityBarrierReady
pendingIngressReady = service.ViewMetadataIngressReady
}
return true
}))
require.ElementsMatch(t, []string{"ready", "pending"}, raw)
require.True(t, pendingBarrierReady)
require.True(t, pendingIngressReady)

admission := c.GetViewMetadataAdmission()
require.True(t, admission.Enabled)
Expand Down
39 changes: 27 additions & 12 deletions pkg/cnservice/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,18 @@ func NewService(
UUID: cfg.UUID,
Role: metadata.MustParseCNRole(cfg.Role),
},
cfg: cfg,
logger: logutil.GetGlobalLogger().Named("cn-service"),
metadataFS: metadataFS,
etlFS: etlFS,
fileService: fileService,
sessionMgr: queryservice.NewSessionManager(),
addressMgr: address.NewAddressManager(cfg.ServiceHost, cfg.PortBase),
gossipNode: gossipNode,
}
cfg: cfg,
logger: logutil.GetGlobalLogger().Named("cn-service"),
metadataFS: metadataFS,
etlFS: etlFS,
fileService: fileService,
sessionMgr: queryservice.NewSessionManager(),
addressMgr: address.NewAddressManager(cfg.ServiceHost, cfg.PortBase),
gossipNode: gossipNode,
ddlCommitGate: frontend.NewDDLCommitGate(),
}
runtime.ServiceRuntime(cfg.UUID).SetGlobalVariables(
frontend.DDLCommitGateRuntimeKey, srv.ddlCommitGate)
srv.colexecServer = colexec.NewServer(cfg.UUID)

srv.requestHandler = func(ctx context.Context,
Expand Down Expand Up @@ -463,6 +466,9 @@ func (s *service) Start() (err error) {
if err = s.startUnlessViewMetadataGenerationRevoked(s.queryService.Start); err != nil {
return err
}
if err = s.prepareDDLVisibilityBarrier(); err != nil {
return err
}
if err = s.startFrontendUnlessViewMetadataGenerationRevoked(); err != nil {
return err
}
Expand All @@ -477,11 +483,9 @@ func (s *service) Start() (err error) {
if err = s.checkViewMetadataGenerationRevoked(); err != nil {
return err
}
s.viewMetadataIngressReady.Store(true)
if err = s.checkViewMetadataGenerationRevoked(); err != nil {
if err = s.publishDDLVisibilityIngressAfterStart(); err != nil {
return err
}
s.notifyHeartbeat()

if err = s.checkViewMetadataGenerationRevoked(); err != nil {
return err
Expand All @@ -508,9 +512,20 @@ func (s *service) closeService() error {
defer logutil.LogClose(s.logger, "cnservice")()

s.closeViewMetadataAdmission()
// Prevent an already-admitted protocol command from republishing the
// barrier after shutdown begins. Other QueryService methods remain live
// until authoritative withdrawal, preserving the stale-target retry path.
s.ddlVisibilityBarrierClosing.Store(true)
if s.ddlCommitGate != nil {
s.ddlCommitGate.Close()
}
// Stop periodic heartbeats before publishing the final false readiness.
// QueryService remains available until the authoritative inventory has
// observed the withdrawal, so healthy CNs cannot target a closed barrier.
s.stopper.Stop()

s.closeErr = closeCNServiceSteps(
s.withdrawDDLVisibilityBarrier,
// Query commands can reach frontend, task, engine, lock, shard,
// auto-increment, and transaction state. Stop and drain this remote
// ingress before clearing any of those dependencies.
Expand Down
Loading
Loading