The source code controlling the xapi startup procedure is contained within api.hg/ocaml/xapi/xapi.ml. The majority of the startup code is contained within the server_init function.
In the following sequence of steps, (both) denotes that the step is executed on both a pool master and a pool slave; (master) denotes that the step is only executed on a pool master; and (slave) denotes only on a slave.
Where function names are specified, no module name implies that the function is in the Xapi module.
(both) Parse command-line arguments
(both) Read config file
(both) Initing stunnel path
(both) Read log configuration file
(both) Print "server starting" message
(both) Parse inventory file
(both) Initialise local database
(both) Read pool secret
(both) Initialise licensing
(both) Output xapi version info to the log
(both) Check control domain
See check_control_domain. We check whether the UUID of dom0 is the same as that in the inventory.
(both) Set signal handlers
(both) Set up xenstore keys
(both) Initialise random number generator
(both) Run startup check
See startup_check. Check that xenstored, xenconsoled and blktapctrl processes are running.
(both) Register http handlers
(both) Register RPC callbacks
(both) Start listening on the Unix domain socket used for RPC.
(both) Start listening on the localhost Internet socket used for RPC.
(both) Start HA if configured
(both) Setup DB configuration
See setup_db_conf. Read from /etc/xensource/db.conf. Create a lock for each database connection. Set the database mode to indicate whether this is a master or a slave.
(master) Start up database engine
See start_database_engine. Create a new file if one does not already exist for each database connection (see Db_connections.maybe_create_new_db). Populate the in-memory cache from the connection containing the most recent generation of database (see Db_cache.DBCache.initialise_db_cache). Perform a garbage collection on the database in which records which are unreferenced are removed (see Db_gc.single_pass). Set all hosts to disabled, then signal the HA monitor thread that it can look at the database (see Xapi_ha.on_database_engine_ready).
(both) Bring up the management interface
(both) Register SR plugins
(both) Start periodic scheduler
See Xapi_periodic_scheduler.loop. Starts a new thread which watches a queue of functions to execute at some time in the future. (See "Register periodic functions" below.)
(slave) Log into the master (say hello to pool)
Keep trying attempt_pool_hello until successful.
(slave) Update in-memory cache
See Db_cache.DBCache.initialise_db_cache. Populate the in-memory cache, potentially from a newer version of the database from the master.
(both) Perform house-keeping on the internal database
See Dbsync.setup. This invokes Dbsync_slave.update_env on all hosts and Dbsync_master.update_env on the master. This largely involves updating the database to reflect current state and synchronising the configurations between hosts across a pool.
Executed on all hosts, Dbsync_slave.update_env does the following:
- Create a localhost record if doesn't already exist
- Record the hostname information in Xapi_globs.localhost_ref
- Load the host RRD
- Refresh host info fields (software version, etc)
- Record host free memory in database
- Copy license to database
- Create host CPU record
- Create domain 0 records
- Resynchronise host crashdumps
- Update VMs' states
- Remove any leaked dom0 block-attached VBDs
- Resynchronise bonded and VLAN PIF records with pool master
- Resynchronise PIF.currently_attached
- Check patch status (see Xapi_pool_patch.update_db)
In addition, Dbsync_master.update_env does the following
- Create root user
- Create pool record
- Set the master's IP in the database
- Refresh the console URLs in the database
- Reset all Halted VMs to a known good state
- Cancel running tasks
- Update the SM plugin table
- Recreate any missing VLAN records
- Create missing Host_metrics objects for all hosts in the pool
- Create a PBD and SR for the Tools ISO.
(master) Start database garbage collection thread
Start a thread to periodically garbage collect records with hanging references in the database.
(both) Check that current license is okay for pooling configuration
Raise a system alert if the license does not support pooling and yet there exist slaves in the database (or this is a slave).
(both) Set memory target for control domain
See set_domain0_memory_target. Set the dom0 memory target in engp:XenStore.
(both) Start message e-mailing thread
See Xapi_message.start_message_hook_thread. Starts a thread which executes /opt/xensource/libexec/mail-alarm for sending messages.
(both) Start heartbeat thread
See Db_gc.start_heartbeat_thread. Start heartbeat thread which periodically "tickles" the heartbeat.
(both) Synchronise HA state
See resynchronise_ha_state. If HA has been disabled on the pool while this host was offline but HA was previously enabled on it, then disable it locally. Alternatively, if HA has been enabled on the pool but this host is the master and has it disabled, then disable HA on the pool. If HA is enabled in the pool and this host is a slave and has it disabled, this is an inconsistent state, so switch to emergency mode.
(master) Start pool database backup thread
See Pool_db_backup.pool_db_backup_thread. Starts a thread to periodically flush the database to the slaves.
(master) Register database change notifier
See Xapi_event.register_hooks. Register Xapi_event.event_add as a callback for database events.
(both) Start monitoring thread
See Monitor.loop. On a new thread, periodically executes Monitor.do_monitor. This spits out database usage and CPU load information to the log (see Monitor_self.go), and updates the RRDs (see Monitor_rrds.update_rrds).
(both) Start database calls monitoring thread
(both) Start guest liveness monitoring thread
See Xapi_guest_agent.guest_metrics_liveness_thread. Starts a thread which monitors the liveness of guests.
(both) (Placeholder for touching a "ready" file)
Currently does nothing, but can cause a file to be touched if set in Xapi_globs.ready_file.
(master) Check that there are no other masters in the pool
See check_no_other_masters. Check that there are no other masters in the pool by asking them all what they think they are. If any other thinks that they are a master, then this host reverts to being a slave, and restarts.
(both) Register periodic functions
See Xapi_periodic_scheduler.register. Adds functions to the periodic event scheduler to flush files to disk; rotate log files; garbage collect network bridges; show that the periodic event scheduler is still running; and backup RRDs.
(both) Execute startup scripts
See startup_script. Executes /opt/xensource/libexec/xapi-startup-script.
(master) Execute scripts in the "master-scripts" directory with param "start"
See Xapi_pool_transition.run_external_scripts. Invoke each script in /etc/xensource/master.d/ with the parameter start.
(slave) Execute scripts in the "master-scripts" directory with param "stop"
See Xapi_pool_transition.run_external_scripts. Invoke each script in /etc/xensource/master.d/ with the parameter stop.
(master) Create networks
See Create_networks.create_networks_localhost. Creates a guest installer network, on which guests have a private, local IP address.
(both) Bring up physical NICs
See Xapi_pif.start_of_day_best_effort_bring_up. Try to bring up physical PIFs (by calling Xapi_pif.plug for each), in a best-effort fashion.
Xapi_pif.plug calls Xapi_network.attach which instantiate the network (i.e. bridge) associated with the PIF. This is achieved via Nm.bring_pif_up which calls the interface-reconfigure script with the "up" command unless the PIF is marked with currently_attached as true.
(both) Initialise storage
See Create_storage.create_storage_localhost. Creates PBDs for shared SRs.
(both) Start events thread
(master) Start SR scanning thread
See Xapi_sr.scanning_thread. Start a thread to scan SRs.
(master) Check / create templates
(both) (Placeholder for touching an "initialisation complete" file)
Currently does nothing, but can cause a file to be touched if set in Xapi_globs.init_complete.
(both) Establish version of tools VDI
See Xapi_pv_driver_version.get_latest_tools_vsn. Sets Xapi_globs.tools_version to the version of the currently-inserted XS tools ISO.
(slave) Fetch database backup from master
See Pool_db_backup.fetch_database_backup. Fetch the database from the master and flush it to each database connection.
(both) Plug unplugged PBDs
See plug_unplugged_pdbs. Calls Create_storage.plug_unplugged_pbds.
(master) Consider sending a master transition alert
If this node has just become a master then raise a system alert to spread this news.