Fixes for strange edge cases on the server, we now log metrics about list healing

This commit is contained in:
Timothy Baldridge 2020-03-10 14:41:45 -06:00
parent d6102e9f7a
commit 7978cd098c
12 changed files with 48 additions and 11 deletions

View File

@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Alphaleonis.Win32.Filesystem;
using GraphQL;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using Org.BouncyCastle.Ocsp;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.Common;
@ -16,11 +19,25 @@ namespace Wabbajack.BuildServer.Controllers
{
protected readonly DBContext Db;
protected readonly ILogger<T> Logger;
protected readonly SqlService SQL;
protected AControllerBase(ILogger<T> logger, DBContext db)
protected AControllerBase(ILogger<T> logger, DBContext db, SqlService sql)
{
Db = db;
Logger = logger;
SQL = sql;
}
protected async Task Metric(string verb, string subject)
{
await SQL.IngestMetric(new Metric
{
MetricsKey = Request.Headers[Consts.MetricsKeyHeader].FirstOrDefault(),
Subject = subject,
Action = verb,
Timestamp = DateTime.UtcNow
});
}

View File

@ -15,7 +15,7 @@ namespace Wabbajack.BuildServer.Controllers
{
private SqlService _sql;
public GraphQL(ILogger<GraphQL> logger, DBContext db, SqlService sql) : base(logger, db)
public GraphQL(ILogger<GraphQL> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
_sql = sql;
}

View File

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.Common;
using Wabbajack.Common.StatusFeed;
@ -23,7 +24,7 @@ namespace Wabbajack.BuildServer.Controllers
}
private static DateTime _startTime;
public Heartbeat(ILogger<Heartbeat> logger, DBContext db) : base(logger, db)
public Heartbeat(ILogger<Heartbeat> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
}

View File

@ -29,7 +29,7 @@ namespace Wabbajack.BuildServer.Controllers
{
private SqlService _sql;
public IndexedFiles(ILogger<IndexedFiles> logger, DBContext db, SqlService sql) : base(logger, db)
public IndexedFiles(ILogger<IndexedFiles> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
_sql = sql;
}

View File

@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.BuildServer.Models.JobQueue;
@ -16,7 +17,7 @@ namespace Wabbajack.BuildServer.Controllers
[Route("/jobs")]
public class Jobs : AControllerBase<Jobs>
{
public Jobs(ILogger<Jobs> logger, DBContext db) : base(logger, db)
public Jobs(ILogger<Jobs> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
}

View File

@ -10,6 +10,7 @@ using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Nettle;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.Common;
using Wabbajack.Lib.ModListRegistry;
@ -20,7 +21,7 @@ namespace Wabbajack.BuildServer.Controllers
[Route("/lists")]
public class ListValidation : AControllerBase<ListValidation>
{
public ListValidation(ILogger<ListValidation> logger, DBContext db) : base(logger, db)
public ListValidation(ILogger<ListValidation> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
}

View File

@ -21,7 +21,7 @@ namespace Wabbajack.BuildServer.Controllers
{
private SqlService _sql;
public MetricsController(ILogger<MetricsController> logger, DBContext db, SqlService sql) : base(logger, db)
public MetricsController(ILogger<MetricsController> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
_sql = sql;
}

View File

@ -30,7 +30,7 @@ namespace Wabbajack.BuildServer.Controllers
private AppSettings _settings;
private SqlService _sql;
public ModlistUpdater(ILogger<ModlistUpdater> logger, DBContext db, SqlService sql, AppSettings settings) : base(logger, db)
public ModlistUpdater(ILogger<ModlistUpdater> logger, DBContext db, SqlService sql, AppSettings settings) : base(logger, db, sql)
{
_settings = settings;
_sql = sql;
@ -91,6 +91,7 @@ namespace Wabbajack.BuildServer.Controllers
{
var startingHash = xxHash.FromHex().ToBase64();
Utils.Log($"Alternative requested for {startingHash}");
await Metric("requested_upgrade", startingHash);
var state = await Db.DownloadStates.AsQueryable()
.Where(s => s.Hash == startingHash)
@ -101,6 +102,17 @@ namespace Wabbajack.BuildServer.Controllers
return NotFound("Original state not found");
var nexusState = state.State as NexusDownloader.State;
var nexusGame = GameRegistry.GetByFuzzyName(nexusState.GameName).NexusName;
var mod_files = await Db.NexusModFiles.AsQueryable()
.Where(f => f.Game == nexusGame && f.ModId == nexusState.ModID)
.ToListAsync();
if (mod_files.SelectMany(f => f.Data.files)
.Any(f => f.category_name != null && f.file_id.ToString() == nexusState.FileID))
{
await Metric("not_required_upgrade", startingHash);
return BadRequest("Upgrade Not Required");
}
Utils.Log($"Found original, looking for alternatives to {startingHash}");
var newArchive = await FindAlternatives(nexusState, startingHash);

View File

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.Lib.NexusApi;
@ -13,7 +14,7 @@ namespace Wabbajack.BuildServer.Controllers
[Route("/v1/games/")]
public class NexusCache : AControllerBase<NexusCache>
{
public NexusCache(ILogger<NexusCache> logger, DBContext db) : base(logger, db)
public NexusCache(ILogger<NexusCache> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
}

View File

@ -17,6 +17,7 @@ using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Nettle;
using Org.BouncyCastle.Crypto.Engines;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.BuildServer.Models.JobQueue;
using Wabbajack.BuildServer.Models.Jobs;
@ -33,7 +34,7 @@ namespace Wabbajack.BuildServer.Controllers
private static ConcurrentDictionary<string, AsyncLock> _writeLocks = new ConcurrentDictionary<string, AsyncLock>();
private AppSettings _settings;
public UploadedFiles(ILogger<UploadedFiles> logger, DBContext db, AppSettings settings) : base(logger, db)
public UploadedFiles(ILogger<UploadedFiles> logger, DBContext db, AppSettings settings, SqlService sql) : base(logger, db, sql)
{
_settings = settings;
}

View File

@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using Wabbajack.BuildServer.Model.Models;
using Wabbajack.BuildServer.Models;
using Wabbajack.Common;
@ -15,7 +16,7 @@ namespace Wabbajack.BuildServer.Controllers
[Route("/users")]
public class Users : AControllerBase<Users>
{
public Users(ILogger<Users> logger, DBContext db) : base(logger, db)
public Users(ILogger<Users> logger, DBContext db, SqlService sql) : base(logger, db, sql)
{
}

View File

@ -7,6 +7,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using Ceras;
using MongoDB.Bson.Serialization.Attributes;
using ReactiveUI;
using Wabbajack.Common;
using Wabbajack.Common.StatusFeed.Errors;
@ -122,6 +123,7 @@ namespace Wabbajack.Lib.Downloaders
}
}
[BsonIgnoreExtraElements]
public class State : AbstractDownloadState, IMetaState
{
public string URL => $"http://nexusmods.com/{NexusApiUtils.ConvertGameName(GameName)}/mods/{ModID}";