@@ -7,7 +7,8 @@ defmodule Quantum.JobBroadcaster do
7
7
8
8
require Logger
9
9
10
- alias Quantum . { Job , Util }
10
+ alias Quantum . { Job , Util , Scheduler }
11
+ alias Quantum.Storage.Adapter
11
12
12
13
@ doc """
13
14
Start Job Broadcaster
@@ -18,24 +19,52 @@ defmodule Quantum.JobBroadcaster do
18
19
* `jobs` - Array of `Quantum.Job`
19
20
20
21
"""
21
- @ spec start_link ( GenServer . server ( ) , [ Job . t ( ) ] , boolean ( ) ) :: GenServer . on_start ( )
22
- def start_link ( name , jobs , debug_logging ) do
22
+ @ spec start_link ( GenServer . server ( ) , [ Job . t ( ) ] , Adapter , Scheduler , boolean ( ) ) ::
23
+ GenServer . on_start ( )
24
+ def start_link ( name , jobs , storage , scheduler , debug_logging ) do
23
25
__MODULE__
24
- |> GenStage . start_link ( { jobs , debug_logging } , name: name )
26
+ |> GenStage . start_link ( { jobs , storage , scheduler , debug_logging } , name: name )
25
27
|> Util . start_or_link ( )
26
28
end
27
29
28
30
@ doc false
29
- @ spec child_spec ( { GenServer . server ( ) , [ Job . t ( ) ] , boolean ( ) } ) :: Supervisor . child_spec ( )
30
- def child_spec ( { name , jobs , debug_logging } ) do
31
- % { super ( [ ] ) | start: { __MODULE__ , :start_link , [ name , jobs , debug_logging ] } }
31
+ @ spec child_spec ( { GenServer . server ( ) , [ Job . t ( ) ] , Adapter , Scheduler , boolean ( ) } ) ::
32
+ Supervisor . child_spec ( )
33
+ def child_spec ( { name , jobs , storage , scheduler , debug_logging } ) do
34
+ % {
35
+ super ( [ ] )
36
+ | start: { __MODULE__ , :start_link , [ name , jobs , storage , scheduler , debug_logging ] }
37
+ }
32
38
end
33
39
34
40
@ doc false
35
- def init ( { jobs , debug_logging } ) do
41
+ def init ( { jobs , storage , scheduler , debug_logging } ) do
42
+ effective_jobs =
43
+ scheduler
44
+ |> storage . jobs ( )
45
+ |> case do
46
+ :not_applicable ->
47
+ debug_logging &&
48
+ Logger . debug ( fn ->
49
+ "[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Loading Initial Jobs from Config"
50
+ end )
51
+
52
+ jobs
53
+
54
+ storage_jobs when is_list ( storage_jobs ) ->
55
+ debug_logging &&
56
+ Logger . debug ( fn ->
57
+ "[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Loading Initial Jobs from Storage, skipping config"
58
+ end )
59
+
60
+ storage_jobs
61
+ end
62
+
36
63
state = % {
37
- jobs: Enum . into ( jobs , % { } , fn % { name: name } = job -> { name , job } end ) ,
38
- buffer: for ( % { state: :active } = job <- jobs , do: { :add , job } ) ,
64
+ jobs: Enum . into ( effective_jobs , % { } , fn % { name: name } = job -> { name , job } end ) ,
65
+ buffer: for ( % { state: :active } = job <- effective_jobs , do: { :add , job } ) ,
66
+ storage: storage ,
67
+ scheduler: scheduler ,
39
68
debug_logging: debug_logging
40
69
}
41
70
@@ -50,39 +79,53 @@ defmodule Quantum.JobBroadcaster do
50
79
51
80
def handle_cast (
52
81
{ :add , % Job { state: :active , name: job_name } = job } ,
53
- % { jobs: jobs , debug_logging: debug_logging } = state
82
+ % { jobs: jobs , storage: storage , scheduler: scheduler , debug_logging: debug_logging } =
83
+ state
54
84
) do
55
85
debug_logging &&
56
86
Logger . debug ( fn ->
57
87
"[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Adding job #{ inspect ( job_name ) } "
58
88
end )
59
89
90
+ :ok = storage . add_job ( scheduler , job )
91
+
60
92
{ :noreply , [ { :add , job } ] , % { state | jobs: Map . put ( jobs , job_name , job ) } }
61
93
end
62
94
63
95
def handle_cast (
64
96
{ :add , % Job { state: :inactive , name: job_name } = job } ,
65
- % { jobs: jobs , debug_logging: debug_logging } = state
97
+ % { jobs: jobs , storage: storage , scheduler: scheduler , debug_logging: debug_logging } =
98
+ state
66
99
) do
67
100
debug_logging &&
68
101
Logger . debug ( fn ->
69
102
"[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Adding job #{ inspect ( job_name ) } "
70
103
end )
71
104
105
+ :ok = storage . add_job ( scheduler , job )
106
+
72
107
{ :noreply , [ ] , % { state | jobs: Map . put ( jobs , job_name , job ) } }
73
108
end
74
109
75
- def handle_cast ( { :delete , name } , % { jobs: jobs , debug_logging: debug_logging } = state ) do
110
+ def handle_cast (
111
+ { :delete , name } ,
112
+ % { jobs: jobs , storage: storage , scheduler: scheduler , debug_logging: debug_logging } =
113
+ state
114
+ ) do
76
115
debug_logging &&
77
116
Logger . debug ( fn ->
78
117
"[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Deleting job #{ inspect ( name ) } "
79
118
end )
80
119
81
120
case Map . fetch ( jobs , name ) do
82
121
{ :ok , % { state: :active } } ->
122
+ :ok = storage . delete_job ( scheduler , name )
123
+
83
124
{ :noreply , [ { :remove , name } ] , % { state | jobs: Map . delete ( jobs , name ) } }
84
125
85
126
{ :ok , % { state: :inactive } } ->
127
+ :ok = storage . delete_job ( scheduler , name )
128
+
86
129
{ :noreply , [ ] , % { state | jobs: Map . delete ( jobs , name ) } }
87
130
88
131
:error ->
@@ -92,7 +135,8 @@ defmodule Quantum.JobBroadcaster do
92
135
93
136
def handle_cast (
94
137
{ :change_state , name , new_state } ,
95
- % { jobs: jobs , debug_logging: debug_logging } = state
138
+ % { jobs: jobs , storage: storage , scheduler: scheduler , debug_logging: debug_logging } =
139
+ state
96
140
) do
97
141
debug_logging &&
98
142
Logger . debug ( fn ->
@@ -109,6 +153,8 @@ defmodule Quantum.JobBroadcaster do
109
153
{ :ok , job } ->
110
154
jobs = Map . update! ( jobs , name , & Job . set_state ( & 1 , new_state ) )
111
155
156
+ :ok = storage . update_job_state ( scheduler , job . name , new_state )
157
+
112
158
case new_state do
113
159
:active ->
114
160
{ :noreply , [ { :add , % { job | state: new_state } } ] , % { state | jobs: jobs } }
@@ -119,14 +165,20 @@ defmodule Quantum.JobBroadcaster do
119
165
end
120
166
end
121
167
122
- def handle_cast ( :delete_all , % { jobs: jobs , debug_logging: debug_logging } = state ) do
168
+ def handle_cast (
169
+ :delete_all ,
170
+ % { jobs: jobs , storage: storage , scheduler: scheduler , debug_logging: debug_logging } =
171
+ state
172
+ ) do
123
173
debug_logging &&
124
174
Logger . debug ( fn ->
125
175
"[#{ inspect ( Node . self ( ) ) } ][#{ __MODULE__ } ] Deleting all jobs"
126
176
end )
127
177
128
178
messages = for { name , % Job { state: :active } } <- jobs , do: { :remove , name }
129
179
180
+ :ok = storage . purge ( scheduler )
181
+
130
182
{ :noreply , messages , % { state | jobs: % { } } }
131
183
end
132
184
0 commit comments