<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FGridService</id>
	<title>OpenSimulator Internals/GridService - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FGridService"/>
	<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/GridService&amp;action=history"/>
	<updated>2026-08-04T15:31:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/GridService&amp;diff=30&amp;oldid=prev</id>
		<title>Jwbshaw: first</title>
		<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/GridService&amp;diff=30&amp;oldid=prev"/>
		<updated>2026-06-22T10:03:03Z</updated>

		<summary type="html">&lt;p&gt;first&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= OpenSimulator Internals/GridService =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
GridService is the region map. It handles region registration on simulator startup, deregistration on shutdown, and answers queries for region location and coordinates. It also maintains HyperGrid links to remote grids via HypergridLinker.&lt;br /&gt;
&lt;br /&gt;
GridService can be load-balanced -- it is stateless with respect to runtime state. All persistent data lives in the database.&lt;br /&gt;
&lt;br /&gt;
See [[OpenSimulator Internals/ROBUST Services]] for placement in the overall architecture.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Source Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Location&lt;br /&gt;
|-&lt;br /&gt;
| GridService.cs || OpenSim/Services/GridService/&lt;br /&gt;
|-&lt;br /&gt;
| HypergridLinker.cs || OpenSim/Services/GridService/&lt;br /&gt;
|-&lt;br /&gt;
| MySqlRegionData.cs || OpenSim/Data/MySQL/&lt;br /&gt;
|-&lt;br /&gt;
| GridServiceConnector.cs || OpenSim/Server/Handlers/Grid/&lt;br /&gt;
|-&lt;br /&gt;
| GridServerPostHandler.cs || OpenSim/Server/Handlers/Grid/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Robust.ini ===&lt;br /&gt;
&lt;br /&gt;
 [GridService]&lt;br /&gt;
 LocalServiceModule = &amp;quot;OpenSim.Services.GridService.dll:GridService&amp;quot;&lt;br /&gt;
 StorageProvider = &amp;quot;OpenSim.Data.MySQL.dll:MySqlRegionData&amp;quot;&lt;br /&gt;
 ConnectionString = &amp;quot;Data Source=localhost;Database=osimdev_robust;User ID=opensim;Password=xxx;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; Region name uniqueness&lt;br /&gt;
 AllowDuplicateNames = false&lt;br /&gt;
 &lt;br /&gt;
 ; Delete region record on clean shutdown, or just mark offline&lt;br /&gt;
 DeleteOnUnregister = true&lt;br /&gt;
 &lt;br /&gt;
 ; Optional: require token authentication for region registration&lt;br /&gt;
 ; AuthenticationService = &amp;quot;OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; HyperGrid&lt;br /&gt;
 HypergridLinker = true&lt;br /&gt;
 AllowHypergridMapSearch = false&lt;br /&gt;
 AssetService = &amp;quot;OpenSim.Services.AssetService.dll:AssetService&amp;quot;&lt;br /&gt;
 MapTileDirectory = &amp;quot;maptiles&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; Per-region flag overrides&lt;br /&gt;
 ; DefaultRegionFlags = DefaultRegion&lt;br /&gt;
 ; Region_RegionName = +DefaultRegion,-FallbackRegion&lt;br /&gt;
 ; Region_&amp;lt;UUID&amp;gt; = +DefaultRegion&lt;br /&gt;
&lt;br /&gt;
DeleteOnUnregister defaults true. If false, or if the region has the Persistent flag set, deregistration clears RegionOnline but keeps the record.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Initialisation Sequence ==&lt;br /&gt;
&lt;br /&gt;
# Loads storage provider from StorageProvider config -- runs MySQL migration &amp;quot;GridStore&amp;quot; on startup&lt;br /&gt;
# Reads DeleteOnUnregister, AllowDuplicateNames, AllowHypergridMapSearch from [GridService]&lt;br /&gt;
# Optionally loads AuthenticationService plugin if configured&lt;br /&gt;
# Registers console commands (suppressed if SuppressConsoleCommands = true)&lt;br /&gt;
# Calls SetExtraServiceURLs() -- reads SearchURL, MapTileURL, DestinationGuide, GatekeeperURI, GridName, GridNick, GridStatus, GridStatusRSS, ExportSupported, GatekeeperURIAlias into m_ExtraFeatures dictionary&lt;br /&gt;
# Creates HypergridLinker if HypergridLinker = true in config -- throws if HyperGrid config is missing&lt;br /&gt;
&lt;br /&gt;
Only the first GridService instance registers console commands and initialises HypergridLinker. Subsequent instances (e.g. local connector in simulator) skip this via m_RootInstance guard.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== HTTP Endpoint ==&lt;br /&gt;
&lt;br /&gt;
Single endpoint: POST /grid&lt;br /&gt;
&lt;br /&gt;
All operations use METHOD dispatch in the POST body. GridServiceConnector registers one handler -- GridServerPostHandler -- with auth.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! METHOD value !! Parameters !! Returns&lt;br /&gt;
|-&lt;br /&gt;
| register || SCOPEID, VERSIONMIN, VERSIONMAX, region key-value pairs || Success/Failure XML&lt;br /&gt;
|-&lt;br /&gt;
| deregister || REGIONID || Success/Failure XML&lt;br /&gt;
|-&lt;br /&gt;
| get_neighbours || SCOPEID, REGIONID || XML list of GridRegion key-value pairs&lt;br /&gt;
|-&lt;br /&gt;
| get_region_by_uuid || SCOPEID, REGIONID || XML GridRegion or null&lt;br /&gt;
|-&lt;br /&gt;
| get_region_by_position || SCOPEID, X, Y || XML GridRegion or null&lt;br /&gt;
|-&lt;br /&gt;
| get_region_by_name || SCOPEID, NAME || XML GridRegion or null&lt;br /&gt;
|-&lt;br /&gt;
| get_localregion_by_name || SCOPEID, NAME || XML GridRegion or null (no HG lookup)&lt;br /&gt;
|-&lt;br /&gt;
| get_regions_by_name || SCOPEID, NAME, MAX || XML list of GridRegion key-value pairs&lt;br /&gt;
|-&lt;br /&gt;
| get_region_range || SCOPEID, XMIN, XMAX, YMIN, YMAX || XML list of GridRegion key-value pairs&lt;br /&gt;
|-&lt;br /&gt;
| get_default_regions || SCOPEID || XML list of GridRegion key-value pairs&lt;br /&gt;
|-&lt;br /&gt;
| get_default_hypergrid_regions || SCOPEID || XML list of GridRegion key-value pairs&lt;br /&gt;
|-&lt;br /&gt;
| get_fallback_regions || SCOPEID, X, Y || XML list sorted by distance&lt;br /&gt;
|-&lt;br /&gt;
| get_online_regions || SCOPEID, X, Y, MC || XML list sorted by distance, capped at MC&lt;br /&gt;
|-&lt;br /&gt;
| get_hyperlinks || SCOPEID || XML list of HyperGrid link entries&lt;br /&gt;
|-&lt;br /&gt;
| get_region_flags || SCOPEID, REGIONID || integer flags value&lt;br /&gt;
|-&lt;br /&gt;
| get_grid_extra_features || (none) || XML key-value pairs from m_ExtraFeatures&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Protocol version negotiation on register: client sends VERSIONMIN/VERSIONMAX, server checks overlap with ProtocolVersions.ServerProtocolVersionMin/Max. No overlap = failure.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== RegisterRegion ==&lt;br /&gt;
&lt;br /&gt;
Validation sequence:&lt;br /&gt;
&lt;br /&gt;
# RegionID must not be zero UUID&lt;br /&gt;
# RegionLocY must be above Constants.MaximumRegionSize (coordinates below this are reserved for HG links)&lt;br /&gt;
# Overlap check: queries database for any region occupying the bounding box -- fails if more than one overlap, or if one overlap with a different RegionID&lt;br /&gt;
# Reservation check: if existing record has Reservation flag set, rejects if PrincipalID is zero UUID; otherwise treats as authentication request&lt;br /&gt;
# Authentication check: if Authenticate flag set, verifies token via AuthenticationService (30 second window)&lt;br /&gt;
# Duplicate name check: if AllowDuplicateNames = false, rejects if another region with same name and different RegionID exists&lt;br /&gt;
# Move check: if region previously registered at different coordinates, checks NoMove and LockedOut flags before deleting old record&lt;br /&gt;
# Applies DefaultRegionFlags from config, then per-region overrides by name or UUID&lt;br /&gt;
# Sets RegionOnline flag, stores record with last_seen timestamp&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== DeregisterRegion ==&lt;br /&gt;
&lt;br /&gt;
If DeleteOnUnregister = false OR region has Persistent flag:&lt;br /&gt;
- Clears RegionOnline flag, updates last_seen, stores record&lt;br /&gt;
&lt;br /&gt;
Otherwise:&lt;br /&gt;
- Deletes record from database&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== GetNeighbours ==&lt;br /&gt;
&lt;br /&gt;
Queries database for all regions within a bounding box of (posX-1, posY-1) to (posX+sizeX+1, posY+sizeY+1). Excludes the requesting region itself. Excludes any region with the Hyperlink flag set -- HG links are never returned as neighbours.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Region Lookup Methods ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Method !! Behaviour&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionByUUID || Direct UUID lookup&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionByHandle || Extracts X/Y from 64-bit handle, delegates to GetRegionByPosition&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionByPosition || Snaps coordinates to region grid, queries database&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionByName || Parses RegionURI; local grid: exact name match or default region; foreign grid: HG link attempt if AllowHypergridMapSearch = true&lt;br /&gt;
|-&lt;br /&gt;
| GetLocalRegionByName || Same as GetRegionByName but returns null for foreign grid URIs -- no HG lookup&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionsByName || Partial name match; local grid returns sorted list; foreign grid attempts HG link if AllowHypergridMapSearch = true&lt;br /&gt;
|-&lt;br /&gt;
| GetRegionRange || Bounding box query, snapped to region grid&lt;br /&gt;
|-&lt;br /&gt;
| GetDefaultRegions || Regions with DefaultRegion flag set and RegionOnline&lt;br /&gt;
|-&lt;br /&gt;
| GetDefaultHypergridRegions || Regions with DefaultHGRegion flag, then appends normal defaults&lt;br /&gt;
|-&lt;br /&gt;
| GetFallbackRegions || Regions with FallbackRegion flag, sorted by distance to given coordinates, excludes Hyperlink and offline regions&lt;br /&gt;
|-&lt;br /&gt;
| GetOnlineRegions || All online regions sorted by distance, capped at maxCount, excludes Hyperlink regions&lt;br /&gt;
|-&lt;br /&gt;
| GetHyperlinks || Regions with Hyperlink flag and RegionOnline&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Region Flags ==&lt;br /&gt;
&lt;br /&gt;
Flags are stored as an integer bitmask in the regions table. Key flags used by GridService:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Flag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| RegionOnline || Set on register, cleared on deregister (if not deleted)&lt;br /&gt;
|-&lt;br /&gt;
| Persistent || Prevents deletion on deregister -- record kept with RegionOnline cleared&lt;br /&gt;
|-&lt;br /&gt;
| DefaultRegion || Returned by GetDefaultRegions -- login destination if no other target&lt;br /&gt;
|-&lt;br /&gt;
| DefaultHGRegion || Returned by GetDefaultHypergridRegions -- HyperGrid entry point&lt;br /&gt;
|-&lt;br /&gt;
| FallbackRegion || Returned by GetFallbackRegions -- used when teleport target is unavailable&lt;br /&gt;
|-&lt;br /&gt;
| Hyperlink || Marks a HyperGrid link entry -- excluded from neighbours, returned by GetHyperlinks&lt;br /&gt;
|-&lt;br /&gt;
| NoDirectLogin || Set on HyperGrid link entries -- prevents direct login to linked region&lt;br /&gt;
|-&lt;br /&gt;
| Reservation || Holds a coordinate for a specific PrincipalID -- blocks other registrations&lt;br /&gt;
|-&lt;br /&gt;
| Authenticate || Requires token authentication on registration&lt;br /&gt;
|-&lt;br /&gt;
| NoMove || Prevents region from re-registering at different coordinates&lt;br /&gt;
|-&lt;br /&gt;
| LockedOut || Prevents registration entirely&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per-region flags can be set in Robust.ini:&lt;br /&gt;
&lt;br /&gt;
 Region_RegionName = +DefaultRegion,-FallbackRegion&lt;br /&gt;
 Region_&amp;lt;UUID&amp;gt; = +DefaultRegion&lt;br /&gt;
&lt;br /&gt;
Flags are applied after DefaultRegionFlags on every registration.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== HypergridLinker ==&lt;br /&gt;
&lt;br /&gt;
HypergridLinker handles linking to remote grids. It is created by GridService if HypergridLinker = true in config.&lt;br /&gt;
&lt;br /&gt;
Key behaviours:&lt;br /&gt;
&lt;br /&gt;
* LinkRegion() contacts the remote grid&amp;#039;s Gatekeeper via GatekeeperServiceConnector to obtain the remote region&amp;#039;s UUID, handle, size, and map image&lt;br /&gt;
* Linked regions are stored in the regions table with Hyperlink + NoDirectLogin + RegionOnline flags&lt;br /&gt;
* IsLocalGrid() checks whether a URI belongs to this grid -- prevents hyperlinking to local regions&lt;br /&gt;
* TryUnlinkRegion() removes the hyperlink record from the database&lt;br /&gt;
* Map tiles for linked regions are stored in the MapTileDirectory (default: maptiles/)&lt;br /&gt;
* The 4096-region distance check is disabled in current code -- distance enforcement moved to EntityTransferModule&lt;br /&gt;
&lt;br /&gt;
HypergridLinker is disabled if HyperGrid config section is missing -- throws on construction.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Database Layer ==&lt;br /&gt;
&lt;br /&gt;
MySqlRegionData uses realm &amp;quot;regions&amp;quot; by default. Key behaviours:&lt;br /&gt;
&lt;br /&gt;
* Get(posX, posY) queries within a bounding box of posX-MaximumRegionSize to posX -- handles varregions by finding which region contains the point&lt;br /&gt;
* Get(startX, startY, endX, endY) expands the query by MaximumRegionSize on the lower bounds to catch varregions that start outside the box but overlap it&lt;br /&gt;
* Store() does UPDATE first, INSERT on failure (upsert pattern)&lt;br /&gt;
* GetDefaultRegions, GetFallbackRegions, GetHyperlinks, GetOnlineRegions all use bitwise flag queries: (flags &amp;amp; value) &amp;lt;&amp;gt; 0&lt;br /&gt;
* Region name is truncated to 128 characters on store&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Extra Features ==&lt;br /&gt;
&lt;br /&gt;
GetExtraFeatures() returns m_ExtraFeatures, a static dictionary populated at startup from config. Used by SimulatorFeaturesModule to push grid URLs to viewers via OpenSimExtras. Keys include:&lt;br /&gt;
&lt;br /&gt;
* search-server-url&lt;br /&gt;
* map-server-url&lt;br /&gt;
* destination-guide-url&lt;br /&gt;
* GridURL (GatekeeperURI)&lt;br /&gt;
* GridName&lt;br /&gt;
* GridNick&lt;br /&gt;
* GridStatus&lt;br /&gt;
* GridStatusRSS&lt;br /&gt;
* ExportSupported&lt;br /&gt;
* GridURLAlias&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Console Commands ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command !! Usage !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| show regions || show regions || Lists all regions with name, UUID, position, size, flags&lt;br /&gt;
|-&lt;br /&gt;
| show region name || show region name &amp;lt;name&amp;gt; || Full detail for named region&lt;br /&gt;
|-&lt;br /&gt;
| show region at || show region at &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; || Full detail for region at grid coordinates&lt;br /&gt;
|-&lt;br /&gt;
| show grid size || show grid size || Approximate grid area in km², excludes HG links&lt;br /&gt;
|-&lt;br /&gt;
| deregister region id || deregister region id &amp;lt;uuid&amp;gt;+ || Manual deregister, accepts multiple UUIDs&lt;br /&gt;
|-&lt;br /&gt;
| set region flags || set region flags &amp;lt;name&amp;gt; &amp;lt;flags&amp;gt; || Modify flags, e.g. +DefaultRegion,-FallbackRegion&lt;br /&gt;
|-&lt;br /&gt;
| link-region || link-region &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;ServerURI&amp;gt; [name] || Create HG link (HypergridLinker)&lt;br /&gt;
|-&lt;br /&gt;
| unlink-region || unlink-region &amp;lt;name&amp;gt; || Remove HG link (HypergridLinker)&lt;br /&gt;
|-&lt;br /&gt;
| link-mapping || link-mapping [&amp;lt;x&amp;gt; &amp;lt;y&amp;gt;] || Set auto-mapping origin for HG links&lt;br /&gt;
|-&lt;br /&gt;
| show hyperlinks || show hyperlinks || List all HG link entries&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenSimulator Internals/ROBUST Services]]&lt;br /&gt;
* [[OpenSimulator Internals/Connector Architecture]]&lt;br /&gt;
* [[OpenSimulator Internals/Data Dictionaries]]&lt;/div&gt;</summary>
		<author><name>Jwbshaw</name></author>
	</entry>
</feed>