|
|
|
|
@ -82,7 +82,7 @@ type CompactableChonk interface { |
|
|
|
|
//
|
|
|
|
|
// Mem implements the Chonk interface.
|
|
|
|
|
type Mem struct { |
|
|
|
|
l sync.RWMutex |
|
|
|
|
mu sync.RWMutex |
|
|
|
|
aums map[AUMHash]AUM |
|
|
|
|
parentIndex map[AUMHash][]AUMHash |
|
|
|
|
|
|
|
|
|
@ -90,23 +90,23 @@ type Mem struct { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *Mem) SetLastActiveAncestor(hash AUMHash) error { |
|
|
|
|
c.l.Lock() |
|
|
|
|
defer c.l.Unlock() |
|
|
|
|
c.mu.Lock() |
|
|
|
|
defer c.mu.Unlock() |
|
|
|
|
c.lastActiveAncestor = &hash |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *Mem) LastActiveAncestor() (*AUMHash, error) { |
|
|
|
|
c.l.RLock() |
|
|
|
|
defer c.l.RUnlock() |
|
|
|
|
c.mu.RLock() |
|
|
|
|
defer c.mu.RUnlock() |
|
|
|
|
return c.lastActiveAncestor, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Heads returns AUMs for which there are no children. In other
|
|
|
|
|
// words, the latest AUM in all chains (the 'leaf').
|
|
|
|
|
func (c *Mem) Heads() ([]AUM, error) { |
|
|
|
|
c.l.RLock() |
|
|
|
|
defer c.l.RUnlock() |
|
|
|
|
c.mu.RLock() |
|
|
|
|
defer c.mu.RUnlock() |
|
|
|
|
out := make([]AUM, 0, 6) |
|
|
|
|
|
|
|
|
|
// An AUM is a 'head' if there are no nodes for which it is the parent.
|
|
|
|
|
@ -120,8 +120,8 @@ func (c *Mem) Heads() ([]AUM, error) { |
|
|
|
|
|
|
|
|
|
// AUM returns the AUM with the specified digest.
|
|
|
|
|
func (c *Mem) AUM(hash AUMHash) (AUM, error) { |
|
|
|
|
c.l.RLock() |
|
|
|
|
defer c.l.RUnlock() |
|
|
|
|
c.mu.RLock() |
|
|
|
|
defer c.mu.RUnlock() |
|
|
|
|
aum, ok := c.aums[hash] |
|
|
|
|
if !ok { |
|
|
|
|
return AUM{}, os.ErrNotExist |
|
|
|
|
@ -132,8 +132,8 @@ func (c *Mem) AUM(hash AUMHash) (AUM, error) { |
|
|
|
|
// ChildAUMs returns all AUMs with a specified previous
|
|
|
|
|
// AUM hash.
|
|
|
|
|
func (c *Mem) ChildAUMs(prevAUMHash AUMHash) ([]AUM, error) { |
|
|
|
|
c.l.RLock() |
|
|
|
|
defer c.l.RUnlock() |
|
|
|
|
c.mu.RLock() |
|
|
|
|
defer c.mu.RUnlock() |
|
|
|
|
out := make([]AUM, 0, 6) |
|
|
|
|
for _, entry := range c.parentIndex[prevAUMHash] { |
|
|
|
|
out = append(out, c.aums[entry]) |
|
|
|
|
@ -147,8 +147,8 @@ func (c *Mem) ChildAUMs(prevAUMHash AUMHash) ([]AUM, error) { |
|
|
|
|
// as the rest of the TKA implementation assumes that only
|
|
|
|
|
// verified AUMs are stored.
|
|
|
|
|
func (c *Mem) CommitVerifiedAUMs(updates []AUM) error { |
|
|
|
|
c.l.Lock() |
|
|
|
|
defer c.l.Unlock() |
|
|
|
|
c.mu.Lock() |
|
|
|
|
defer c.mu.Unlock() |
|
|
|
|
if c.aums == nil { |
|
|
|
|
c.parentIndex = make(map[AUMHash][]AUMHash, 64) |
|
|
|
|
c.aums = make(map[AUMHash]AUM, 64) |
|
|
|
|
|