Skip to content
Snippets Groups Projects
Commit 3e2ace43 authored by Hans Moog's avatar Hans Moog
Browse files

Feat: finished merging of realities

parent 1c7634f2
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,7 @@ require (
github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341
github.com/rivo/uniseg v0.1.0 // indirect
github.com/stretchr/objx v0.2.0 // indirect
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd // indirect
golang.org/x/text v0.3.2 // indirect
......
......@@ -111,6 +111,8 @@ golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaE
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM=
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss=
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
......@@ -131,6 +133,7 @@ golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
......
......@@ -4,8 +4,9 @@ import (
"reflect"
"sort"
"github.com/iotaledger/goshimmer/packages/errors"
"golang.org/x/crypto/blake2b"
"github.com/iotaledger/goshimmer/packages/errors"
"github.com/iotaledger/goshimmer/packages/objectstorage"
)
......@@ -178,15 +179,26 @@ func (ledgerState *LedgerState) MergeRealities(realityIds ...RealityId) *objects
aggregatedReality.Release()
}
// TODO: SORT BY BYTES FASTER WITHOUT CONVERTING TO STRING
sort.Slice(aggregatedRealityIds, func(i, j int) bool {
return string(aggregatedRealityIds[i][:]) < string(aggregatedRealityIds[j][:])
for k := 0; k < len(aggregatedRealityIds[k]); k++ {
if aggregatedRealityIds[i][k] < aggregatedRealityIds[j][k] {
return true
} else if aggregatedRealityIds[i][k] > aggregatedRealityIds[j][k] {
return false
}
}
return false
})
// TODO: CALCULATE REALITY ID INSTEAD OF MAIN_REALITY_ID
aggregatedReality := newReality(MAIN_REALITY_ID, aggregatedRealityIds...)
aggregatedRealityId := make([]byte, 0)
for _, realityId := range aggregatedRealityIds {
aggregatedRealityId = append(aggregatedRealityId, realityId[:]...)
}
aggregatedReality := newReality(blake2b.Sum256(aggregatedRealityId), aggregatedRealityIds...)
aggregatedReality.ledgerState = ledgerState
return ledgerState.realities.Store(aggregatedReality)
return ledgerState.realities.Prepare(aggregatedReality)
}
}
......
......@@ -16,6 +16,7 @@ var (
addressHash3 = NewAddressHash("ADDRESS3")
addressHash4 = NewAddressHash("ADDRESS4")
pendingReality = NewRealityId("PENDING")
conflictingReality = NewRealityId("CONFLICTING")
)
func Test(t *testing.T) {
......@@ -24,8 +25,11 @@ func Test(t *testing.T) {
)
ledgerState.CreateReality(pendingReality)
ledgerState.CreateReality(conflictingReality)
ledgerState.MergeRealities(pendingReality, MAIN_REALITY_ID).Release()
mergedReality := ledgerState.MergeRealities(pendingReality, MAIN_REALITY_ID, conflictingReality)
fmt.Println(mergedReality.Get())
mergedReality.Release()
ledgerState.GetReality(pendingReality).Consume(func(object objectstorage.StorableObject) {
reality := object.(*Reality)
......
......@@ -12,6 +12,7 @@ type CachedObject struct {
err error
consumers int32
published int32
persist int32
persisted int32
deleted int32
wg sync.WaitGroup
......@@ -62,6 +63,10 @@ func (cachedObject *CachedObject) Delete() {
cachedObject.setDeleted(true)
}
func (cachedObject *CachedObject) Persist() {
atomic.StoreInt32(&(cachedObject.persist), 1)
}
func (cachedObject *CachedObject) RegisterConsumer() {
atomic.AddInt32(&(cachedObject.consumers), 1)
}
......@@ -90,9 +95,11 @@ func (cachedObject *CachedObject) release() {
if err := cachedObject.objectStorage.deleteObjectFromBadger(cachedObject.value.GetStorageKey()); err != nil {
panic(err)
}
} else if err := cachedObject.objectStorage.persistObjectToBadger(cachedObject.value.GetStorageKey(), cachedObject.value); err != nil {
} else if atomic.LoadInt32(&(cachedObject.persist)) == 1 {
if err := cachedObject.objectStorage.persistObjectToBadger(cachedObject.value.GetStorageKey(), cachedObject.value); err != nil {
panic(err)
}
}
delete(cachedObject.objectStorage.cachedObjects, string(cachedObject.value.GetStorageKey()))
}
......
......@@ -25,6 +25,21 @@ func New(storageId string, objectFactory StorableObjectFactory, optionalOptions
}
}
func (objectStorage *ObjectStorage) Prepare(object StorableObject) *CachedObject {
return objectStorage.accessCache(object.GetStorageKey(), func(cachedObject *CachedObject) {
if !cachedObject.publishResult(object, nil) {
if currentValue := cachedObject.Get(); currentValue != nil {
currentValue.Update(object)
} else {
cachedObject.updateValue(object)
}
}
}, func(cachedObject *CachedObject) {
cachedObject.persist = 0
cachedObject.publishResult(object, nil)
})
}
func (objectStorage *ObjectStorage) Store(object StorableObject) *CachedObject {
return objectStorage.accessCache(object.GetStorageKey(), func(cachedObject *CachedObject) {
if !cachedObject.publishResult(object, nil) {
......@@ -35,6 +50,7 @@ func (objectStorage *ObjectStorage) Store(object StorableObject) *CachedObject {
}
}
}, func(cachedObject *CachedObject) {
cachedObject.persist = 1
cachedObject.publishResult(object, nil)
})
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment