Skip to content

Commit c28a2a8

Browse files
committed
Wait for migrations before starting scheduler
During bosh create-env, the scheduler process may start before the director has completed running migrations, causing 'relation does not exist' errors when the scheduler tries to query the director_attributes table. This adds migration waiting to the scheduler binary, following the same pattern used by sync_dns_scheduler and metrics_collector. The scheduler now: 1. Loads only config initially (not full director with models) 2. Calls DBMigrator.ensure_migrated! to wait for migrations 3. Then loads full director and starts the scheduler Also adds scheduler_logger method to Config for consistent logging.
1 parent 6cded16 commit c28a2a8

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

src/bosh-director/bin/bosh-director-scheduler

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#!/usr/bin/env ruby
22

3-
require 'bosh/director'
4-
require 'bosh/director/scheduler'
3+
require 'optparse'
4+
require 'bosh/director/config'
5+
require 'db_migrator'
56

67
config_file = ::File.expand_path('../../config/bosh-director.yml', __FILE__)
78

@@ -14,6 +15,20 @@ end
1415
opts.parse!(ARGV.dup)
1516

1617
config = Bosh::Director::Config.load_file(config_file)
18+
19+
# Wait for migrations to complete before loading models and starting scheduler
20+
# This prevents race conditions during bosh create-env when director migrations
21+
# may still be running
22+
begin
23+
DBMigrator.new(config.db).ensure_migrated!
24+
rescue DBMigrator::MigrationsNotCurrentError => e
25+
config.scheduler_logger.error("Scheduler start failed: #{e.message}")
26+
raise e
27+
end
28+
29+
require 'bosh/director'
30+
require 'bosh/director/scheduler'
31+
1732
Bosh::Director::App.new(config)
1833

1934
scheduler = Bosh::Director::Scheduler.new(config.scheduled_jobs)

src/bosh-director/lib/bosh/director/config.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,14 @@ def sync_dns_scheduler_logger
542542
logger
543543
end
544544

545+
def scheduler_logger
546+
logger = Logging::Logger.new('Scheduler')
547+
logging_config = hash.fetch('logging', {})
548+
logger.add_appenders(Logging.appenders.stdout('SchedulerIO', layout: ThreadFormatter.layout))
549+
logger.level = Logging.levelify(logging_config.fetch('level', 'debug'))
550+
logger
551+
end
552+
545553
def metrics_server_logger
546554
logger = Logging::Logger.new('MetricsServer')
547555
logging_config = hash.fetch('logging', {})

0 commit comments

Comments
 (0)