Add the ability to post to and act uponconfiguration in etcd

Etcd is a distributed, highly available name-value store that is
the basis of many clustered applications. However, it can also be
run on a standalone machine. Using etcd allows live monitoring
and possibly changing configuration while the sim is running.
This commit is contained in:
Melanie Thielker
2017-03-31 13:46:01 +01:00
parent 680231d7e7
commit 75915bd0f3
8 changed files with 11926 additions and 3 deletions

View File

@@ -540,6 +540,9 @@ namespace OpenSim.Region.Framework.Scenes
private Timer m_mapGenerationTimer = new Timer();
private bool m_generateMaptiles;
protected int m_lastHealth = -1;
protected int m_lastUsers = -1;
#endregion Fields
#region Properties
@@ -1234,6 +1237,8 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
StartTimerWatchdog();
}
public Scene(RegionInfo regInfo)
@@ -1504,6 +1509,14 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
IEtcdModule etcd = RequestModuleInterface<IEtcdModule>();
if (etcd != null)
{
etcd.Delete("Health");
etcd.Delete("HealthFlags");
etcd.Delete("RootAgents");
}
m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName);
@@ -5536,23 +5549,24 @@ Label_GroupsDone:
return 0;
}
if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 2000)
{
health+=1;
flags |= 1;
}
if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 2000)
{
health+=1;
flags |= 2;
}
if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 2000)
{
health+=1;
flags |= 4;
}
/*
else
{
int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
@@ -5565,6 +5579,7 @@ proc.WaitForExit();
Thread.Sleep(1000);
Environment.Exit(1);
}
*/
if (flags != 7)
return health;
@@ -6329,6 +6344,32 @@ Environment.Exit(1);
public void TimerWatchdog(object sender, ElapsedEventArgs e)
{
CheckHeartbeat();
IEtcdModule etcd = RequestModuleInterface<IEtcdModule>();
int flags;
string message;
if (etcd != null)
{
int health = GetHealth(out flags, out message);
if (health != m_lastHealth)
{
m_lastHealth = health;
etcd.Store("Health", health.ToString(), 300000);
etcd.Store("HealthFlags", flags.ToString(), 300000);
}
int roots = 0;
foreach (ScenePresence sp in GetScenePresences())
if (!sp.IsChildAgent && !sp.IsNPC)
roots++;
if (m_lastUsers != roots)
{
m_lastUsers = roots;
etcd.Store("RootAgents", roots.ToString(), 300000);
}
}
}
/// This method deals with movement when an avatar is automatically moving (but this is distinct from the