mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2024-12-19 05:37:53 +00:00
Implement waitToKill, keep RESIN_OVERRIDE_LOCK, and changelog for update strategies
This commit is contained in:
parent
13dce75a21
commit
1d6811a423
@ -1,3 +1,5 @@
|
||||
* Refactor the still undocumented special env vars into RESIN_SUPERVISOR_ [Pablo]
|
||||
* Implement several update strategies (kill before download, 0-downtime) [Pablo]
|
||||
* Fix the error that comes up when no ip addresses are returned by gosuper [Praneeth]
|
||||
* Switched to docker-progress for pull progress. [Page]
|
||||
* Fix semver versioning in tcp-ping endpoint. [Praneeth]
|
||||
|
@ -250,6 +250,10 @@ lockPath = (app) ->
|
||||
appId = app.appId ? app
|
||||
return "/mnt/root/resin-data/#{appId}/resin-updates.lock"
|
||||
|
||||
killmePath = (app) ->
|
||||
appId = app.appId ? app
|
||||
return "/mnt/root/resin-data/#{appId}/resin-kill-me"
|
||||
|
||||
# At boot, all apps should be unlocked *before* start to prevent a deadlock
|
||||
application.unlockAndStart = unlockAndStart = (app) ->
|
||||
lockFile.unlockAsync(lockPath(app))
|
||||
@ -299,6 +303,7 @@ apiPollInterval = (val) ->
|
||||
application.poll()
|
||||
|
||||
specialActionEnvVars =
|
||||
'RESIN_OVERRIDE_LOCK': null # This one is in use, so we keep backwards comp.
|
||||
'RESIN_SUPERVISOR_UPDATE_STRATEGY': null
|
||||
'RESIN_SUPERVISOR_HANDOVER_TIMEOUT': null
|
||||
'RESIN_SUPERVISOR_OVERRIDE_LOCK': null
|
||||
@ -333,9 +338,20 @@ selectAndKill = (appId) ->
|
||||
throw new Error('App not found')
|
||||
kill(app)
|
||||
|
||||
# Wait for app to signal it's ready to die, or timeout to complete (if it is defined and not-empty)
|
||||
waitToKill = (app, timeout) ->
|
||||
# TO-DO
|
||||
# Wait for app to signal it's ready to die, or timeout to complete (if it is defined and not-empty)
|
||||
startTime = Date.now()
|
||||
pollInterval = 100
|
||||
timeout = parseInt(timeout)
|
||||
checkFileOrTimeout = ->
|
||||
fs.statAsync(killmePath(app))
|
||||
.catch (err) ->
|
||||
throw err if isNaN(timeout) or (Date.now() - startTime) < timeout
|
||||
.then ->
|
||||
fs.unlinkAsync(killmePath(app)).catch(_.noop)
|
||||
checkFileOrTimeout()
|
||||
.catch ->
|
||||
Promise.delay(pollInterval).then(checkFileOrTimeout)
|
||||
|
||||
UPDATE_IDLE = 0
|
||||
UPDATE_UPDATING = 1
|
||||
@ -528,7 +544,7 @@ application.update = update = (force) ->
|
||||
app = remoteApps[appId]
|
||||
# Restore the complete environment so that it's persisted in the DB
|
||||
app.env = JSON.stringify(remoteAppEnvs[appId])
|
||||
forceThisApp = remoteAppEnvs[appId]['RESIN_SUPERVISOR_OVERRIDE_LOCK'] == '1'
|
||||
forceThisApp = remoteAppEnvs[appId]['RESIN_SUPERVISOR_OVERRIDE_LOCK'] == '1' || remoteAppEnvs[appId]['RESIN_OVERRIDE_LOCK'] == '1'
|
||||
strategy = remoteAppEnvs[appId]['RESIN_SUPERVISOR_UPDATE_STRATEGY']
|
||||
timeout = remoteAppEnvs[appId]['RESIN_SUPERVISOR_HANDOVER_TIMEOUT']
|
||||
updateUsingStrategy(strategy, apps[appId], app, needsDownload, force || forceThisApp, timeout)
|
||||
|
Loading…
Reference in New Issue
Block a user