diff options
Diffstat (limited to 'OpenSim/Region/DataSnapshot/DataSnapshotManager.cs')
-rw-r--r-- | OpenSim/Region/DataSnapshot/DataSnapshotManager.cs | 168 |
1 files changed, 96 insertions, 72 deletions
diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs index 5540656..5e62f23 100644 --- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs +++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs | |||
@@ -35,15 +35,20 @@ using System.Xml; | |||
35 | using log4net; | 35 | using log4net; |
36 | using Nini.Config; | 36 | using Nini.Config; |
37 | using OpenMetaverse; | 37 | using OpenMetaverse; |
38 | using Mono.Addins; | ||
38 | using OpenSim.Framework; | 39 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Communications; | 40 | using OpenSim.Framework.Communications; |
40 | using OpenSim.Region.DataSnapshot.Interfaces; | 41 | using OpenSim.Region.DataSnapshot.Interfaces; |
41 | using OpenSim.Region.Framework.Interfaces; | 42 | using OpenSim.Region.Framework.Interfaces; |
42 | using OpenSim.Region.Framework.Scenes; | 43 | using OpenSim.Region.Framework.Scenes; |
43 | 44 | ||
45 | [assembly: Addin("DataSnapshot", "0.1")] | ||
46 | [assembly: AddinDependency("OpenSim", "0.5")] | ||
47 | |||
44 | namespace OpenSim.Region.DataSnapshot | 48 | namespace OpenSim.Region.DataSnapshot |
45 | { | 49 | { |
46 | public class DataSnapshotManager : IRegionModule, IDataSnapshot | 50 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DataSnapshotManager")] |
51 | public class DataSnapshotManager : ISharedRegionModule, IDataSnapshot | ||
47 | { | 52 | { |
48 | #region Class members | 53 | #region Class members |
49 | //Information from config | 54 | //Information from config |
@@ -67,6 +72,7 @@ namespace OpenSim.Region.DataSnapshot | |||
67 | public string m_listener_port = ConfigSettings.DefaultRegionHttpPort.ToString(); | 72 | public string m_listener_port = ConfigSettings.DefaultRegionHttpPort.ToString(); |
68 | public string m_hostname = "127.0.0.1"; | 73 | public string m_hostname = "127.0.0.1"; |
69 | private UUID m_Secret = UUID.Random(); | 74 | private UUID m_Secret = UUID.Random(); |
75 | private bool m_servicesNotified = false; | ||
70 | 76 | ||
71 | //Update timers | 77 | //Update timers |
72 | private int m_period = 20; // in seconds | 78 | private int m_period = 20; // in seconds |
@@ -93,9 +99,9 @@ namespace OpenSim.Region.DataSnapshot | |||
93 | 99 | ||
94 | #endregion | 100 | #endregion |
95 | 101 | ||
96 | #region IRegionModule | 102 | #region Region Module interface |
97 | 103 | ||
98 | public void Initialise(Scene scene, IConfigSource config) | 104 | public void Initialise(IConfigSource config) |
99 | { | 105 | { |
100 | if (!m_configLoaded) | 106 | if (!m_configLoaded) |
101 | { | 107 | { |
@@ -133,82 +139,128 @@ namespace OpenSim.Region.DataSnapshot | |||
133 | m_enabled = false; | 139 | m_enabled = false; |
134 | return; | 140 | return; |
135 | } | 141 | } |
136 | } | ||
137 | 142 | ||
138 | if (m_enabled) | 143 | if (m_enabled) |
139 | { | 144 | m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname); |
140 | //Hand it the first scene, assuming that all scenes have the same BaseHTTPServer | 145 | } |
141 | new DataRequestHandler(scene, this); | ||
142 | 146 | ||
143 | m_hostname = scene.RegionInfo.ExternalHostName; | 147 | } |
144 | m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname); | ||
145 | 148 | ||
146 | MakeEverythingStale(); | 149 | } |
147 | 150 | ||
148 | if (m_dataServices != "" && m_dataServices != "noservices") | 151 | public void AddRegion(Scene scene) |
149 | NotifyDataServices(m_dataServices, "online"); | 152 | { |
150 | } | 153 | if (!m_enabled) |
151 | } | 154 | return; |
152 | 155 | ||
153 | if (m_enabled) | 156 | m_log.DebugFormat("[DATASNAPSHOT]: Module added to Scene {0}.", scene.RegionInfo.RegionName); |
154 | { | ||
155 | m_log.Info("[DATASNAPSHOT]: Scene added to module."); | ||
156 | 157 | ||
157 | m_snapStore.AddScene(scene); | 158 | m_snapStore.AddScene(scene); |
158 | m_scenes.Add(scene); | 159 | m_scenes.Add(scene); |
159 | 160 | ||
160 | Assembly currentasm = Assembly.GetExecutingAssembly(); | 161 | Assembly currentasm = Assembly.GetExecutingAssembly(); |
161 | 162 | ||
162 | foreach (Type pluginType in currentasm.GetTypes()) | 163 | foreach (Type pluginType in currentasm.GetTypes()) |
164 | { | ||
165 | if (pluginType.IsPublic) | ||
163 | { | 166 | { |
164 | if (pluginType.IsPublic) | 167 | if (!pluginType.IsAbstract) |
165 | { | 168 | { |
166 | if (!pluginType.IsAbstract) | 169 | if (pluginType.GetInterface("IDataSnapshotProvider") != null) |
167 | { | 170 | { |
168 | if (pluginType.GetInterface("IDataSnapshotProvider") != null) | 171 | IDataSnapshotProvider module = (IDataSnapshotProvider)Activator.CreateInstance(pluginType); |
169 | { | 172 | module.Initialize(scene, this); |
170 | IDataSnapshotProvider module = (IDataSnapshotProvider)Activator.CreateInstance(pluginType); | 173 | module.OnStale += MarkDataStale; |
171 | module.Initialize(scene, this); | ||
172 | module.OnStale += MarkDataStale; | ||
173 | 174 | ||
174 | m_dataproviders.Add(module); | 175 | m_dataproviders.Add(module); |
175 | m_snapStore.AddProvider(module); | 176 | m_snapStore.AddProvider(module); |
176 | 177 | ||
177 | m_log.Info("[DATASNAPSHOT]: Added new data provider type: " + pluginType.Name); | 178 | m_log.Debug("[DATASNAPSHOT]: Added new data provider type: " + pluginType.Name); |
178 | } | ||
179 | } | 179 | } |
180 | } | 180 | } |
181 | } | 181 | } |
182 | } | ||
183 | |||
184 | // Must be done here because on shared modules, PostInitialise() will run | ||
185 | // BEFORE any scenes are registered. There is no "all scenes have been loaded" | ||
186 | // kind of callback because scenes may be created dynamically, so we cannot | ||
187 | // have that info, ever. | ||
188 | if (!m_servicesNotified) | ||
189 | { | ||
190 | //Hand it the first scene, assuming that all scenes have the same BaseHTTPServer | ||
191 | new DataRequestHandler(m_scenes[0], this); | ||
192 | |||
193 | m_hostname = m_scenes[0].RegionInfo.ExternalHostName; | ||
182 | 194 | ||
183 | //scene.OnRestart += OnSimRestart; | 195 | if (m_dataServices != "" && m_dataServices != "noservices") |
184 | scene.EventManager.OnShutdown += delegate() { OnSimRestart(scene.RegionInfo); }; | 196 | NotifyDataServices(m_dataServices, "online"); |
197 | |||
198 | m_servicesNotified = true; | ||
185 | } | 199 | } |
186 | else | 200 | } |
201 | |||
202 | public void RemoveRegion(Scene scene) | ||
203 | { | ||
204 | if (!m_enabled) | ||
205 | return; | ||
206 | |||
207 | m_log.Info("[DATASNAPSHOT]: Region " + scene.RegionInfo.RegionName + " is being removed, removing from indexing"); | ||
208 | Scene restartedScene = SceneForUUID(scene.RegionInfo.RegionID); | ||
209 | |||
210 | m_scenes.Remove(restartedScene); | ||
211 | m_snapStore.RemoveScene(restartedScene); | ||
212 | |||
213 | //Getting around the fact that we can't remove objects from a collection we are enumerating over | ||
214 | List<IDataSnapshotProvider> providersToRemove = new List<IDataSnapshotProvider>(); | ||
215 | |||
216 | foreach (IDataSnapshotProvider provider in m_dataproviders) | ||
217 | { | ||
218 | if (provider.GetParentScene == restartedScene) | ||
219 | { | ||
220 | providersToRemove.Add(provider); | ||
221 | } | ||
222 | } | ||
223 | |||
224 | foreach (IDataSnapshotProvider provider in providersToRemove) | ||
187 | { | 225 | { |
188 | //m_log.Debug("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else)."); | 226 | m_dataproviders.Remove(provider); |
227 | m_snapStore.RemoveProvider(provider); | ||
189 | } | 228 | } |
229 | |||
230 | m_snapStore.RemoveScene(restartedScene); | ||
190 | } | 231 | } |
191 | 232 | ||
192 | public void Close() | 233 | public void PostInitialise() |
193 | { | 234 | { |
194 | if (m_enabled && m_dataServices != "" && m_dataServices != "noservices") | ||
195 | NotifyDataServices(m_dataServices, "offline"); | ||
196 | } | 235 | } |
197 | 236 | ||
237 | public void RegionLoaded(Scene scene) | ||
238 | { | ||
239 | if (!m_enabled) | ||
240 | return; | ||
241 | |||
242 | m_log.DebugFormat("[DATASNAPSHOT]: Marking scene {0} as stale.", scene.RegionInfo.RegionName); | ||
243 | m_snapStore.ForceSceneStale(scene); | ||
244 | } | ||
198 | 245 | ||
199 | public bool IsSharedModule | 246 | public void Close() |
200 | { | 247 | { |
201 | get { return true; } | 248 | if (!m_enabled) |
249 | return; | ||
250 | |||
251 | if (m_enabled && m_dataServices != "" && m_dataServices != "noservices") | ||
252 | NotifyDataServices(m_dataServices, "offline"); | ||
202 | } | 253 | } |
203 | 254 | ||
255 | |||
204 | public string Name | 256 | public string Name |
205 | { | 257 | { |
206 | get { return "External Data Generator"; } | 258 | get { return "External Data Generator"; } |
207 | } | 259 | } |
208 | 260 | ||
209 | public void PostInitialise() | 261 | public Type ReplaceableInterface |
210 | { | 262 | { |
211 | 263 | get { return null; } | |
212 | } | 264 | } |
213 | 265 | ||
214 | #endregion | 266 | #endregion |
@@ -399,35 +451,7 @@ namespace OpenSim.Region.DataSnapshot | |||
399 | m_snapStore.ForceSceneStale(scene); | 451 | m_snapStore.ForceSceneStale(scene); |
400 | } | 452 | } |
401 | } | 453 | } |
402 | |||
403 | #endregion | 454 | #endregion |
404 | 455 | ||
405 | public void OnSimRestart(RegionInfo thisRegion) | ||
406 | { | ||
407 | m_log.Info("[DATASNAPSHOT]: Region " + thisRegion.RegionName + " is restarting, removing from indexing"); | ||
408 | Scene restartedScene = SceneForUUID(thisRegion.RegionID); | ||
409 | |||
410 | m_scenes.Remove(restartedScene); | ||
411 | m_snapStore.RemoveScene(restartedScene); | ||
412 | |||
413 | //Getting around the fact that we can't remove objects from a collection we are enumerating over | ||
414 | List<IDataSnapshotProvider> providersToRemove = new List<IDataSnapshotProvider>(); | ||
415 | |||
416 | foreach (IDataSnapshotProvider provider in m_dataproviders) | ||
417 | { | ||
418 | if (provider.GetParentScene == restartedScene) | ||
419 | { | ||
420 | providersToRemove.Add(provider); | ||
421 | } | ||
422 | } | ||
423 | |||
424 | foreach (IDataSnapshotProvider provider in providersToRemove) | ||
425 | { | ||
426 | m_dataproviders.Remove(provider); | ||
427 | m_snapStore.RemoveProvider(provider); | ||
428 | } | ||
429 | |||
430 | m_snapStore.RemoveScene(restartedScene); | ||
431 | } | ||
432 | } | 456 | } |
433 | } | 457 | } |