mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 02:43:44 +00:00
feat(ugc): staff reprocessing of a property goes to the front of the queue
/reprocessproperty and the dashboard's Reprocess all models mark the property's models as priority (ugc.priority, migrations mysql 94 and sqlite 77). The UGC server takes priority models first, polls them even when its queue is full, and puts them at its front, as it does cars and rockets. The flag clears once a model is made. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -78,10 +78,12 @@ public:
|
||||
LWOOBJID id{};
|
||||
std::string lxfml;
|
||||
uint32_t attempts{};
|
||||
bool priority{}; // staff asked for it to be made again: before any other model
|
||||
};
|
||||
|
||||
// Up to `limit` pending models whose quiet period is over (process_after), the least tried and then the newest first
|
||||
virtual std::vector<PendingModel> GetUgcModelsToProcess(const uint32_t limit) = 0;
|
||||
// Up to `limit` pending models whose quiet period is over (process_after): the priority ones first, then the least
|
||||
// tried and then the newest. `priorityOnly`: only the priority ones.
|
||||
virtual std::vector<PendingModel> GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly = false) = 0;
|
||||
|
||||
// Ends the quiet period of a waiting model (a client asked for it), or of all a character's waiting models (they
|
||||
// left the property)
|
||||
@@ -110,7 +112,8 @@ public:
|
||||
// with `failedOnly`). Returns how many rows changed.
|
||||
virtual uint64_t ResetUgcModelProcessing(const std::optional<LWOOBJID> id, const bool failedOnly) = 0;
|
||||
|
||||
// Sets every model placed on a property back to pending with no attempts. Returns how many rows changed.
|
||||
// Sets every model placed on a property back to pending with no attempts, as priority (staff asked for it). Returns
|
||||
// how many rows changed.
|
||||
virtual uint64_t ResetPropertyUgcModelProcessing(const LWOOBJID propertyId) = 0;
|
||||
|
||||
// A page of models (all, or those in `state`), the newest first; `search` (when not empty) matches the model's id
|
||||
|
||||
@@ -420,7 +420,7 @@ public:
|
||||
nlohmann::json GetCharacterById(const LWOOBJID charId) override;
|
||||
std::optional<IPropertyContents::Model> GetModel(const LWOOBJID modelID) override;
|
||||
std::optional<IUgc::Model> GetUgcModel(const LWOOBJID ugcId) override;
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit) override;
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly) override;
|
||||
void ExpediteUgcModel(const LWOOBJID id) override;
|
||||
void ExpediteUgcModels(const LWOOBJID characterId) override;
|
||||
std::vector<std::pair<std::string, uint64_t>> GetModularBuildConfigCounts() override;
|
||||
|
||||
@@ -110,8 +110,9 @@ std::optional<IUgc::Model> MySQLDatabase::GetUgcModel(const LWOOBJID ugcId) {
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
std::vector<IUgc::PendingModel> MySQLDatabase::GetUgcModelsToProcess(const uint32_t limit) {
|
||||
auto result = ExecuteSelect("SELECT id, lxfml, process_attempts FROM ugc WHERE is_optimized = 0 AND process_after <= ? ORDER BY process_attempts ASC, id DESC LIMIT ?;", UnixNow(), limit);
|
||||
std::vector<IUgc::PendingModel> MySQLDatabase::GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly) {
|
||||
auto result = ExecuteSelect("SELECT id, lxfml, process_attempts, priority FROM ugc WHERE is_optimized = 0 AND process_after <= ? AND (? = 0 OR priority = 1) "
|
||||
"ORDER BY priority DESC, process_attempts ASC, id DESC LIMIT ?;", UnixNow(), priorityOnly ? 1 : 0, limit);
|
||||
std::vector<IUgc::PendingModel> models;
|
||||
while (result->next()) {
|
||||
auto& model = models.emplace_back();
|
||||
@@ -121,13 +122,14 @@ std::vector<IUgc::PendingModel> MySQLDatabase::GetUgcModelsToProcess(const uint3
|
||||
contents << blob->rdbuf();
|
||||
model.lxfml = contents.str();
|
||||
model.attempts = static_cast<uint32_t>(result->getInt("process_attempts"));
|
||||
model.priority = result->getInt("priority") != 0;
|
||||
}
|
||||
return models;
|
||||
}
|
||||
|
||||
void MySQLDatabase::SetUgcModelProcessed(const LWOOBJID id, const eProcessState state, const uint32_t attempts, const std::string_view error, const bool bakeAo) {
|
||||
ExecuteUpdate("UPDATE ugc SET is_optimized = ?, process_attempts = ?, process_error = ?, bake_ao = ?, processed_at = ? WHERE id = ?;",
|
||||
static_cast<int32_t>(state), attempts, error, bakeAo, UnixNow(), id);
|
||||
ExecuteUpdate("UPDATE ugc SET is_optimized = ?, process_attempts = ?, process_error = ?, bake_ao = ?, processed_at = ?, priority = CASE WHEN ? = 0 THEN priority ELSE 0 END WHERE id = ?;",
|
||||
static_cast<int32_t>(state), attempts, error, bakeAo, UnixNow(), static_cast<int32_t>(state), id);
|
||||
}
|
||||
|
||||
std::optional<IUgc::ProcessInfo> MySQLDatabase::GetUgcProcessInfo(const LWOOBJID id) {
|
||||
@@ -145,7 +147,7 @@ uint64_t MySQLDatabase::ResetUgcModelProcessing(const std::optional<LWOOBJID> id
|
||||
}
|
||||
|
||||
uint64_t MySQLDatabase::ResetPropertyUgcModelProcessing(const LWOOBJID propertyId) {
|
||||
return ExecuteUpdate("UPDATE ugc SET is_optimized = 0, process_attempts = 0, process_error = '', process_after = 0 "
|
||||
return ExecuteUpdate("UPDATE ugc SET is_optimized = 0, process_attempts = 0, process_error = '', process_after = 0, priority = 1 "
|
||||
"WHERE id IN (SELECT ugc_id FROM properties_contents WHERE property_id = ? AND ugc_id IS NOT NULL);", propertyId);
|
||||
}
|
||||
|
||||
|
||||
@@ -404,7 +404,7 @@ public:
|
||||
nlohmann::json GetCharacterById(const LWOOBJID charId) override;
|
||||
std::optional<IPropertyContents::Model> GetModel(const LWOOBJID modelID) override;
|
||||
std::optional<IUgc::Model> GetUgcModel(const LWOOBJID ugcId) override;
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit) override;
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly) override;
|
||||
void ExpediteUgcModel(const LWOOBJID id) override;
|
||||
void ExpediteUgcModels(const LWOOBJID characterId) override;
|
||||
std::vector<std::pair<std::string, uint64_t>> GetModularBuildConfigCounts() override;
|
||||
|
||||
@@ -111,8 +111,9 @@ std::optional<IUgc::Model> SQLiteDatabase::GetUgcModel(const LWOOBJID ugcId) {
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
std::vector<IUgc::PendingModel> SQLiteDatabase::GetUgcModelsToProcess(const uint32_t limit) {
|
||||
auto [_, result] = ExecuteSelect("SELECT id, lxfml, process_attempts FROM ugc WHERE is_optimized = 0 AND process_after <= ? ORDER BY process_attempts ASC, id DESC LIMIT ?;", UnixNow(), limit);
|
||||
std::vector<IUgc::PendingModel> SQLiteDatabase::GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly) {
|
||||
auto [_, result] = ExecuteSelect("SELECT id, lxfml, process_attempts, priority FROM ugc WHERE is_optimized = 0 AND process_after <= ? AND (? = 0 OR priority = 1) "
|
||||
"ORDER BY priority DESC, process_attempts ASC, id DESC LIMIT ?;", UnixNow(), priorityOnly ? 1 : 0, limit);
|
||||
std::vector<IUgc::PendingModel> models;
|
||||
while (!result.eof()) {
|
||||
auto& model = models.emplace_back();
|
||||
@@ -121,14 +122,15 @@ std::vector<IUgc::PendingModel> SQLiteDatabase::GetUgcModelsToProcess(const uint
|
||||
const auto* blob = result.getBlobField("lxfml", blobSize);
|
||||
model.lxfml.assign(reinterpret_cast<const char*>(blob), blobSize);
|
||||
model.attempts = static_cast<uint32_t>(result.getIntField("process_attempts"));
|
||||
model.priority = result.getIntField("priority") != 0;
|
||||
result.nextRow();
|
||||
}
|
||||
return models;
|
||||
}
|
||||
|
||||
void SQLiteDatabase::SetUgcModelProcessed(const LWOOBJID id, const eProcessState state, const uint32_t attempts, const std::string_view error, const bool bakeAo) {
|
||||
ExecuteUpdate("UPDATE ugc SET is_optimized = ?, process_attempts = ?, process_error = ?, bake_ao = ?, processed_at = ? WHERE id = ?;",
|
||||
static_cast<int32_t>(state), attempts, error, bakeAo, UnixNow(), id);
|
||||
ExecuteUpdate("UPDATE ugc SET is_optimized = ?, process_attempts = ?, process_error = ?, bake_ao = ?, processed_at = ?, priority = CASE WHEN ? = 0 THEN priority ELSE 0 END WHERE id = ?;",
|
||||
static_cast<int32_t>(state), attempts, error, bakeAo, UnixNow(), static_cast<int32_t>(state), id);
|
||||
}
|
||||
|
||||
std::optional<IUgc::ProcessInfo> SQLiteDatabase::GetUgcProcessInfo(const LWOOBJID id) {
|
||||
@@ -146,7 +148,7 @@ uint64_t SQLiteDatabase::ResetUgcModelProcessing(const std::optional<LWOOBJID> i
|
||||
}
|
||||
|
||||
uint64_t SQLiteDatabase::ResetPropertyUgcModelProcessing(const LWOOBJID propertyId) {
|
||||
return ExecuteUpdate("UPDATE ugc SET is_optimized = 0, process_attempts = 0, process_error = '', process_after = 0 "
|
||||
return ExecuteUpdate("UPDATE ugc SET is_optimized = 0, process_attempts = 0, process_error = '', process_after = 0, priority = 1 "
|
||||
"WHERE id IN (SELECT ugc_id FROM properties_contents WHERE property_id = ? AND ugc_id IS NOT NULL);", propertyId);
|
||||
}
|
||||
|
||||
|
||||
@@ -402,7 +402,7 @@ class TestSQLDatabase : public GameDatabase {
|
||||
std::optional<IPropertyContents::Model> GetModel(const LWOOBJID modelID) override { return {}; }
|
||||
std::optional<IProperty::Info> GetPropertyInfo(const LWOOBJID id) override { return {}; }
|
||||
std::optional<IUgc::Model> GetUgcModel(const LWOOBJID ugcId) override { return {}; }
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit) override { return {}; }
|
||||
std::vector<IUgc::PendingModel> GetUgcModelsToProcess(const uint32_t limit, const bool priorityOnly) override { return {}; }
|
||||
void ExpediteUgcModel(const LWOOBJID id) override {}
|
||||
void ExpediteUgcModels(const LWOOBJID characterId) override {}
|
||||
std::vector<std::pair<std::string, uint64_t>> GetModularBuildConfigCounts() override { return {}; }
|
||||
|
||||
Reference in New Issue
Block a user