Jump to content

OpenSimulator Internals/Code Map: Difference between revisions

From Open Simulator Technical Help
Jwbshaw (talk | contribs)
first
 
Jwbshaw (talk | contribs)
add
Line 1: Line 1:
= OpenSimulator Internals/Code Map =
= OpenSimulator Internals/Code Map/ROBUST =


== Overview ==
== Overview ==


This page maps the OpenSimulator codebase from the top down. Each section links to a drill-down page covering that component in detail.
ROBUST is the grid services process. It reads configuration, starts HTTP listeners, loads service connector plugins, then sits waiting for incoming HTTP requests from simulators.


Both ROBUST and OpenSim.exe are built from the same source tree and share the same DLL output. The difference is which entry point is called and which config file is loaded.
----


Source repository: https://github.com/opensim/opensim
=== Entry Point ===
 
OpenSim/Server/ServerMain.cs -- class OpenSimServer, Main()
 
Sequence:
 
# Sets culture and .NET HTTP client defaults:
#* ServicePointManager.DefaultConnectionLimit = 64
#* ServicePointManager.MaxServicePointIdleTime = 30000
#* Expect100Continue = false
#* UseNagleAlgorithm = false
#* ServerCertificateValidationCallback = ValidateServerCertificate
# Creates HttpServerBase("R.O.B.U.S.T.", args) -- config is loaded here (see Config Loading below)
# Reads [Startup] section -- throws if missing
# Reads DnsTimeout (default 30000ms), NoVerifyCertChain, NoVerifyCertHostname from [Startup]
# Calls WebUtil.SetupHTTPClients() with cert settings and max 32 connections
# Reads connector list -- merges ServiceConnectors from [Startup] with all keys from [ServiceList]
# Copies System.Drawing.Common.dll for current platform (Windows vs Linux)
# Loops through connectors -- parses configName@port/dll:class format, loads each (see Service Connector Loading below)
# Special case: LLLoginServiceInConnector gets an IndexPHPHandler added to its HTTP server before loading
# Prints robuststartuplogo.txt to console if present
# Creates PluginLoader
# Calls m_Server.Run() -- enters main loop
# On exit: m_Server.Shutdown(), Util.StopThreadPool(), Environment.Exit()


----
----


* [[OpenSimulator Internals/Code Map/ROBUST]] -- Grid services process
=== Config Loading ===
* [[OpenSimulator Internals/Code Map/OpenSim]] -- Region simulator process
 
* [[OpenSimulator Internals/Code Map/Shared]] -- Code used by both
OpenSim/Server/Base/HttpServerBase.cs
OpenSim/Server/Base/ServicesServerBase.cs
 
HttpServerBase constructor handles config loading. Layers are applied in order, each overriding the previous:
 
# Command line args parsed (-i ini file, -c console, -l logfile, -p prompt, -g logconfig)
# Ini file loaded -- defaults to Robust.ini, derived from executable name. Can be a local file or remote HTTP/HTTPS URL.
# Include-* keys scanned -- additional ini files merged in. Supports wildcards and URLs. Loop repeats until no new includes found.
# Environment variables merged in
# Command line args merged on top -- command line always wins
# Variable substitution run (ReplaceKeyValues) -- expands ${Section|Key} references
# ReadConfig() called -- reads [Network] section for port and SSL settings
 
[Network] minimum requirements:
* port -- required, no default, ROBUST will not start without it
* https_main, https_listener, https_external -- optional SSL flags
* cert_path, cert_pass -- required if SSL enabled
* ConsolePort -- optional remote console port
 
----
 
=== HTTP Servers ===
 
OpenSim/Server/Base/HttpServerBase.cs
 
* Main HTTP server created on port from [Network]
* Optional second SSL listener if https_listener = true
* All servers started before connectors are loaded
* Additional ports are created on demand via MainServer.GetHttpServer(port) during connector loading
* Handlers register into a running server during connector construction
 
----
 
=== Service Connector Loading ===
 
OpenSim/Server/Base/ServerUtils.cs -- LoadPlugin()
 
Connector string format:
 
configName@port/OpenSim.Server.Handlers.dll:ClassName
 
Parsing:
* Split on / -- left side is optional configName@port, right side is dll:class
* Split left side on @ -- if two parts, first is configName, second is port
* If port specified: get or create HTTP server for that port via MainServer.GetHttpServer()
* If no port: use MainServer.Instance (main port)
 
Loading:
* LoadPlugin() tries constructor with (IConfigSource, IHttpServer, configName) first
* Falls back to (IConfigSource, IHttpServer) if that fails
* Loaded connectors added to m_ServiceConnectors list
* Failed loads logged as errors but do not stop startup
 
See [[OpenSimulator Internals/Connector Architecture]] for the full connector pattern.
 
----
 
=== Main Loop ===
 
OpenSim/Server/Base/ServicesServerBase.cs -- Run()
 
* Watchdog and MemoryWatchdog threads enabled
* Sits in a console prompt loop
* Shutdown signal (quit/shutdown command or SIGTERM) triggers:
** m_Server.Shutdown()
** Util.StopThreadPool()
** Environment.Exit()
 
----
 
=== Service Implementations ===
 
Each service connector loaded from [ServiceList] handles one service domain. See [[OpenSimulator Internals/ROBUST Services]] for the full list.
 
{| class="wikitable"
! Service !! Implementation !! Handler
|-
| AssetService || OpenSim/Services/AssetService/AssetService.cs || OpenSim/Server/Handlers/Asset/
|-
| GridService || OpenSim/Services/GridService/GridService.cs || OpenSim/Server/Handlers/Grid/
|-
| UserAccountService || OpenSim/Services/UserAccountService/UserAccountService.cs || OpenSim/Server/Handlers/UserAccounts/
|-
| PresenceService || OpenSim/Services/PresenceService/PresenceService.cs || OpenSim/Server/Handlers/Presence/
|-
| InventoryService || OpenSim/Services/InventoryService/XInventoryService.cs || OpenSim/Server/Handlers/Inventory/
|-
| AuthenticationService || OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs || OpenSim/Server/Handlers/Authentication/
|-
| LoginService || OpenSim/Services/LLLoginService/LLLoginService.cs || OpenSim/Server/Handlers/Login/
|-
| GatekeeperService || OpenSim/Services/HypergridService/GatekeeperService.cs || OpenSim/Server/Handlers/Hypergrid/
|-
| UserAgentService || OpenSim/Services/HypergridService/UserAgentService.cs || OpenSim/Server/Handlers/Hypergrid/
|}
 
See [[OpenSimulator Internals/Code Map/ROBUST/GridService RegisterRegion]] for a detailed trace of GridService.RegisterRegion() and DeregisterRegion().


----
----
Line 19: Line 138:
== See Also ==
== See Also ==


* [[OpenSimulator Internals/Code Map]]
* [[OpenSimulator Internals/Reading the Code]]
* [[OpenSimulator Internals/Reading the Code]]
* [[OpenSimulator Internals/Architecture Overview]]
* [[OpenSimulator Internals/ROBUST Services]]
* [[OpenSimulator Internals/Connector Architecture]]
* [[OpenSimulator Internals/Connector Architecture]]

Revision as of 11:50, 7 July 2026

OpenSimulator Internals/Code Map/ROBUST

Overview

ROBUST is the grid services process. It reads configuration, starts HTTP listeners, loads service connector plugins, then sits waiting for incoming HTTP requests from simulators.


Entry Point

OpenSim/Server/ServerMain.cs -- class OpenSimServer, Main()

Sequence:

  1. Sets culture and .NET HTTP client defaults:
    • ServicePointManager.DefaultConnectionLimit = 64
    • ServicePointManager.MaxServicePointIdleTime = 30000
    • Expect100Continue = false
    • UseNagleAlgorithm = false
    • ServerCertificateValidationCallback = ValidateServerCertificate
  2. Creates HttpServerBase("R.O.B.U.S.T.", args) -- config is loaded here (see Config Loading below)
  3. Reads [Startup] section -- throws if missing
  4. Reads DnsTimeout (default 30000ms), NoVerifyCertChain, NoVerifyCertHostname from [Startup]
  5. Calls WebUtil.SetupHTTPClients() with cert settings and max 32 connections
  6. Reads connector list -- merges ServiceConnectors from [Startup] with all keys from [ServiceList]
  7. Copies System.Drawing.Common.dll for current platform (Windows vs Linux)
  8. Loops through connectors -- parses configName@port/dll:class format, loads each (see Service Connector Loading below)
  9. Special case: LLLoginServiceInConnector gets an IndexPHPHandler added to its HTTP server before loading
  10. Prints robuststartuplogo.txt to console if present
  11. Creates PluginLoader
  12. Calls m_Server.Run() -- enters main loop
  13. On exit: m_Server.Shutdown(), Util.StopThreadPool(), Environment.Exit()

Config Loading

OpenSim/Server/Base/HttpServerBase.cs
OpenSim/Server/Base/ServicesServerBase.cs

HttpServerBase constructor handles config loading. Layers are applied in order, each overriding the previous:

  1. Command line args parsed (-i ini file, -c console, -l logfile, -p prompt, -g logconfig)
  2. Ini file loaded -- defaults to Robust.ini, derived from executable name. Can be a local file or remote HTTP/HTTPS URL.
  3. Include-* keys scanned -- additional ini files merged in. Supports wildcards and URLs. Loop repeats until no new includes found.
  4. Environment variables merged in
  5. Command line args merged on top -- command line always wins
  6. Variable substitution run (ReplaceKeyValues) -- expands ${Section|Key} references
  7. ReadConfig() called -- reads [Network] section for port and SSL settings

[Network] minimum requirements:

  • port -- required, no default, ROBUST will not start without it
  • https_main, https_listener, https_external -- optional SSL flags
  • cert_path, cert_pass -- required if SSL enabled
  • ConsolePort -- optional remote console port

HTTP Servers

OpenSim/Server/Base/HttpServerBase.cs
  • Main HTTP server created on port from [Network]
  • Optional second SSL listener if https_listener = true
  • All servers started before connectors are loaded
  • Additional ports are created on demand via MainServer.GetHttpServer(port) during connector loading
  • Handlers register into a running server during connector construction

Service Connector Loading

OpenSim/Server/Base/ServerUtils.cs -- LoadPlugin()

Connector string format:

configName@port/OpenSim.Server.Handlers.dll:ClassName

Parsing:

  • Split on / -- left side is optional configName@port, right side is dll:class
  • Split left side on @ -- if two parts, first is configName, second is port
  • If port specified: get or create HTTP server for that port via MainServer.GetHttpServer()
  • If no port: use MainServer.Instance (main port)

Loading:

  • LoadPlugin() tries constructor with (IConfigSource, IHttpServer, configName) first
  • Falls back to (IConfigSource, IHttpServer) if that fails
  • Loaded connectors added to m_ServiceConnectors list
  • Failed loads logged as errors but do not stop startup

See OpenSimulator Internals/Connector Architecture for the full connector pattern.


Main Loop

OpenSim/Server/Base/ServicesServerBase.cs -- Run()
  • Watchdog and MemoryWatchdog threads enabled
  • Sits in a console prompt loop
  • Shutdown signal (quit/shutdown command or SIGTERM) triggers:
    • m_Server.Shutdown()
    • Util.StopThreadPool()
    • Environment.Exit()

Service Implementations

Each service connector loaded from [ServiceList] handles one service domain. See OpenSimulator Internals/ROBUST Services for the full list.

Service Implementation Handler
AssetService OpenSim/Services/AssetService/AssetService.cs OpenSim/Server/Handlers/Asset/
GridService OpenSim/Services/GridService/GridService.cs OpenSim/Server/Handlers/Grid/
UserAccountService OpenSim/Services/UserAccountService/UserAccountService.cs OpenSim/Server/Handlers/UserAccounts/
PresenceService OpenSim/Services/PresenceService/PresenceService.cs OpenSim/Server/Handlers/Presence/
InventoryService OpenSim/Services/InventoryService/XInventoryService.cs OpenSim/Server/Handlers/Inventory/
AuthenticationService OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs OpenSim/Server/Handlers/Authentication/
LoginService OpenSim/Services/LLLoginService/LLLoginService.cs OpenSim/Server/Handlers/Login/
GatekeeperService OpenSim/Services/HypergridService/GatekeeperService.cs OpenSim/Server/Handlers/Hypergrid/
UserAgentService OpenSim/Services/HypergridService/UserAgentService.cs OpenSim/Server/Handlers/Hypergrid/

See OpenSimulator Internals/Code Map/ROBUST/GridService RegisterRegion for a detailed trace of GridService.RegisterRegion() and DeregisterRegion().


See Also