diff --git a/XenAdmin/Controls/CustomDataGraph/ArchiveMaintainer.cs b/XenAdmin/Controls/CustomDataGraph/ArchiveMaintainer.cs
index eecf4ed72..793a7ce4d 100644
--- a/XenAdmin/Controls/CustomDataGraph/ArchiveMaintainer.cs
+++ b/XenAdmin/Controls/CustomDataGraph/ArchiveMaintainer.cs
@@ -47,20 +47,6 @@ namespace XenAdmin.Controls.CustomDataGraph
public class ArchiveMaintainer
{
- private delegate void ReaderDelegate(XmlReader reader, IXenObject xmo);
- private delegate Uri URIDelegate(Session session, Host host, ArchiveInterval interval, IXenObject xmo);
-
- internal const string RrdUpdatesPath = "rrd_updates";
- private const string RrdHostPath = "host_rrds";
- private const string RrdVmPath = "vm_rrds";
- internal const string RrdCFAverage = "AVERAGE";
-
- private const string RrdHostUpdatesQuery = "session_id={0}&start={1}&cf={2}&interval={3}&host=true&vm_uuid=";
- internal const string RrdHostAndVmUpdatesQuery = "session_id={0}&start={1}&cf={2}&interval={3}&host=true";
- private const string RrdVmUpdatesQuery = "session_id={0}&start={1}&cf={2}&interval={3}&vm_uuid={4}";
- private const string RrdHostQuery = "session_id={0}";
- private const string RrdVmQuery = "session_id={0}&uuid={1}";
-
private const long TicksInOneSecond = 10000000;
private const long TicksInFiveSeconds = 50000000;
internal const long TicksInTenSeconds = 100000000;
@@ -177,7 +163,6 @@ namespace XenAdmin.Controls.CustomDataGraph
while (RunThread)
{
IXenObject xenObject = XenObject;
- Host Host = GetHost(xenObject);
DateTime ServerWas = ServerNow(); // get time before updating so we don't miss any 5 second updates if getting the past data
@@ -200,7 +185,7 @@ namespace XenAdmin.Controls.CustomDataGraph
LoadingInitialData = true;
OnArchivesUpdated();
- Get(ArchiveInterval.None, RrdsUri, RRD_Full_InspectCurrentNode, Host, xenObject);
+ Get(ArchiveInterval.None, RrdsUri, RRD_Full_InspectCurrentNode, xenObject);
LoadingInitialData = false;
OnArchivesUpdated();
@@ -213,25 +198,25 @@ namespace XenAdmin.Controls.CustomDataGraph
if (ServerWas - LastFiveSecondCollection > FiveSeconds)
{
- GetUpdate(ArchiveInterval.FiveSecond, Host, xenObject);
+ Get(ArchiveInterval.FiveSecond, UpdateUri, RRD_Update_InspectCurrentNode, xenObject);
LastFiveSecondCollection = ServerWas;
Archives[ArchiveInterval.FiveSecond].Load(SetsAdded);
}
if (ServerWas - LastOneMinuteCollection > OneMinute)
{
- GetUpdate(ArchiveInterval.OneMinute, Host, xenObject);
+ Get(ArchiveInterval.OneMinute, UpdateUri, RRD_Update_InspectCurrentNode, xenObject);
LastOneMinuteCollection = ServerWas;
Archives[ArchiveInterval.OneMinute].Load(SetsAdded);
}
if (ServerWas - LastOneHourCollection > OneHour)
{
- GetUpdate(ArchiveInterval.OneHour, Host, xenObject);
+ Get(ArchiveInterval.OneHour, UpdateUri, RRD_Update_InspectCurrentNode, xenObject);
LastOneHourCollection = ServerWas;
Archives[ArchiveInterval.OneHour].Load(SetsAdded);
}
if (ServerWas - LastOneDayCollection > OneDay)
{
- GetUpdate(ArchiveInterval.OneDay, Host, xenObject);
+ Get(ArchiveInterval.OneDay, UpdateUri, RRD_Update_InspectCurrentNode, xenObject);
LastOneDayCollection = ServerWas;
Archives[ArchiveInterval.OneDay].Load(SetsAdded);
}
@@ -256,29 +241,16 @@ namespace XenAdmin.Controls.CustomDataGraph
return DateTime.UtcNow.Subtract(ClientServerOffset);
}
- ///
- /// UpdaterThread Thread
- ///
- private void GetUpdate(ArchiveInterval interval, Host host, IXenObject xo)
+ private void Get(ArchiveInterval interval, Func uriBuilder,
+ ActionReader, IXenObject xenObject)
{
- Get(interval, UpdateUri, RRD_Update_InspectCurrentNode, host, xo);
- }
-
- ///
- /// UpdaterThread Thread
- ///
- private void Get(ArchiveInterval interval, URIDelegate URI, ReaderDelegate Reader,
- Host host, IXenObject xenObject)
- {
- if (host == null)
- return;
-
try
{
- Session session = xenObject.Connection.Session;
- if (session == null)
+ var uri = uriBuilder(interval, xenObject);
+ if (uri == null)
return;
- using (Stream httpstream = HTTPHelper.GET(URI(session, host, interval, xenObject), xenObject.Connection, true))
+
+ using (Stream httpstream = HTTPHelper.GET(uri, xenObject.Connection, true))
{
using (XmlReader reader = XmlReader.Create(httpstream))
{
@@ -299,39 +271,62 @@ namespace XenAdmin.Controls.CustomDataGraph
}
}
- ///
- /// UpdaterThread Thread
- ///
- private Uri UpdateUri(Session session, Host host, ArchiveInterval interval, IXenObject xo)
+ private Uri UpdateUri(ArchiveInterval interval, IXenObject xo)
{
- string query =
- xo is Host ?
- string.Format(RrdHostUpdatesQuery, Uri.EscapeDataString(session.opaque_ref), TimeFromInterval(interval), RrdCFAverage, ToSeconds(interval)) :
- xo is VM ?
- string.Format(RrdVmUpdatesQuery, Uri.EscapeDataString(session.opaque_ref), TimeFromInterval(interval), RrdCFAverage, ToSeconds(interval), Helpers.GetUuid(xo)) :
- "";
- return BuildUri(host, RrdUpdatesPath, query);
+ var sessionRef = xo?.Connection?.Session?.opaque_ref;
+ if (sessionRef == null)
+ return null;
+
+ var escapedRef = Uri.EscapeDataString(sessionRef);
+ var startTime = TimeFromInterval(interval);
+ var duration = ToSeconds(interval);
+
+ if (xo is Host host)
+ {
+ return BuildUri(host, "rrd_updates",
+ $"session_id={escapedRef}&start={startTime}&cf=AVERAGE&interval={duration}&host=true");
+ }
+
+ if (xo is VM vm)
+ {
+ var vmHost = vm.Connection.Resolve(vm.resident_on) ?? Helpers.GetMaster(vm.Connection);
+ BuildUri(vmHost, "rrd_updates",
+ $"session_id={escapedRef}&start={startTime}&cf=AVERAGE&interval={duration}&vm_uuid={vm.uuid}");
+ }
+
+ return null;
}
- private static Uri RrdsUri(Session session, Host host, ArchiveInterval interval, IXenObject xo)
+ private static Uri RrdsUri(ArchiveInterval interval, IXenObject xo)
{
- string query =
- xo is Host ?
- string.Format(RrdHostQuery, Uri.EscapeDataString(session.opaque_ref)) :
- xo is VM ?
- string.Format(RrdVmQuery, Uri.EscapeDataString(session.opaque_ref), Helpers.GetUuid(xo)) :
- "";
- return BuildUri(host, xo is Host ? RrdHostPath : RrdVmPath, query);
+ var sessionRef = xo.Connection.Session?.opaque_ref;
+ if (sessionRef == null)
+ return null;
+
+ var escapedRef = Uri.EscapeDataString(sessionRef);
+
+ if (xo is Host host)
+ return BuildUri(host, "host_rrds", $"session_id={escapedRef}");
+
+ if (xo is VM vm)
+ {
+ var vmHost = vm.Connection.Resolve(vm.resident_on) ?? Helpers.GetMaster(vm.Connection);
+ return BuildUri(vmHost, "vm_rrds", $"session_id={escapedRef}&uuid={vm.uuid}");
+ }
+
+ return null;
}
private static Uri BuildUri(Host host, string path, string query)
{
- UriBuilder builder = new UriBuilder();
- builder.Scheme = host.Connection.UriScheme;
- builder.Host = host.address;
- builder.Port = host.Connection.Port;
- builder.Path = path;
- builder.Query = query;
+ UriBuilder builder = new UriBuilder
+ {
+ Scheme = host.Connection.UriScheme,
+ Host = host.address,
+ Port = host.Connection.Port,
+ Path = path,
+ Query = query
+ };
return builder.Uri;
}
@@ -472,7 +467,7 @@ namespace XenAdmin.Controls.CustomDataGraph
else if (LastNode == "cf")
{
string str = reader.ReadContentAsString();
- if (str != RrdCFAverage)
+ if (str != "AVERAGE")
BailOut = true;
}
else if (LastNode == "v")
@@ -617,25 +612,6 @@ namespace XenAdmin.Controls.CustomDataGraph
}
}
- private static Host GetHost(IXenObject xmo)
- {
- if (xmo is Host)
- {
- return (Host)xmo;
- }
- else if (xmo is VM)
- {
- VM vm = (VM)xmo;
- return xmo.Connection.Resolve(vm.resident_on) ?? Helpers.GetMaster(xmo.Connection);
- }
- else
- {
- System.Diagnostics.Trace.Assert(false);
- return null;
- }
- }
-
-
private void OnArchivesUpdated()
{
if (ArchivesUpdated != null)