Skip to content

Commit e6a82b8

Browse files
authored
Merge pull request #28 from modalsource/QueraTeam-postal-feature/server-priority-queue
Replica: Add priority field to server
2 parents f030dcc + a639525 commit e6a82b8

File tree

6 files changed

+32
-8
lines changed

6 files changed

+32
-8
lines changed

app/controllers/servers_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def unsuspend
9797
private
9898

9999
def safe_params(*extras)
100-
params.require(:server).permit(:name, :mode, :ip_pool_id, *extras)
100+
params.require(:server).permit(:name, :mode, :priority, :ip_pool_id, *extras)
101101
end
102102

103103
end

app/lib/worker/jobs/process_queued_messages_job.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,18 @@ def local_ip?(ip)
4040
end
4141

4242
# Obtain a queued message from the database for processing
43+
# Messages are prioritized based on the server's priority (higher priority first)
44+
# and then by the message ID (ascending order).
4345
#
4446
# @return [void]
4547
def lock_message_for_processing
46-
QueuedMessage.where(ip_address_id: [nil, @ip_addresses])
47-
.where(locked_by: nil, locked_at: nil)
48-
.ready_with_delayed_retry
49-
.limit(1)
50-
.update_all(locked_by: @locker, locked_at: @lock_time)
48+
QueuedMessage.joins(:server)
49+
.where(ip_address_id: [nil, @ip_addresses])
50+
.where(locked_by: nil, locked_at: nil)
51+
.ready_with_delayed_retry
52+
.order("servers.priority DESC, queued_messages.id ASC")
53+
.limit(1)
54+
.update_all(locked_by: @locker, locked_at: @lock_time)
5155
end
5256

5357
# Get a full list of all messages which we can process (i.e. those which have just

app/models/server.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,12 @@ class Server < ApplicationRecord
7979
validates :mode, inclusion: { in: MODES }
8080
validates :permalink, presence: true, uniqueness: { scope: :organization_id, case_sensitive: false }, format: { with: /\A[a-z0-9-]*\z/ }, exclusion: { in: RESERVED_PERMALINKS }
8181
validate :validate_ip_pool_belongs_to_organization
82-
82+
validates :priority, presence: true, numericality: {
83+
only_integer: true,
84+
greater_than_or_equal_to: 0,
85+
less_than_or_equal_to: 32767,
86+
message: "must be a whole number between 0 and 32,767"
87+
}
8388
before_validation(on: :create) do
8489
self.token = token.downcase if token
8590
end

app/views/servers/_form.html.haml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@
2020
e-mail will be routed normally to the intended recipients. When in <b>Development</b> mode,
2121
outgoing & incoming mail will be held and only visible in the web interface and will not be
2222
sent to any recipients or HTTP endpoints.
23+
.fieldSet__field
24+
= f.label :priority, "Sending Priority", :class => 'fieldSet__label'
25+
.fieldSet__input
26+
= f.text_field :priority,
27+
:class => 'input input--text',
28+
:placeholder => "e.g. 10"
29+
%p.fieldSet__text
30+
Set a priority for this server's outgoing mail. Messages from servers with a higher number will be sent first.
31+
The default is <b>0</b>.
2332

2433
- if Postal.ip_pools?
2534
.fieldSet__field
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddPriorityToServer < ActiveRecord::Migration[7.0]
2+
def change
3+
add_column :servers, :priority, :integer, limit: 2, unsigned: true, default: 0
4+
end
5+
end

db/schema.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.0].define(version: 2025_07_16_102600) do
13+
ActiveRecord::Schema[7.0].define(version: 2025_09_15_065902) do
1414
create_table "additional_route_endpoints", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
1515
t.integer "route_id"
1616
t.string "endpoint_type"
@@ -256,6 +256,7 @@
256256
t.index ["permalink"], name: "index_servers_on_permalink", length: 6
257257
t.index ["token"], name: "index_servers_on_token", length: 6
258258
t.index ["uuid"], name: "index_servers_on_uuid", length: 8
259+
t.integer "priority", limit: 2, default: 0, unsigned: true
259260
end
260261

261262
create_table "smtp_endpoints", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|

0 commit comments

Comments
 (0)