Skip to content

Commit

Permalink
Improve message cache handling (#32)
Browse files Browse the repository at this point in the history
- Refactor read message caching
  - Move to Sender, to be remote device specific
- Use for all request messages (read, subscribe, unsubscribe, bind,
unbind)
- WriteApproval handling updates
  - Clean up approval msg cache on device disconnects
  - Make them remote device specific
- ReponseMsgCallbacks updates
- Support multiple callbacks for a single msgCounter (required due to
request caching)
- datagram addition fixes
  • Loading branch information
DerAndereAndi committed Sep 7, 2024
2 parents dd82619 + ee706e3 commit 4e14507
Show file tree
Hide file tree
Showing 32 changed files with 435 additions and 220 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
file: coverage.out

- name: Run Gosec Security Scanner
uses: securego/gosec@master
uses: securego/gosec@v2.20.0
with:
# we let the report trigger content trigger a failure using the GitHub Security features.
args: '-no-fail -fmt sarif -out results.sarif ./...'
Expand Down
3 changes: 3 additions & 0 deletions api/feature.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ type FeatureLocalInterface interface {
// Overwrite the default 1 minute timeout for write approvals
SetWriteApprovalTimeout(duration time.Duration)

// Clean all device specific caches
CleanCaches(ski string)

// return all functions
Functions() []model.FunctionType

Expand Down
2 changes: 2 additions & 0 deletions api/sender.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ type ComControlInterface interface {
}

type SenderInterface interface {
// Process a received message, e.g. for handling caching data
ProcessResponseForMsgCounterReference(msgCounterRef *model.MsgCounterType)
// Sends a read cmd to request some data
Request(cmdClassifier model.CmdClassifierType, senderAddress, destinationAddress *model.FeatureAddressType, ackRequest bool, cmd []model.CmdType) (*model.MsgCounterType, error)
// Sends a result cmd with no error to indicate that a message was processed successfully
Expand Down
2 changes: 1 addition & 1 deletion mocks/BindingManagerInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/ComControlInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/DeviceInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/DeviceLocalInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/DeviceRemoteInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/EntityInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/EntityLocalInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/EntityRemoteInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/EventHandlerInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/FeatureInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 34 additions & 1 deletion mocks/FeatureLocalInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/FeatureRemoteInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/FunctionDataCmdInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/FunctionDataInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/HeartbeatManagerInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 34 additions & 1 deletion mocks/NodeManagementInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/OperationsInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 34 additions & 1 deletion mocks/SenderInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/SubscriptionManagerInterface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion mocks/WriteApprovalCallbackFunc.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 12 additions & 3 deletions model/datagram_additions.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,18 @@ func (d *DatagramType) PrintMessageOverview(send bool, localFeature, remoteFeatu
device = fmt.Sprintf("%s:%s to %s", device, remoteFeature, localFeature)
}

cmdClassifier := *d.Header.CmdClassifier
msgCounter := *d.Header.MsgCounter
cmd := d.Payload.Cmd[0]
cmdClassifier := CmdClassifierType("Unknown")
if d.Header.CmdClassifier != nil {
cmdClassifier = *d.Header.CmdClassifier
}
msgCounter := MsgCounterType(0)
if d.Header.MsgCounter != nil {
msgCounter = *d.Header.MsgCounter
}
cmd := CmdType{}
if len(d.Payload.Cmd) > 0 {
cmd = d.Payload.Cmd[0]
}

switch cmdClassifier {
case CmdClassifierTypeRead:
Expand Down
25 changes: 20 additions & 5 deletions model/datagram_additions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,18 @@ import (
"testing"

"github.com/enbility/spine-go/util"
"github.com/stretchr/testify/assert"
)

const emptyResult string = "Send: Unknown 0 unknown"

func TestTestPrintMessageOverview_Emtpty(t *testing.T) {
datagram := &DatagramType{}

result := datagram.PrintMessageOverview(true, "", "")
assert.Equal(t, emptyResult, result)
}

func TestPrintMessageOverview_Read_Send(t *testing.T) {
datagram := &DatagramType{
Header: HeaderType{
Expand All @@ -25,7 +35,8 @@ func TestPrintMessageOverview_Read_Send(t *testing.T) {
},
}

datagram.PrintMessageOverview(false, "", "")
result := datagram.PrintMessageOverview(false, "", "")
assert.NotEqual(t, emptyResult, result)
}

func TestPrintMessageOverview_Read_Recv(t *testing.T) {
Expand All @@ -45,7 +56,8 @@ func TestPrintMessageOverview_Read_Recv(t *testing.T) {
},
}

datagram.PrintMessageOverview(true, "", "")
result := datagram.PrintMessageOverview(true, "", "")
assert.NotEqual(t, emptyResult, result)
}

func TestPrintMessageOverview_Reply_Recv(t *testing.T) {
Expand All @@ -66,7 +78,8 @@ func TestPrintMessageOverview_Reply_Recv(t *testing.T) {
},
}

datagram.PrintMessageOverview(true, "", "")
result := datagram.PrintMessageOverview(true, "", "")
assert.NotEqual(t, emptyResult, result)
}

func TestPrintMessageOverview_Result_Recv(t *testing.T) {
Expand All @@ -91,7 +104,8 @@ func TestPrintMessageOverview_Result_Recv(t *testing.T) {
},
}

datagram.PrintMessageOverview(true, "", "")
result := datagram.PrintMessageOverview(true, "", "")
assert.NotEqual(t, emptyResult, result)
}

func TestPrintMessageOverview_Write_Recv(t *testing.T) {
Expand All @@ -112,5 +126,6 @@ func TestPrintMessageOverview_Write_Recv(t *testing.T) {
},
}

datagram.PrintMessageOverview(true, "", "")
result := datagram.PrintMessageOverview(true, "", "")
assert.NotEqual(t, emptyResult, result)
}
7 changes: 7 additions & 0 deletions spine/device_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,13 @@ func (r *DeviceLocal) RemoveRemoteDevice(ski string) {
if len(r.remoteDevices) == 0 {
_ = Events.unsubscribe(api.EventHandlerLevelCore, r)
}

// remove all data caches for this device
for _, entity := range r.entities {
for _, feature := range entity.Features() {
feature.CleanCaches(ski)
}
}
}

func (r *DeviceLocal) RemoteDevices() []api.DeviceRemoteInterface {
Expand Down
5 changes: 5 additions & 0 deletions spine/device_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,11 @@ func (d *DeviceRemote) HandleSpineMesssage(message []byte) (*model.MsgCounterTyp
if err := json.Unmarshal([]byte(message), &datagram); err != nil {
return nil, err
}

if datagram.Datagram.Header.MsgCounterReference != nil {
d.sender.ProcessResponseForMsgCounterReference(datagram.Datagram.Header.MsgCounterReference)
}

err := d.localDevice.ProcessCmd(datagram.Datagram, d)
if err != nil {
logging.Log().Trace(err)
Expand Down
Loading

0 comments on commit 4e14507

Please sign in to comment.