From 0e0a75a71b5c7b534c6e97cfe73519f110d79679 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Mon, 11 Jul 2022 02:54:03 +0200 Subject: [PATCH] performance improvements for queries --- .../SecretKeyAuthenticationHandler.cs | 6 ++--- .../MareSynchronosServer/Hubs/FilesHub.cs | 4 ++-- .../MareSynchronosServer/Hubs/UserHub.cs | 23 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosServer/Authentication/SecretKeyAuthenticationHandler.cs b/MareSynchronosServer/MareSynchronosServer/Authentication/SecretKeyAuthenticationHandler.cs index a946db1..428d478 100644 --- a/MareSynchronosServer/MareSynchronosServer/Authentication/SecretKeyAuthenticationHandler.cs +++ b/MareSynchronosServer/MareSynchronosServer/Authentication/SecretKeyAuthenticationHandler.cs @@ -32,15 +32,15 @@ namespace MareSynchronosServer.Authentication using var sha256 = SHA256.Create(); var hashedHeader = BitConverter.ToString(sha256.ComputeHash(Encoding.UTF8.GetBytes(authHeader))).Replace("-", ""); - var user = await _mareDbContext.Users.AsNoTracking().SingleOrDefaultAsync(m => m.SecretKey == hashedHeader); + var uid = (await _mareDbContext.Users.AsNoTracking().FirstOrDefaultAsync(m => m.SecretKey == hashedHeader))?.UID; - if (user == null) + if (uid == null) { return AuthenticateResult.Fail("Failed Authorization"); } var claims = new List { - new Claim(ClaimTypes.NameIdentifier, user.UID) + new Claim(ClaimTypes.NameIdentifier, uid) }; var identity = new ClaimsIdentity(claims, nameof(SecretKeyAuthenticationHandler)); diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/FilesHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/FilesHub.cs index 686d957..d37981a 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/FilesHub.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/FilesHub.cs @@ -141,7 +141,7 @@ namespace MareSynchronosServer.Hubs { fileListHashes = fileListHashes.Where(f => !string.IsNullOrEmpty(f)).Distinct().ToList(); Logger.LogInformation("User " + AuthenticatedUserId + " sending files"); - var forbiddenFiles = DbContext.ForbiddenUploadEntries.AsNoTracking().Where(f => fileListHashes.Contains(f.Hash)); + var forbiddenFiles = await DbContext.ForbiddenUploadEntries.AsNoTracking().Where(f => fileListHashes.Contains(f.Hash)).ToListAsync(); var filesToUpload = new List(); filesToUpload.AddRange(forbiddenFiles.Select(f => new UploadFileDto() { @@ -150,7 +150,7 @@ namespace MareSynchronosServer.Hubs IsForbidden = true })); fileListHashes.RemoveAll(f => filesToUpload.Any(u => u.Hash == f)); - var existingFiles = DbContext.Files.Where(f => fileListHashes.Contains(f.Hash)); + var existingFiles = await DbContext.Files.AsNoTracking().Where(f => fileListHashes.Contains(f.Hash)).ToListAsync(); foreach (var file in fileListHashes.Where(f => existingFiles.All(e => e.Hash != f) && filesToUpload.All(u => u.Hash != f))) { Logger.LogInformation("User " + AuthenticatedUserId + " needs upload: " + file); diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/UserHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/UserHub.cs index 0a3298a..9254b7a 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/UserHub.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/UserHub.cs @@ -134,21 +134,22 @@ namespace MareSynchronosServer.Hubs { Logger.LogInformation("User " + AuthenticatedUserId + " pushing character data to " + visibleCharacterIds.Count + " visible clients"); - var uid = AuthenticatedUserId; - var entriesHavingThisUser = DbContext.ClientPairs.AsNoTracking() + var user = GetAuthenticatedUserUntracked(); + var senderPairedUsers = DbContext.ClientPairs.AsNoTracking() .Include(w => w.User) .Include(w => w.OtherUser) - .Where(w => w.OtherUser.UID == uid && !w.IsPaused - && visibleCharacterIds.Contains(w.User.CharacterIdentification)).ToList(); + .Where(w => w.User.UID == user.UID && !w.IsPaused + && visibleCharacterIds.Contains(w.OtherUser.CharacterIdentification)) + .Select(u => u.OtherUser).ToList(); - foreach (var pair in entriesHavingThisUser) + foreach (var pairedUser in senderPairedUsers) { - var ownEntry = DbContext.ClientPairs.AsNoTracking() - .SingleOrDefault(w => - w.User.UID == uid && w.OtherUser.UID == pair.User.UID); - if (ownEntry == null || ownEntry.IsPaused) continue; - await Clients.User(pair.User.UID).SendAsync(UserHubAPI.OnReceiveCharacterData, characterCache, - pair.OtherUser.CharacterIdentification); + var isPaused = DbContext.ClientPairs.AsNoTracking() + .FirstOrDefault(w => + w.User.UID == pairedUser.UID && w.OtherUser.UID == user.UID)?.IsPaused ?? true; + if (isPaused) continue; + await Clients.User(pairedUser.UID).SendAsync(UserHubAPI.OnReceiveCharacterData, characterCache, + user.CharacterIdentification); } }