From c96be9ee8d6da3fff4e253ab43853b6d1a599d75 Mon Sep 17 00:00:00 2001
From: Andrew Thornton <art27@cantab.net>
Date: Thu, 10 Feb 2022 20:33:55 +0000
Subject: [PATCH] Add number in queue status to monitor page

Add number in queue status to the monitor page so that administrators can
assess how much work is left to be done in the queues.

Signed-off-by: Andrew Thornton <art27@cantab.net>
---
 modules/queue/manager.go        | 10 ++++++++++
 modules/queue/queue_bytefifo.go |  7 +++++++
 modules/queue/workerpool.go     |  5 +++++
 options/locale/locale_en-US.ini |  1 +
 templates/admin/monitor.tmpl    |  2 ++
 templates/admin/queue.tmpl      |  2 ++
 6 files changed, 27 insertions(+)

diff --git a/modules/queue/manager.go b/modules/queue/manager.go
index 73c57540be85d..bba2c54ad21f5 100644
--- a/modules/queue/manager.go
+++ b/modules/queue/manager.go
@@ -84,6 +84,8 @@ type ManagedPool interface {
 	BoostWorkers() int
 	// SetPoolSettings sets the user updatable settings for the pool
 	SetPoolSettings(maxNumberOfWorkers, boostWorkers int, timeout time.Duration)
+	// NumberInQueue returns the total number of items in the pool
+	NumberInQueue() int64
 	// Done returns a channel that will be closed when the Pool's baseCtx is closed
 	Done() <-chan struct{}
 }
@@ -427,6 +429,14 @@ func (q *ManagedQueue) SetPoolSettings(maxNumberOfWorkers, boostWorkers int, tim
 	}
 }
 
+// NumberInQueue returns the number of items in the queue
+func (q *ManagedQueue) NumberInQueue() int64 {
+	if pool, ok := q.Managed.(ManagedPool); ok {
+		return pool.NumberInQueue()
+	}
+	return -1
+}
+
 func (l ManagedQueueList) Len() int {
 	return len(l)
 }
diff --git a/modules/queue/queue_bytefifo.go b/modules/queue/queue_bytefifo.go
index bf153d70bb751..ead3828f332b9 100644
--- a/modules/queue/queue_bytefifo.go
+++ b/modules/queue/queue_bytefifo.go
@@ -135,6 +135,13 @@ func (q *ByteFIFOQueue) IsEmpty() bool {
 	return q.byteFIFO.Len(q.terminateCtx) == 0
 }
 
+// NumberInQueue returns the number in the queue
+func (q *ByteFIFOQueue) NumberInQueue() int64 {
+	q.lock.Lock()
+	defer q.lock.Unlock()
+	return q.byteFIFO.Len(q.terminateCtx) + q.WorkerPool.NumberInQueue()
+}
+
 // Flush flushes the ByteFIFOQueue
 func (q *ByteFIFOQueue) Flush(timeout time.Duration) error {
 	select {
diff --git a/modules/queue/workerpool.go b/modules/queue/workerpool.go
index 100197c5e1f1f..5f6ec1871019e 100644
--- a/modules/queue/workerpool.go
+++ b/modules/queue/workerpool.go
@@ -204,6 +204,11 @@ func (p *WorkerPool) NumberOfWorkers() int {
 	return p.numberOfWorkers
 }
 
+// NumberInQueue returns the number of items in the queue
+func (p *WorkerPool) NumberInQueue() int64 {
+	return atomic.LoadInt64(&p.numInQueue)
+}
+
 // MaxNumberOfWorkers returns the maximum number of workers automatically added to the pool
 func (p *WorkerPool) MaxNumberOfWorkers() int {
 	p.lock.Lock()
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 1c4313247871a..d570085197ac2 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2818,6 +2818,7 @@ monitor.queue.type = Type
 monitor.queue.exemplar = Exemplar Type
 monitor.queue.numberworkers = Number of Workers
 monitor.queue.maxnumberworkers = Max Number of Workers
+monitor.queue.numberinqueue = Number in Queue
 monitor.queue.review = Review Config
 monitor.queue.review_add = Review/Add Workers
 monitor.queue.configuration = Initial Configuration
diff --git a/templates/admin/monitor.tmpl b/templates/admin/monitor.tmpl
index 8a90f9b6474cb..a35b587bd5092 100644
--- a/templates/admin/monitor.tmpl
+++ b/templates/admin/monitor.tmpl
@@ -48,6 +48,7 @@
 						<th>{{.i18n.Tr "admin.monitor.queue.type"}}</th>
 						<th>{{.i18n.Tr "admin.monitor.queue.exemplar"}}</th>
 						<th>{{.i18n.Tr "admin.monitor.queue.numberworkers"}}</th>
+						<th>{{.i18n.Tr "admin.monitor.queue.numberinqueue"}}</th>
 						<th></th>
 					</tr>
 				</thead>
@@ -58,6 +59,7 @@
 							<td>{{.Type}}</td>
 							<td>{{.ExemplarType}}</td>
 							<td>{{$sum := .NumberOfWorkers}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
+							<td>{{$sum := .NumberInQueue}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
 							<td><a href="{{$.Link}}/queue/{{.QID}}" class="button">{{if lt $sum 0}}{{$.i18n.Tr "admin.monitor.queue.review"}}{{else}}{{$.i18n.Tr "admin.monitor.queue.review_add"}}{{end}}</a>
 						</tr>
 					{{end}}
diff --git a/templates/admin/queue.tmpl b/templates/admin/queue.tmpl
index d2d2c83baf487..a08b44277cac6 100644
--- a/templates/admin/queue.tmpl
+++ b/templates/admin/queue.tmpl
@@ -15,6 +15,7 @@
 						<th>{{.i18n.Tr "admin.monitor.queue.exemplar"}}</th>
 						<th>{{.i18n.Tr "admin.monitor.queue.numberworkers"}}</th>
 						<th>{{.i18n.Tr "admin.monitor.queue.maxnumberworkers"}}</th>
+						<th>{{.i18n.Tr "admin.monitor.queue.numberinqueue"}}</th>
 					</tr>
 				</thead>
 				<tbody>
@@ -24,6 +25,7 @@
 						<td>{{.Queue.ExemplarType}}</td>
 						<td>{{$sum := .Queue.NumberOfWorkers}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
 						<td>{{if lt $sum 0}}-{{else}}{{.Queue.MaxNumberOfWorkers}}{{end}}</td>
+						<td>{{$sum := .Queue.NumberInQueue}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
 					</tr>
 				</tbody>
 			</table>