Skip to content

Commit 7dc7214

Browse files
committed
Migrate data. Update changelog.
1 parent b515402 commit 7dc7214

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

cmd/loraserver/main.go

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/brocaar/loraserver/internal/backend/controller"
2929
"github.com/brocaar/loraserver/internal/backend/gateway"
3030
"github.com/brocaar/loraserver/internal/common"
31+
"github.com/brocaar/loraserver/internal/migration"
3132
"github.com/brocaar/loraserver/internal/uplink"
3233
"github.com/brocaar/lorawan"
3334
"github.com/brocaar/lorawan/band"
@@ -83,6 +84,11 @@ func run(c *cli.Context) error {
8384

8485
lsCtx := mustGetContext(netID, c)
8586

87+
// migrate old node-session keys to new layout
88+
if err = migration.MigrateNodeSessionDevAddrDevEUI(lsCtx.RedisPool); err != nil {
89+
log.Fatalf("node-session migration error: %s", err)
90+
}
91+
8692
// start the api server
8793
log.WithFields(log.Fields{
8894
"bind": c.String("bind"),

docs/changelog.md

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## 0.15.0
4+
5+
**Features:**
6+
7+
* Node-sessions are now stored by `DevEUI`. Before the node-sessions were stored
8+
by `DevAddr`. In case a single `DevAddr` is used by multiple nodes, the
9+
`NwkSKey` is used for retrieving the corresponding node-session.
10+
11+
*Note:* Data will be automatically migrated into the new format. As this process
12+
is not reversible it is recommended to make a backup of the Redis database before
13+
upgrading.
14+
315
## 0.14.1
416

517
**Bugfixes:**

internal/migration/node_session.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package migration
2+
3+
import (
4+
"bytes"
5+
"encoding/gob"
6+
"fmt"
7+
8+
log "github.com/Sirupsen/logrus"
9+
"github.com/brocaar/loraserver/internal/session"
10+
"github.com/garyburd/redigo/redis"
11+
)
12+
13+
// MigrateNodeSessionDevAddrDevEUI migrates the node-sessions from DevAddr to
14+
// DevEUI identifier.
15+
func MigrateNodeSessionDevAddrDevEUI(p *redis.Pool) error {
16+
c := p.Get()
17+
defer c.Close()
18+
19+
keys, err := redis.Strings(c.Do("KEYS", "node_session_????????")) // only match DevAddr (e.g. 01020304)
20+
if err != nil {
21+
return fmt.Errorf("get keys error: %s", err)
22+
}
23+
24+
var errCount int
25+
26+
for _, key := range keys {
27+
if err := migrateNodeSession(p, key); err != nil {
28+
log.WithField("key", key).Errorf("migrate node-session error: %s", err)
29+
errCount++
30+
}
31+
}
32+
33+
log.WithFields(log.Fields{
34+
"migrated": len(keys) - errCount,
35+
"errors": errCount,
36+
}).Infof("migrated node-sessions to new format")
37+
return nil
38+
}
39+
40+
func migrateNodeSession(p *redis.Pool, key string) error {
41+
var ns session.NodeSession
42+
43+
c := p.Get()
44+
defer c.Close()
45+
46+
// get node-session from old key
47+
val, err := redis.Bytes(c.Do("GET", key))
48+
if err != nil {
49+
return fmt.Errorf("get key error: %s", err)
50+
}
51+
err = gob.NewDecoder(bytes.NewReader(val)).Decode(&ns)
52+
if err != nil {
53+
return fmt.Errorf("decode node-session error: %s", err)
54+
}
55+
56+
// save node-session (using new key layout)
57+
err = session.SaveNodeSession(p, ns)
58+
if err != nil {
59+
return fmt.Errorf("save node-session error: %s", err)
60+
}
61+
62+
// delete the old key
63+
_, err = redis.Int(c.Do("DEL", key))
64+
if err != nil {
65+
return fmt.Errorf("delete key error: %s", err)
66+
}
67+
68+
return nil
69+
}

mkdocs.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pages:
1414
- changelog.md
1515

1616
extra:
17-
version: '0.14.1'
17+
version: '0.15.0'
1818
github:
1919
download_release: true
2020

0 commit comments

Comments
 (0)