mirror of
https://github.com/vacp2p/mvds.git
synced 2026-01-08 19:48:03 -05:00
* protobuf * do not send ack when not required * remove from state if no ack required * different send modes * fix * updated * retransmit fix * updated * fixed * renamed to ephemeral * repeated * gen * resolution * cleanup * rough dependency code * todo * removed * only stores if ephemeral * started implementing the algo * simplified * updated * we never store ephemeral messages so we did not need * adds parents * new schema * tx to insert * err * removed old * fixed * changed log * test persistence of parents * removed * rename * ignoring * Update store/messagestore_sqlite.go Co-Authored-By: Adam Babik <adam@status.im> * Update node/node.go Co-Authored-By: Adam Babik <adam@status.im> * Update node/node.go Co-Authored-By: Adam Babik <adam@status.im> * Update node/node.go Co-Authored-By: Adam Babik <adam@status.im> * more fixes * Update store/messagestore_sqlite.go Co-Authored-By: Adam Babik <adam@status.im> * more fixes * using refs * Update node/node.go Co-Authored-By: Adam Babik <adam@status.im> * finished * Update store/messagestore_sqlite.go Co-Authored-By: Adam Babik <adam@status.im> * Update 1572372377_initial_schema.down.sql * desc + refactor * started refactoring resolution * Update README.md * rewrote resolve * mutex * todo * fixes * sql impl * added test * log * updates * updated * little bug * fix * added test * first changes from @adambabik * moved * fixed test, started eventual ones * fixed eventually test * mock install * consistent test * mock * fix lint * Update dependency/tracker_sqlite.go Co-Authored-By: Adam Babik <adam@status.im> * fix
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package dependency
|
|
|
|
import (
|
|
"reflect"
|
|
"sync"
|
|
|
|
"github.com/vacp2p/mvds/state"
|
|
)
|
|
|
|
// Verify that Tracker interface is implemented.
|
|
var _ Tracker = (*inMemoryTracker)(nil)
|
|
|
|
type inMemoryTracker struct {
|
|
sync.Mutex
|
|
|
|
dependents map[state.MessageID][]state.MessageID
|
|
dependencies map[state.MessageID]int
|
|
|
|
}
|
|
|
|
func NewInMemoryTracker() *inMemoryTracker {
|
|
return &inMemoryTracker{
|
|
dependents: make(map[state.MessageID][]state.MessageID),
|
|
dependencies: make(map[state.MessageID]int),
|
|
}
|
|
}
|
|
|
|
func (md *inMemoryTracker) Add(msg, dependency state.MessageID) error {
|
|
md.Lock()
|
|
defer md.Unlock()
|
|
// @todo check it wasn't already added
|
|
md.dependents[dependency] = append(md.dependents[dependency], msg)
|
|
md.dependencies[msg] += 1
|
|
return nil
|
|
}
|
|
|
|
func (md *inMemoryTracker) Dependants(id state.MessageID) ([]state.MessageID, error) {
|
|
md.Lock()
|
|
defer md.Unlock()
|
|
|
|
return md.dependents[id], nil
|
|
}
|
|
|
|
func (md *inMemoryTracker) Resolve(msg state.MessageID, dependency state.MessageID) error {
|
|
md.Lock()
|
|
defer md.Unlock()
|
|
|
|
for i, item := range md.dependents[dependency] {
|
|
if !reflect.DeepEqual(msg[:], item[:]) {
|
|
continue
|
|
}
|
|
|
|
md.dependents[dependency] = remove(md.dependents[dependency], i)
|
|
md.dependencies[msg] -= 1
|
|
return nil
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (md *inMemoryTracker) IsResolved(id state.MessageID) (bool, error) {
|
|
md.Lock()
|
|
defer md.Unlock()
|
|
|
|
return md.dependencies[id] == 0, nil
|
|
}
|
|
|
|
func remove(s []state.MessageID, i int) []state.MessageID {
|
|
s[len(s)-1], s[i] = s[i], s[len(s)-1]
|
|
return s[:len(s)-1]
|
|
}
|