Skip to content

Commit aa6fb92

Browse files
authored
Merge pull request #237 from arangodb-helper/singleServer
Fixed single server upgrade race-condition.
2 parents a9c278d + b73ad1c commit aa6fb92

File tree

2 files changed

+32
-23
lines changed

2 files changed

+32
-23
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# ArangoDB Starter Changelog
22

3+
## Changes from 0.14.5 to 0.14.6
4+
5+
- Fixed race condition in Single Server upgrade
6+
37
## Changes from 0.14.4 to 0.14.5
48

59
- Implement special upgrade procedure for upgrading from 3.4.6

service/upgrade_manager.go

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,19 @@ func (m *upgradeManager) StartDatabaseUpgrade(ctx context.Context) error {
265265
// Fetch mode
266266
config, myPeer, mode := m.upgradeManagerContext.ClusterConfig()
267267

268-
if !mode.HasAgency() {
269-
// Run upgrade without agency
270-
go m.runSingleServerUpgradeProcess(ctx, myPeer, mode)
268+
if mode.IsSingleMode() {
269+
// Run upgrade without agency (i.e., SingleServer)
270+
271+
// Create a new context to be independent of ctx
272+
timeoutContext, _ := context.WithTimeout(context.Background(), time.Minute*5)
273+
go m.runSingleServerUpgradeProcess(timeoutContext, myPeer, mode)
271274
return nil
272275
}
273276

274277
// Check cluster health
275278
if mode.IsClusterMode() {
276279
if err := m.isClusterHealthy(ctx); err != nil {
277-
return maskAny(errors.Wrap(err, "Found unhealthy cluster"))
280+
return maskAny(errors.Wrap(err, "Cannot upgrade unhealthy cluster"))
278281
}
279282
}
280283

@@ -356,7 +359,7 @@ func (m *upgradeManager) StartDatabaseUpgrade(ctx context.Context) error {
356359
}
357360
}
358361

359-
m.log.Info().Msg("Applied special update procedure for 3.4.6")
362+
m.log.Info().Msg("Applied special upgrade procedure for 3.4.6")
360363
}
361364

362365
// Create upgrade plan
@@ -1163,31 +1166,33 @@ func (m *upgradeManager) finishUpgradePlan(ctx context.Context, plan UpgradePlan
11631166

11641167
// runSingleServerUpgradeProcess runs the entire upgrade process of a single server until it is finished.
11651168
func (m *upgradeManager) runSingleServerUpgradeProcess(ctx context.Context, myPeer *Peer, mode ServiceMode) {
1166-
// Unlock when we're done
1169+
// Cleanup when we're done
11671170
defer func() {
11681171
m.upgradeServerType = ""
11691172
m.updateNeeded = false
11701173
}()
11711174

1172-
if mode.IsSingleMode() {
1173-
// Restart the single server in auto-upgrade mode
1174-
m.log.Info().Msg("Upgrading single server")
1175-
m.upgradeServerType = ServerTypeSingle
1176-
m.updateNeeded = true
1177-
if err := m.upgradeManagerContext.RestartServer(ServerTypeSingle); err != nil {
1178-
m.log.Error().Err(err).Msg("Failed to restart single server")
1179-
return
1180-
}
1175+
if !mode.IsSingleMode() {
1176+
m.log.Info().Msg("Not in Single Server Mode, aborting.")
1177+
return
1178+
}
1179+
// Restart the single server in auto-upgrade mode
1180+
m.log.Info().Msg("Upgrading single server")
1181+
m.upgradeServerType = ServerTypeSingle
1182+
m.updateNeeded = true
1183+
if err := m.upgradeManagerContext.RestartServer(ServerTypeSingle); err != nil {
1184+
m.log.Error().Err(err).Msg("Failed to restart single server")
1185+
return
1186+
}
11811187

1182-
// Wait until single server restarted
1183-
if err := m.waitUntilUpgradeServerStarted(ctx); err != nil {
1184-
return
1185-
}
1188+
// Wait until single server restarted
1189+
if err := m.waitUntilUpgradeServerStarted(ctx); err != nil {
1190+
return
1191+
}
11861192

1187-
// Wait until all single servers respond
1188-
if err := m.waitUntil(ctx, m.areSingleServersResponding, "Single server is not yet responding: %v"); err != nil {
1189-
return
1190-
}
1193+
// Wait until all single servers respond
1194+
if err := m.waitUntil(ctx, m.areSingleServersResponding, "Single server is not yet responding: %v"); err != nil {
1195+
return
11911196
}
11921197

11931198
// We're done

0 commit comments

Comments
 (0)