Merge PR #614: Enqueue priority jobs instead of prepending

This commit is contained in:
jenkins 2023-02-21 17:43:27 +01:00
commit 74c8c53b7c
2 changed files with 16 additions and 7 deletions

View File

@ -96,7 +96,7 @@ LogEngine::~LogEngine()
{ {
// Process the job queue before allowing to shut down // Process the job queue before allowing to shut down
while (m_currentJob) { while (m_currentJob) {
qCDebug(dcLogEngine()) << "Waiting for job to finish... (" << m_jobQueue.count() << "jobs left in queue)"; qCDebug(dcLogEngine()) << "Waiting for job to finish... (" << (m_priorityJobQueue.count() + m_jobQueue.count()) << "jobs left in queue)";
m_jobWatcher.waitForFinished(); m_jobWatcher.waitForFinished();
// Make sure that the job queue is processes // Make sure that the job queue is processes
// We can't call processQueue ourselves because thread synchronisation is done via queued connections // We can't call processQueue ourselves because thread synchronisation is done via queued connections
@ -192,7 +192,7 @@ ThingsFetchJob *LogEngine::fetchThings()
bool LogEngine::jobsRunning() const bool LogEngine::jobsRunning() const
{ {
return !m_jobQueue.isEmpty() || m_currentJob; return !m_jobQueue.isEmpty() || !m_priorityJobQueue.isEmpty() || m_currentJob;
} }
void LogEngine::setMaxLogEntries(int maxLogEntries, int trimSize) void LogEngine::setMaxLogEntries(int maxLogEntries, int trimSize)
@ -491,11 +491,12 @@ void LogEngine::trim()
void LogEngine::enqueJob(DatabaseJob *job, bool priority) void LogEngine::enqueJob(DatabaseJob *job, bool priority)
{ {
if (priority) { if (priority) {
m_jobQueue.prepend(job); m_priorityJobQueue.append(job);
qCDebug(dcLogEngine()) << "Scheduled priority job at position" << (m_priorityJobQueue.count() - 1) << "(" << m_priorityJobQueue.count() << "jobs in the queue)";
} else { } else {
m_jobQueue.append(job); m_jobQueue.append(job);
qCDebug(dcLogEngine()) << "Scheduled job at position" << (m_jobQueue.count() - 1) << "(" << m_jobQueue.count() << "jobs in the queue)";
} }
qCDebug(dcLogEngine()) << "Scheduled job at position" << (priority ? 0 : m_jobQueue.count() - 1) << "(" << m_jobQueue.count() << "jobs in the queue)";
processQueue(); processQueue();
} }
@ -505,7 +506,7 @@ void LogEngine::processQueue()
return; return;
} }
if (m_jobQueue.isEmpty()) { if (m_priorityJobQueue.isEmpty() && m_jobQueue.isEmpty()) {
emit jobsRunningChanged(); emit jobsRunningChanged();
return; return;
} }
@ -525,8 +526,15 @@ void LogEngine::processQueue()
} }
DatabaseJob *job = m_jobQueue.takeFirst(); DatabaseJob *job = nullptr;
qCDebug(dcLogEngine()) << "Processing DB queue. (" << m_jobQueue.count() << "jobs left in queue," << m_entryCount << "entries in DB)"; if (!m_priorityJobQueue.isEmpty()) {
job = m_priorityJobQueue.takeFirst();
qCDebug(dcLogEngine()) << "Processing DB priority queue. (" << m_priorityJobQueue.count() << "jobs left in queue," << m_entryCount << "entries in DB)";
} else {
job = m_jobQueue.takeFirst();
qCDebug(dcLogEngine()) << "Processing DB queue. (" << m_jobQueue.count() << "jobs left in queue," << m_entryCount << "entries in DB)";
}
m_currentJob = job; m_currentJob = job;
QFuture<DatabaseJob*> future = QtConcurrent::run([job](){ QFuture<DatabaseJob*> future = QtConcurrent::run([job](){

View File

@ -129,6 +129,7 @@ private:
QHash<QString, QList<DatabaseJob*>> m_flaggedJobs; QHash<QString, QList<DatabaseJob*>> m_flaggedJobs;
QList<DatabaseJob*> m_jobQueue; QList<DatabaseJob*> m_jobQueue;
QList<DatabaseJob*> m_priorityJobQueue;
DatabaseJob *m_currentJob = nullptr; DatabaseJob *m_currentJob = nullptr;
QFutureWatcher<DatabaseJob*> m_jobWatcher; QFutureWatcher<DatabaseJob*> m_jobWatcher;
}; };