annotate pkg/geoserver/reconf.go @ 890:0a563fef64a9 geo-style

Reconfiguring GeoServer is now queued async. We should not reconfigure the remote until the initial config is done.
author Sascha L. Teichmann <teichmann@intevation.de>
date Tue, 02 Oct 2018 12:58:20 +0200
parents
children a244b18cb916
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
890
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
1 package geoserver
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
2
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
3 import (
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
4 "container/list"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
5 "log"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
6 "net"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
7 "net/url"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
8 "sync"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
9 "time"
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
10 )
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
11
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
12 var (
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
13 confQueue = list.New()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
14 confQueueCond = sync.NewCond(new(sync.Mutex))
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
15 )
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
16
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
17 func init() {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
18 go asyncConfigure()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
19 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
20
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
21 func asyncConfigure() {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
22 for {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
23 var fn func() error
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
24 confQueueCond.L.Lock()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
25 for confQueue.Len() == 0 {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
26 confQueueCond.Wait()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
27 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
28 fn = confQueue.Remove(confQueue.Front()).(func() error)
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
29 confQueueCond.L.Unlock()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
30 if err := reconfigure(fn); err != nil {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
31 log.Printf("warn: configure GeoServer failed: %v\n", err)
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
32 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
33 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
34 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
35
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
36 func reconfigure(fn func() error) error {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
37 log.Println("Configure GeoServer...")
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
38 const (
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
39 maxTries = 10
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
40 sleep = time.Second * 5
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
41 )
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
42 var err error
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
43 for try := 1; try <= maxTries; try++ {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
44 if err = fn(); err == nil {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
45 break
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
46 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
47 if try < maxTries {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
48 if uerr, ok := err.(*url.Error); ok {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
49 if oerr, ok := uerr.Err.(*net.OpError); ok && oerr.Op == "dial" {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
50 log.Printf("Failed attempt %d of %d to configure GeoServer. "+
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
51 "Will try again in %s...\n", try, maxTries, sleep)
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
52 time.Sleep(sleep)
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
53 continue
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
54 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
55 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
56 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
57 break
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
58 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
59 return err
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
60 }
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
61
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
62 func Reconfigure(fn func() error) {
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
63 confQueueCond.L.Lock()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
64 defer confQueueCond.L.Unlock()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
65 confQueue.PushBack(fn)
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
66 confQueueCond.Signal()
0a563fef64a9 Reconfiguring GeoServer is now queued async.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
67 }