Mercurial > gemma
annotate auth/persistent.go @ 204:3d0988d9f867
De-virtualize the connection pool implementation.
The persistent connection pool implementation is
a superset of the in-memory implementation. The only
diffence in fact is that the in-memory variant does not
store anything to file. So the persistent implementation
is refactored in a way that it checks before each
persistence operation if storage is given or not.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 22 Jul 2018 10:23:03 +0200 |
parents | 6a802aed7f99 |
children |
rev | line source |
---|---|
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package auth |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import ( |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
4 "bytes" |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 "database/sql" |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 "log" |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
7 "time" |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
8 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
9 bolt "github.com/coreos/bbolt" |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 ) |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
12 type ConnectionPool struct { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
13 storage *bolt.DB |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
14 conns map[string]*Connection |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
15 cmds chan func(*ConnectionPool) |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
18 var sessionsBucket = []byte("sessions") |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
19 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
20 func NewConnectionPool(filename string) (*ConnectionPool, error) { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
21 |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
22 pcp := &ConnectionPool{ |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
23 cmds: make(chan func(*ConnectionPool)), |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
24 } |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
25 if err := pcp.openStorage(filename); err != nil { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
26 return nil, err |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
27 } |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
28 go pcp.run() |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
29 return pcp, nil |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
30 } |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
31 |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
32 // openStorage opens a storage file. |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
33 func (pcp *ConnectionPool) openStorage(filename string) error { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
34 |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
35 // No file, nothing to restore/persist. |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
36 if filename == "" { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
37 return nil |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
38 } |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
40 db, err := bolt.Open(filename, 0600, nil) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
41 if err != nil { |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
42 return err |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
43 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
44 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
45 conns := make(map[string]*Connection) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
46 err = db.Update(func(tx *bolt.Tx) error { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
47 b, err := tx.CreateBucketIfNotExists(sessionsBucket) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
48 if err != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
49 return err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
50 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
51 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
52 // pre-load sessions |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
53 c := b.Cursor() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
54 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
55 for k, v := c.First(); k != nil; k, v = c.Next() { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
56 var conn Connection |
197
e85413e5befa
Cleaned up serialisation/deserilisation of sessions a bit.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
193
diff
changeset
|
57 if err := conn.deserialize(bytes.NewReader(v)); err != nil { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
58 return err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
59 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
60 conns[string(k)] = &conn |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
61 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
62 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
63 return nil |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
64 }) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
65 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
66 if err != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
67 db.Close() |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
68 return err |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
69 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
70 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
71 pcp.storage = db |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
72 pcp.conns = conns |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
73 |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
74 return nil |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
77 func (pcp *ConnectionPool) run() { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
78 for { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
79 select { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
80 case cmd := <-pcp.cmds: |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
81 cmd(pcp) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
82 case <-time.After(time.Minute): |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
83 pcp.cleanDB() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
84 case <-time.After(time.Minute * 5): |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
85 pcp.cleanToken() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
86 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
87 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
88 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
89 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
90 func (pcp *ConnectionPool) cleanDB() { |
203
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
91 valid := time.Now().Add(-maxDBIdle) |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
92 for _, con := range pcp.conns { |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
93 if con.refCount <= 0 && con.last().Before(valid) { |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
94 con.close() |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
95 } |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
96 } |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
97 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
98 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
99 func (pcp *ConnectionPool) cleanToken() { |
203
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
100 now := time.Now() |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
101 for token, con := range pcp.conns { |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
102 expires := time.Unix(con.session.ExpiresAt, 0) |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
103 if expires.Before(now) { |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
104 // TODO: Be more graceful here? |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
105 con.close() |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
106 delete(pcp.conns, token) |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
107 pcp.remove(token) |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
108 } |
6a802aed7f99
Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
202
diff
changeset
|
109 } |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
110 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
111 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
112 func (pcp *ConnectionPool) remove(token string) { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
113 if pcp.storage == nil { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
114 return |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
115 } |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
116 err := pcp.storage.Update(func(tx *bolt.Tx) error { |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
117 b := tx.Bucket(sessionsBucket) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
118 return b.Delete([]byte(token)) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
119 }) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
120 if err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
121 log.Printf("error: %v\n", err) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
122 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
123 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
124 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
125 func (pcp *ConnectionPool) Delete(token string) bool { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
126 res := make(chan bool) |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
127 pcp.cmds <- func(pcp *ConnectionPool) { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
128 conn, found := pcp.conns[token] |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
129 if !found { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
130 res <- false |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
131 return |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
132 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
133 conn.close() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
134 delete(pcp.conns, token) |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
135 pcp.remove(token) |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
136 res <- true |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
137 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
138 return <-res |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
141 func (pcp *ConnectionPool) store(token string, con *Connection) { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
142 if pcp.storage == nil { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
143 return |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
144 } |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
145 err := pcp.storage.Update(func(tx *bolt.Tx) error { |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
146 b := tx.Bucket(sessionsBucket) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
147 var buf bytes.Buffer |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
148 if err := con.serialize(&buf); err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
149 return err |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
150 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
151 return b.Put([]byte(token), buf.Bytes()) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
152 }) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
153 if err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
154 log.Printf("error: %v\n", err) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
155 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
156 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
157 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
158 func (pcp *ConnectionPool) Add(token string, session *Session) *Connection { |
199
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
159 res := make(chan *Connection) |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
160 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
161 pcp.cmds <- func(cp *ConnectionPool) { |
199
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
162 con := pcp.conns[token] |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
163 if con == nil { |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
164 con = &Connection{} |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
165 pcp.conns[token] = con |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
166 } |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
167 con.set(session) |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
168 pcp.store(token, con) |
199
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
169 res <- con |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
170 } |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
171 |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
172 con := <-res |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
173 return con |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
175 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
176 func (pcp *ConnectionPool) Renew(token string) (string, error) { |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
177 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
178 type result struct { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
179 newToken string |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
180 err error |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
181 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
182 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
183 resCh := make(chan result) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
184 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
185 pcp.cmds <- func(cp *ConnectionPool) { |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
186 con := pcp.conns[token] |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
187 if con == nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
188 resCh <- result{err: ErrNoSuchToken} |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
189 } else { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
190 delete(pcp.conns, token) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
191 pcp.remove(token) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
192 newToken := GenerateSessionKey() |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
193 // TODO: Ensure that this is not racy! |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
194 con.session.ExpiresAt = time.Now().Add(maxTokenValid).Unix() |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
195 pcp.conns[newToken] = con |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
196 pcp.store(newToken, con) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
197 resCh <- result{newToken: newToken} |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
198 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
199 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
200 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
201 r := <-resCh |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
202 return r.newToken, r.err |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
203 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
204 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
205 func (pcp *ConnectionPool) trim(conn *Connection) { |
201
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
206 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
207 conn.refCount-- |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
208 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
209 for { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
210 least := time.Now() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
211 var count int |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
212 var oldest *Connection |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
213 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
214 for _, con := range pcp.conns { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
215 if con.db != nil && con.refCount <= 0 { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
216 if last := con.last(); last.Before(least) { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
217 least = last |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
218 oldest = con |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
219 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
220 count++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
221 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
222 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
223 if count <= maxOpen { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
224 break |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
225 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
226 oldest.close() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
227 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
228 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
229 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
230 func (pcp *ConnectionPool) Do(token string, fn func(*sql.DB) error) error { |
201
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
231 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
232 type result struct { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
233 con *Connection |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
234 err error |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
235 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
236 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
237 res := make(chan result) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
238 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
239 pcp.cmds <- func(pcp *ConnectionPool) { |
201
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
240 con := pcp.conns[token] |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
241 if con == nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
242 res <- result{err: ErrNoSuchToken} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
243 return |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
244 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
245 con.touch() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
246 // store the session here. The ref counting for |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
247 // open db connections is irrelevant for persistence |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
248 // as they all come up closed when the system reboots. |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
249 pcp.store(token, con) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
250 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
251 if con.db != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
252 con.refCount++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
253 res <- result{con: con} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
254 return |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
255 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
256 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
257 session := con.session |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
258 db, err := opendb(session.User, session.Password) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
259 if err != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
260 res <- result{err: err} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
261 return |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
262 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
263 con.db = db |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
264 con.refCount++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
265 res <- result{con: con} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
266 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
267 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
268 r := <-res |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
269 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
270 if r.err != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
271 return r.err |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
272 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
273 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
274 defer func() { |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
275 pcp.cmds <- func(pcp *ConnectionPool) { |
201
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
276 pcp.trim(r.con) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
277 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
278 }() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
279 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
280 return fn(r.con.db) |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
281 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
282 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
283 func (pcp *ConnectionPool) Session(token string) *Session { |
202
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
284 res := make(chan *Session) |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
285 pcp.cmds <- func(pcp *ConnectionPool) { |
202
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
286 con := pcp.conns[token] |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
287 if con == nil { |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
288 res <- nil |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
289 } else { |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
290 con.touch() |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
291 pcp.store(token, con) |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
292 res <- con.session |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
293 } |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
294 } |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
295 return <-res |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
296 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
297 |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
298 func (pcp *ConnectionPool) Shutdown() error { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
299 if db := pcp.storage; db != nil { |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
300 log.Println("info: shutdown persistent connection pool.") |
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
301 pcp.storage = nil |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
302 return db.Close() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
303 } |
204
3d0988d9f867
De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
203
diff
changeset
|
304 log.Println("info: shutdown in-memory connection pool.") |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
305 return nil |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
306 } |