sql query optimization, add server cache hard limit, try catch separate around every block
This commit is contained in:
@@ -106,20 +106,21 @@ namespace MareSynchronosServer.Hubs
|
||||
{
|
||||
var userSentHashes = new HashSet<string>(fileListHashes.Distinct());
|
||||
_logger.LogInformation($"User {AuthenticatedUserId} sending files: {userSentHashes.Count}");
|
||||
var coveredFiles = new Dictionary<string, UploadFileDto>();
|
||||
var notCoveredFiles = new Dictionary<string, UploadFileDto>();
|
||||
// Todo: Check if a select can directly transform to hashset
|
||||
var forbiddenFiles = await _dbContext.ForbiddenUploadEntries.AsNoTracking().Where(f => userSentHashes.Contains(f.Hash)).ToDictionaryAsync(f => f.Hash, f => f);
|
||||
var existingFiles = await _dbContext.Files.AsNoTracking().Where(f => userSentHashes.Contains(f.Hash)).ToDictionaryAsync(f => f.Hash, f => f);
|
||||
var uploader = await _dbContext.Users.SingleAsync(u => u.UID == AuthenticatedUserId);
|
||||
|
||||
List<FileCache> fileCachesToUpload = new();
|
||||
foreach (var file in userSentHashes)
|
||||
{
|
||||
// Skip empty file hashes, duplicate file hashes, forbidden file hashes and existing file hashes
|
||||
if (string.IsNullOrEmpty(file)) { continue; }
|
||||
if (coveredFiles.ContainsKey(file)) { continue; }
|
||||
if (notCoveredFiles.ContainsKey(file)) { continue; }
|
||||
if (forbiddenFiles.ContainsKey(file))
|
||||
{
|
||||
coveredFiles[file] = new UploadFileDto()
|
||||
notCoveredFiles[file] = new UploadFileDto()
|
||||
{
|
||||
ForbiddenBy = forbiddenFiles[file].ForbiddenBy,
|
||||
Hash = file,
|
||||
@@ -132,21 +133,22 @@ namespace MareSynchronosServer.Hubs
|
||||
|
||||
_logger.LogInformation("User " + AuthenticatedUserId + " needs upload: " + file);
|
||||
var userId = AuthenticatedUserId;
|
||||
await _dbContext.Files.AddAsync(new FileCache()
|
||||
fileCachesToUpload.Add(new FileCache()
|
||||
{
|
||||
Hash = file,
|
||||
Uploaded = false,
|
||||
Uploader = uploader
|
||||
});
|
||||
|
||||
coveredFiles[file] = new UploadFileDto()
|
||||
notCoveredFiles[file] = new UploadFileDto()
|
||||
{
|
||||
Hash = file,
|
||||
};
|
||||
}
|
||||
//Save bulk
|
||||
await _dbContext.Files.AddRangeAsync(fileCachesToUpload);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
return coveredFiles.Values.ToList();
|
||||
return notCoveredFiles.Values.ToList();
|
||||
}
|
||||
|
||||
[Authorize(AuthenticationSchemes = SecretKeyAuthenticationHandler.AuthScheme)]
|
||||
|
||||
@@ -118,25 +118,33 @@ namespace MareSynchronosServer.Hubs
|
||||
_logger.LogInformation("User " + AuthenticatedUserId + " pushing character data to " + visibleCharacterIds.Count + " visible clients");
|
||||
|
||||
var user = await GetAuthenticatedUserUntrackedAsync();
|
||||
var senderPairedUsers = await _dbContext.ClientPairs.AsNoTracking()
|
||||
.Include(w => w.User)
|
||||
.Include(w => w.OtherUser)
|
||||
.Where(w => w.User.UID == user.UID && !w.IsPaused
|
||||
&& visibleCharacterIds.Contains(w.OtherUser.CharacterIdentification))
|
||||
.Select(u => u.OtherUser).ToListAsync();
|
||||
|
||||
foreach (var pairedUser in senderPairedUsers)
|
||||
{
|
||||
var isPaused = (await _dbContext.ClientPairs.AsNoTracking()
|
||||
.FirstOrDefaultAsync(w =>
|
||||
w.User.UID == pairedUser.UID && w.OtherUser.UID == user.UID))?.IsPaused ?? true;
|
||||
if (isPaused) continue;
|
||||
await Clients.User(pairedUser.UID).SendAsync(Api.OnUserReceiveCharacterData, characterCache,
|
||||
user.CharacterIdentification);
|
||||
}
|
||||
var query =
|
||||
from userToOther in _dbContext.ClientPairs
|
||||
join otherToUser in _dbContext.ClientPairs
|
||||
on new
|
||||
{
|
||||
user = userToOther.UserUID,
|
||||
other = userToOther.OtherUserUID
|
||||
|
||||
} equals new
|
||||
{
|
||||
user = otherToUser.OtherUserUID,
|
||||
other = otherToUser.UserUID
|
||||
}
|
||||
where
|
||||
userToOther.UserUID == user.UID
|
||||
&& !userToOther.IsPaused
|
||||
&& !otherToUser.IsPaused
|
||||
&& visibleCharacterIds.Contains(userToOther.OtherUser.CharacterIdentification)
|
||||
select otherToUser.UserUID;
|
||||
|
||||
var otherEntries = await query.ToListAsync();
|
||||
|
||||
await Clients.Users(otherEntries).SendAsync(Api.OnUserReceiveCharacterData, characterCache, user.CharacterIdentification);
|
||||
|
||||
MareMetrics.UserPushData.Inc();
|
||||
MareMetrics.UserPushDataTo.Inc(visibleCharacterIds.Count);
|
||||
MareMetrics.UserPushDataTo.Inc(otherEntries.Count);
|
||||
}
|
||||
|
||||
[Authorize(AuthenticationSchemes = SecretKeyAuthenticationHandler.AuthScheme)]
|
||||
|
||||
Reference in New Issue
Block a user