blob: feb7b4199d136278847e629a884507fe82d5722f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@startuml
' Note: in TEOZ mode som skinparams don't work
' and currently notes on messages can't be customized -
' but this mode creates more compact layout, enable if needed
'!pragma teoz true
skinparam noteFontSize 10
skinparam ParticipantPadding 5
skinparam SequenceGroupBorderThickness 1
skinparam SequenceGroupBorderColor #blue
skinparam SequenceDividerBorderThickness 1
skinparam SequenceDividerFontStyle plain
skinparam sequence {
MessageAlign center
}
title Split shard into N parts with RF replicas
actor User
control Overseer
entity ShardLeader
collections OtherNodes
User -> Overseer : SPLITSHARD
activate Overseer
== Prepare ==
Overseer -> Overseer : checkLeaderDiskSpace
Overseer -> Overseer : fillRanges(N)
loop 1..N
Overseer -> Overseer : deleteOldSubShard
rnote right: left-overs from a\nprevious failed split
end
== Sub shards construction ==
loop 1..N
Overseer -> Overseer : createSubShard
rnote right : subShard state\nCONSTRUCTION
Overseer -> Overseer : waitForSubShard
Overseer --> Overseer : addSubLeader
rnote right : placeholder, no core,\nsame node as parent
end
Overseer -> Overseer : waitForSubLeadersVisible
loop 1..N
Overseer -> Overseer : waitForCoreNodeVisible
Overseer --> Overseer : setSubLeaderActive
end
Overseer -> Overseer : waitForSubLeadersActive
== Split parent shard leader ==
Overseer --> ShardLeader : splitParentCore
activate ShardLeader
ShardLeader --> Overseer : splitComplete
deactivate ShardLeader
loop 1..N
Overseer --> ShardLeader : applyBufferedUpdates
activate ShardLeader
end
ShardLeader --> Overseer : updatesComplete
deactivate ShardLeader
== Create sub replicas ==
loop N * (RF-1)
Overseer --> Overseer : addSubReplica
rnote right : placeholder, no core,\nstate DOWN, other node
end
alt
Overseer -> Overseer : checkParentStillLeader
else
Overseer -> User : changed / error
end
Overseer -> Overseer : updateSubShardStates
rnote right : subShards in RECOVERY or\nACTIVE if RF=1
loop N * (RF-1)
Overseer --> OtherNodes : createSubReplicaCore
activate OtherNodes
end
OtherNodes --> Overseer : createComplete
Overseer -> User : success
deactivate Overseer
...
OtherNodes ---> Overseer : replicasRecovering
...
alt
OtherNodes --> Overseer : allReplicasActive
activate Overseer
Overseer -> Overseer : switchShards
rnote right : parent shard INACTIVE\nsub shards ACTIVE
else
alt
OtherNodes --> Overseer : someReplicasFailed
else
Overseer --> Overseer : parentShardLeaderChanged
end
deactivate OtherNodes
Overseer -> Overseer : shardRecoveryFailed
rnote right : parent shard ACTIVE\nsub shards RECOVERY_FAILED
end
deactivate Overseer
@enduml