[#40] container: Cleanup container size estimations at new epoch
EpochProcess method should be invoked by inner ring nodes and it removes old estimations from contract storage. Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
73277b88dc
commit
a04d9b7e70
1 changed files with 43 additions and 0 deletions
|
@ -58,6 +58,7 @@ const (
|
||||||
containerIDSize = 32 // SHA256 size
|
containerIDSize = 32 // SHA256 size
|
||||||
|
|
||||||
estimateKeyPrefix = "cnr"
|
estimateKeyPrefix = "cnr"
|
||||||
|
cleanupDelta = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -347,6 +348,30 @@ func ListContainerSizes(epoch int) [][]byte {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ProcessEpoch(epochNum int) {
|
||||||
|
netmapContractAddr := storage.Get(ctx, netmapContractKey).([]byte)
|
||||||
|
innerRing := contract.Call(netmapContractAddr, "innerRingList").([]irNode)
|
||||||
|
threshold := len(innerRing)/3*2 + 1
|
||||||
|
|
||||||
|
irKey := innerRingInvoker(innerRing)
|
||||||
|
if len(irKey) == 0 {
|
||||||
|
panic("processEpoch: this method must be invoked from inner ring")
|
||||||
|
}
|
||||||
|
|
||||||
|
candidates := keysToDelete(epochNum)
|
||||||
|
epochID := invokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||||
|
|
||||||
|
n := vote(ctx, epochID, irKey)
|
||||||
|
if n >= threshold {
|
||||||
|
removeVotes(ctx, epochID)
|
||||||
|
|
||||||
|
for i := range candidates {
|
||||||
|
candidate := candidates[i]
|
||||||
|
storage.Delete(ctx, candidate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Version() int {
|
func Version() int {
|
||||||
return version
|
return version
|
||||||
}
|
}
|
||||||
|
@ -625,3 +650,21 @@ func isStorageNode(key interop.PublicKey) bool {
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func keysToDelete(epoch int) [][]byte {
|
||||||
|
results := [][]byte{}
|
||||||
|
|
||||||
|
it := storage.Find(ctx, []byte(estimateKeyPrefix))
|
||||||
|
for iterator.Next(it) {
|
||||||
|
k := iterator.Key(it).([]byte)
|
||||||
|
nbytes := k[len(estimateKeyPrefix) : len(k)-32]
|
||||||
|
|
||||||
|
var n interface{} = nbytes
|
||||||
|
|
||||||
|
if epoch-n.(int) > cleanupDelta {
|
||||||
|
results = append(results, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue