From f881a2eb556e8a9b3b144d2e66e88e00a9e9fb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 10 Nov 2021 16:59:48 +0500 Subject: [PATCH] Refactor TelemetryTracker initialization --- .../Services/TelemetryTracker.cs | 82 ++++++++++++++----- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index 0484cdf9..4c05c883 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -5,6 +5,8 @@ using System.Linq; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Microsoft.EntityFrameworkCore; +using System.Collections.Concurrent; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { @@ -27,7 +29,7 @@ namespace AsbCloudInfrastructure.Services public DateTime LastTimeRemote { get; set; } } - private readonly Dictionary requests; + private readonly ConcurrentDictionary requests; public TelemetryTracker(CacheDb cacheDb) { @@ -37,31 +39,69 @@ namespace AsbCloudInfrastructure.Services using var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); - - var lastTelemetriesDates = (from d in db.TelemetryDataSaub - group d by d.IdTelemetry into g - select new - { - IdTelemetry = g.Key, - Date = g.Max(t => t.Date) - }) - .AsNoTracking() - .ToList(); - - requests = lastTelemetriesDates.Select(t => new + var keyValuePairs = new Dictionary(cacheTelemetry.Count()); + foreach (var telemetry in cacheTelemetry) { - //Id = t.IdTelemetry, - RemoteUid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, - LastTimeRemote = t.Date, + var date = telemetry.Info?.DrillingStartDate + ?? GetDateByUidOrDefault(telemetry.RemoteUid, DateTime.MinValue); - }).ToDictionary(t => t.RemoteUid, t => new TrackerStat { - //Id = t.Id, - RemoteUid = t.RemoteUid, - LastTimeRemote = t.LastTimeRemote, - LastTimeServer = t.LastTimeRemote, + keyValuePairs[telemetry.RemoteUid] = new TrackerStat { + RemoteUid = telemetry.RemoteUid, + LastTimeRemote = date, + LastTimeServer = date, + }; + } + requests = new ConcurrentDictionary(keyValuePairs); + + Task.Run(async() => { + db.Database.SetCommandTimeout(2 * 60); + var dates = await db.TelemetryDataSaub + .GroupBy(d => d.IdTelemetry) + .Select(g => new + { + IdTelemetry = g.Key, + Date = g.Max(d=>d.Date) + }) + .AsNoTracking() + .ToListAsync() + .ConfigureAwait(false); + db.Dispose(); + + var oldReqs = dates.Select(t => new + { + Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, + t.Date, + }); + + foreach (var oldReq in oldReqs) + { + var request = requests.GetValueOrDefault(oldReq.Uid); + if(request is not null) + { + if (request.LastTimeRemote < oldReq.Date) + request.LastTimeRemote = oldReq.Date; + if (request.LastTimeServer < oldReq.Date) + request.LastTimeServer = oldReq.Date; + } + } }); } + private static DateTime GetDateByUidOrDefault(string remoteUid, DateTime defaultValue = default) + { + //eg: uid = 20211102_173407926 + if (string.IsNullOrEmpty(remoteUid) || (remoteUid.Length != 18)) + return defaultValue; + + if (DateTime.TryParseExact(remoteUid, "yyyyMMdd_HHmmssfff", + System.Globalization.CultureInfo.InvariantCulture, + System.Globalization.DateTimeStyles.AssumeUniversal, + out DateTime parsedDate)) + return parsedDate; + + return defaultValue; + } + public void SaveRequestDate(string uid, DateTime remoteDate) { var stat = requests.GetValueOrDefault(uid);