Skip to content

Commit

Permalink
Cleanup DevEUI from DevAddr > DevEUI set, if DS does not exist.
Browse files Browse the repository at this point in the history
  • Loading branch information
brocaar committed Aug 31, 2022
1 parent d11e570 commit d47b36b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 6 deletions.
23 changes: 17 additions & 6 deletions internal/storage/device_session.go
Original file line number Diff line number Diff line change
Expand Up @@ -421,12 +421,23 @@ func GetDeviceSessionsForDevAddr(ctx context.Context, devAddr lorawan.DevAddr) (
for _, devEUI := range devEUIs {
s, err := GetDeviceSession(ctx, devEUI)
if err != nil {
// TODO: in case not found, remove the DevEUI from the list
log.WithError(err).WithFields(log.Fields{
"dev_addr": devAddr,
"dev_eui": devEUI,
"ctx_id": ctx.Value(logging.ContextIDKey),
}).Warning("get device-session for devaddr error")
if err == ErrDoesNotExist {
key := GetRedisKey(devAddrKeyTempl, devAddr)
if err := RedisClient().SRem(ctx, key, devEUI[:]).Err(); err != nil {
log.WithError(err).WithFields(log.Fields{
"dev_addr": devAddr,
"dev_eui": devEUI,
"ctx_id": ctx.Value(logging.ContextIDKey),
}).Error("remove deveui from devaddr set error")
}
} else {
log.WithError(err).WithFields(log.Fields{
"dev_addr": devAddr,
"dev_eui": devEUI,
"ctx_id": ctx.Value(logging.ContextIDKey),
}).Error("get device-session for devaddr error")
}

continue
}

Expand Down
36 changes: 36 additions & 0 deletions internal/storage/device_session_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,3 +356,39 @@ func TestGetFullFCntUp(t *testing.T) {
assert.Equalf(test.FullFCnt, out, "Test %d: expected %d, got %d", i, test.FullFCnt, out)
}
}

func TestGetDeviceSessionsForDevAddr(t *testing.T) {
assert := require.New(t)
conf := test.GetConfig()
assert.NoError(Setup(conf))

RedisClient().FlushAll(context.Background())

devAddr := lorawan.DevAddr{1, 2, 3, 4}
devEUI1 := lorawan.EUI64{1, 1, 1, 1, 1, 1, 1, 1}
devEUI2 := lorawan.EUI64{2, 2, 2, 2, 2, 2, 2, 2}

ds := DeviceSession{
DevAddr: devAddr,
DevEUI: devEUI1,
}
assert.NoError(SaveDeviceSession(context.Background(), ds))

key := GetRedisKey(devAddrKeyTempl, devAddr)
assert.NoError(RedisClient().SAdd(context.Background(), key, devEUI2[:]).Err())

euis, err := GetDevEUIsForDevAddr(context.Background(), devAddr)
assert.NoError(err)
assert.Len(euis, 2)

dss, err := GetDeviceSessionsForDevAddr(context.Background(), devAddr)
assert.NoError(err)
assert.Len(dss, 1)

// DevEUI2 should be removed from the set, as no device-session exists (anymore)
// for this DevEUI.
euis, err = GetDevEUIsForDevAddr(context.Background(), devAddr)
assert.NoError(err)
assert.Equal([]lorawan.EUI64{devEUI1}, euis)

}

0 comments on commit d47b36b

Please sign in to comment.