Skip to content
This repository was archived by the owner on May 16, 2022. It is now read-only.

Commit 6b5f2a0

Browse files
committed
wip: gobler separate conf, PickNext()
1 parent 61439e8 commit 6b5f2a0

File tree

2 files changed

+91
-29
lines changed

2 files changed

+91
-29
lines changed

cmd/gobler/gobler.conf

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"logfile": "",
3+
"defaultconnector": "msteams",
4+
"connectors": {
5+
"msteams": {
6+
"name": "dev channel",
7+
"renderToFile": "no",
8+
"spoolDir": "/tmp",
9+
"adaptiveCardTemplate": "/etc/slurm/adaptive_card_template.json",
10+
"url": "http://localhost:9999/",
11+
"useLookup": "GECOS",
12+
"monitorT": "10",
13+
"pickerT": "2"
14+
},
15+
"mailto": {
16+
"name": "original slurm mail functionality, extended.",
17+
"mailCmd": "/etc/slurm/mail.sh",
18+
"mailCmdParams": "-s \"Job {{ .SlurmEnvironment.SLURM_JOB_ID }} ({{ .SlurmEnvironment.SLURM_JOB_NAME }}) {{ .SlurmEnvironment.SLURM_JOB_MAIL_TYPE }}\"",
19+
"mailTemplate": "/etc/slurm/mailTemplate.tmpl",
20+
"allowList": "pja",
21+
"blockList": "",
22+
"spoolDir": "/tmp/mailspool",
23+
"monitorT": "20",
24+
"pickerT": "5"
25+
},
26+
"textfile": {
27+
"path": "/tmp"
28+
}
29+
}
30+
}

cmd/gobler/gobler.go

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"log"
88
"os"
9+
"strconv"
910
"sync"
1011
"time"
1112

@@ -22,11 +23,13 @@ type MsgList []message.MessagePack
2223
type monitor struct {
2324
connector string
2425
spoolDir string
26+
monitorT time.Duration
2527
}
2628

2729
type picker struct {
2830
connector string
2931
msgcount map[string]int
32+
pickerT time.Duration
3033
}
3134

3235
type sender struct {
@@ -35,21 +38,34 @@ type sender struct {
3538
conn connectors.Connector
3639
}
3740

38-
func NewPicker(c string) (*picker, error) {
39-
var p picker
41+
func NewPicker(c string, t string) (*picker, error) {
42+
var (
43+
p picker
44+
err error
45+
)
4046

4147
p.connector = c
4248
p.msgcount = map[string]int{}
49+
T, err := strconv.ParseUint(t, 10, 64)
50+
if err != nil {
51+
return nil, err
52+
}
53+
p.pickerT = time.Duration(T)
4354

4455
return &p, nil
4556
}
4657

47-
func NewMonitor(c string, s string) (*monitor, error) {
58+
func NewMonitor(c string, s string, t string) (*monitor, error) {
4859
var m monitor
4960

5061
if s != "" {
5162
m.connector = c
5263
m.spoolDir = s
64+
T, err := strconv.ParseUint(t, 10, 64)
65+
if err != nil {
66+
return nil, err
67+
}
68+
m.monitorT = time.Duration(T)
5369
} else {
5470
return nil, errors.New("no spooldir, aborting")
5571
}
@@ -109,6 +125,23 @@ func (s *sender) SenderWorker(psCh <-chan *spool.FileGob, psfCh chan<- *spool.Fi
109125
return nil
110126
}
111127

128+
func (p *picker) PickNext(allGobs *spool.SpooledGobs) (*spool.FileGob, error) {
129+
130+
var nextgob spool.FileGob
131+
132+
if len(*allGobs) == 0 {
133+
return nil, errors.New("no gobs in spool")
134+
}
135+
136+
// here implement something meaningful
137+
for _, v := range *allGobs {
138+
nextgob = v
139+
break
140+
}
141+
142+
return &nextgob, nil
143+
}
144+
112145
func (p *picker) PickerWorker(mpCh <-chan *spool.SpooledGobs, psCh chan<- *spool.FileGob, psfCh <-chan *spool.FileGob, wg *sync.WaitGroup, l *log.Logger) error {
113146

114147
var newgobs *spool.SpooledGobs
@@ -118,8 +151,9 @@ func (p *picker) PickerWorker(mpCh <-chan *spool.SpooledGobs, psCh chan<- *spool
118151

119152
l.Println("======================= Picker start ===========================================")
120153
// configurable picker/sender frequency
121-
ticker := time.Tick(1 * time.Second)
154+
ticker := time.Tick(p.pickerT * time.Second)
122155
for {
156+
l.Printf("PICKER %s: Users msg count %v\n", p.connector, p.msgcount)
123157
select {
124158
case newgobs = <-mpCh:
125159
l.Printf("PICKER %s: Received gobs %#v\n", p.connector, newgobs)
@@ -133,15 +167,16 @@ func (p *picker) PickerWorker(mpCh <-chan *spool.SpooledGobs, psCh chan<- *spool
133167
l.Printf("PICKER %s: Received FAILED gob %#v\n", p.connector, failedGob)
134168
// return to allGobs
135169
allGobs[failedGob.Filename] = *failedGob
170+
p.msgcount[failedGob.User]++
136171
default:
137172
l.Printf("PICKER %s: allGobs: %#v\n", p.connector, allGobs)
138173
// HERE, call the Pick() and Send()
139-
for k, v := range allGobs {
140-
// pick first, send and delete
141-
l.Printf("PICK %s: SEND to Sender: %#v\n", p.connector, v)
142-
psCh <- &v
143-
delete(allGobs, k)
144-
break
174+
nextGob, err := p.PickNext(&allGobs)
175+
if err == nil {
176+
l.Printf("PICKER %s: SEND to Sender: %#v\n", p.connector, nextGob)
177+
p.msgcount[nextGob.User]--
178+
psCh <- nextGob
179+
delete(allGobs, nextGob.Filename)
145180
}
146181
}
147182
<-ticker
@@ -159,10 +194,10 @@ func (m *monitor) MonitorWorker(ch chan<- *spool.SpooledGobs, wg *sync.WaitGroup
159194

160195
defer wg.Done()
161196
// configurable monitor timer
162-
ticker := time.Tick(10 * time.Second)
197+
ticker := time.Tick(m.monitorT * time.Second)
163198

164199
l.Println("======================= Monitor start ==========================================")
165-
l.Printf("MON %s Starting\n", m.connector)
200+
l.Printf("MONITOR %s Starting\n", m.connector)
166201
sp, err := spool.NewSpool(m.spoolDir)
167202
if err != nil {
168203
return err
@@ -173,7 +208,7 @@ func (m *monitor) MonitorWorker(ch chan<- *spool.SpooledGobs, wg *sync.WaitGroup
173208
newList, err = sp.GetSpooledGobsList()
174209
lock.Unlock()
175210
if err != nil {
176-
l.Printf("MON %s: Failed on Getspooledgobslist(), error %s\n", m.connector, err)
211+
l.Printf("MONITOR %s: Failed on Getspooledgobslist(), error %s\n", m.connector, err)
177212
return err
178213
}
179214
// iterate over newlist and each file that doesn't exist in old, put into newfiles to be sent to the Picker
@@ -185,15 +220,15 @@ func (m *monitor) MonitorWorker(ch chan<- *spool.SpooledGobs, wg *sync.WaitGroup
185220
// exists in old, do nothing
186221
}
187222
}
188-
l.Printf("MON %s: Sending newFiles list: %#v\n", m.connector, newFiles)
223+
l.Printf("MONITOR %s: Sending newFiles list: %#v\n", m.connector, newFiles)
189224
// send new-found files
190225
ch <- newFiles
191226
// oldlist=newlist
192227
oldList = newList
193228
// empty newfiles for the next iteration
194229
newFiles = &spool.SpooledGobs{}
195230

196-
l.Printf("MON %s: Sleeping.\n", m.connector)
231+
l.Printf("MONITOR %s: Sleeping.\n", m.connector)
197232
//time.Sleep(5 * time.Second)
198233
//l.Printf("Time: %s\n", <-ticker)
199234
<-ticker
@@ -211,12 +246,11 @@ func main() {
211246
wg sync.WaitGroup
212247
)
213248

214-
// read configuration
215-
// how to handle hardcoding config file?
249+
// read gobler configuration
216250
cfg := config.NewConfigContainer()
217-
err := cfg.GetConfig("/etc/slurm/goslmailer.conf")
251+
err := cfg.GetConfig("/etc/slurm/gobler.conf")
218252
if err != nil {
219-
fmt.Printf("getConfig failed: %s", err)
253+
fmt.Printf("getConfig(gobconfig) failed: %s", err)
220254
os.Exit(1)
221255
}
222256

@@ -247,29 +281,27 @@ func main() {
247281
// configurable buffer size
248282
psChan := make(chan *spool.FileGob, 1)
249283
psChanFailed := make(chan *spool.FileGob, 1)
250-
mon, err := NewMonitor(con, spd)
284+
mon, err := NewMonitor(con, spd, cfg.Connectors[con]["monitorT"])
251285
if err != nil {
252-
log.Println("Monitor inst failed")
286+
log.Printf("Monitor %s inst FAILED\n", con)
253287
} else {
254-
log.Println("Monitor startup...")
288+
log.Printf("Monitor %s startup...\n", con)
255289
wg.Add(1)
256290
go mon.MonitorWorker(mpChan, &wg, log)
257-
log.Println("Monitor exit...")
258291
}
259-
pickr, err := NewPicker(con)
292+
pickr, err := NewPicker(con, cfg.Connectors[con]["pickerT"])
260293
if err != nil {
261-
log.Println("Picker inst failed")
294+
log.Printf("Picker %s inst FAILED\n", con)
262295
} else {
263-
log.Println("Picker startup...")
296+
log.Printf("Picker %s startup...\n", con)
264297
wg.Add(1)
265298
go pickr.PickerWorker(mpChan, psChan, psChanFailed, &wg, log)
266-
log.Println("Monitor exit...")
267299
}
268300
sendr, err := NewSender(con, cfg.Connectors[con]["spoolDir"], &conns)
269301
if err != nil {
270-
log.Println("Sender inst failed")
302+
log.Printf("Sender %s inst failed\n", con)
271303
} else {
272-
log.Println("Sender startup...")
304+
log.Printf("Sender %s startup...\n", con)
273305
wg.Add(1)
274306
go sendr.SenderWorker(psChan, psChanFailed, &wg, log)
275307
log.Println("Sender exit...")

0 commit comments

Comments
 (0)