internal/store: rename compat interface
All checks were successful
Test / Create distribution (push) Successful in 33s
Test / Sandbox (push) Successful in 2m17s
Test / Hakurei (push) Successful in 3m9s
Test / Sandbox (race detector) (push) Successful in 4m3s
Test / Hpkg (push) Successful in 4m4s
Test / Flake checks (push) Successful in 1m25s
Test / Hakurei (race detector) (push) Successful in 4m54s
All checks were successful
Test / Create distribution (push) Successful in 33s
Test / Sandbox (push) Successful in 2m17s
Test / Hakurei (push) Successful in 3m9s
Test / Sandbox (race detector) (push) Successful in 4m3s
Test / Hpkg (push) Successful in 4m4s
Test / Flake checks (push) Successful in 1m25s
Test / Hakurei (race detector) (push) Successful in 4m54s
The new store implementation will be exported as Store. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
ebdcff1049
commit
b25ade5f3d
@ -168,7 +168,7 @@ func printShowInstance(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// printPs writes a representation of active instances to output.
|
// printPs writes a representation of active instances to output.
|
||||||
func printPs(output io.Writer, now time.Time, s store.Store, short, flagJSON bool) {
|
func printPs(output io.Writer, now time.Time, s store.Compat, short, flagJSON bool) {
|
||||||
var entries map[hst.ID]*hst.State
|
var entries map[hst.ID]*hst.State
|
||||||
if e, err := store.Join(s); err != nil {
|
if e, err := store.Join(s); err != nil {
|
||||||
log.Fatalf("cannot join store: %v", err)
|
log.Fatalf("cannot join store: %v", err)
|
||||||
|
|||||||
@ -34,7 +34,7 @@ type mainState struct {
|
|||||||
// Time is nil if no process was ever created.
|
// Time is nil if no process was ever created.
|
||||||
Time *time.Time
|
Time *time.Time
|
||||||
|
|
||||||
store store.Store
|
store store.Compat
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
cmd *exec.Cmd
|
cmd *exec.Cmd
|
||||||
cmdWait chan error
|
cmdWait chan error
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"maps"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"hakurei.app/container/check"
|
"hakurei.app/container/check"
|
||||||
@ -10,7 +12,7 @@ import (
|
|||||||
|
|
||||||
/* this provides an implementation of Store on top of the improved state tracking to ease in the changes */
|
/* this provides an implementation of Store on top of the improved state tracking to ease in the changes */
|
||||||
|
|
||||||
type Store interface {
|
type Compat interface {
|
||||||
// Do calls f exactly once and ensures store exclusivity until f returns.
|
// Do calls f exactly once and ensures store exclusivity until f returns.
|
||||||
// Returns whether f is called and any errors during the locking process.
|
// Returns whether f is called and any errors during the locking process.
|
||||||
// Cursor provided to f becomes invalid as soon as f returns.
|
// Cursor provided to f becomes invalid as soon as f returns.
|
||||||
@ -58,7 +60,7 @@ func (s storeAdapter) List() ([]int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewMulti returns an instance of the multi-file store.
|
// NewMulti returns an instance of the multi-file store.
|
||||||
func NewMulti(msg message.Msg, prefix *check.Absolute) Store {
|
func NewMulti(msg message.Msg, prefix *check.Absolute) Compat {
|
||||||
return storeAdapter{msg, newStore(prefix.Append("state"))}
|
return storeAdapter{msg, newStore(prefix.Append("state"))}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,3 +130,57 @@ func (h *storeHandle) Len() (int, error) {
|
|||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrDuplicate = errors.New("store contains duplicates")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Joiner is the interface that wraps the Join method.
|
||||||
|
//
|
||||||
|
// The Join function uses Joiner if available.
|
||||||
|
type Joiner interface {
|
||||||
|
Join() (map[hst.ID]*hst.State, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join returns joined state entries of all active identities.
|
||||||
|
func Join(s Compat) (map[hst.ID]*hst.State, error) {
|
||||||
|
if j, ok := s.(Joiner); ok {
|
||||||
|
return j.Join()
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
aids []int
|
||||||
|
entries = make(map[hst.ID]*hst.State)
|
||||||
|
|
||||||
|
el int
|
||||||
|
res map[hst.ID]*hst.State
|
||||||
|
loadErr error
|
||||||
|
)
|
||||||
|
|
||||||
|
if ln, err := s.List(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else {
|
||||||
|
aids = ln
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, aid := range aids {
|
||||||
|
if _, err := s.Do(aid, func(c Cursor) {
|
||||||
|
res, loadErr = c.Load()
|
||||||
|
}); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if loadErr != nil {
|
||||||
|
return nil, loadErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// save expected length
|
||||||
|
el = len(entries) + len(res)
|
||||||
|
maps.Copy(entries, res)
|
||||||
|
if len(entries) != el {
|
||||||
|
return nil, ErrDuplicate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entries, nil
|
||||||
|
}
|
||||||
|
|||||||
@ -1,64 +0,0 @@
|
|||||||
package store
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"maps"
|
|
||||||
|
|
||||||
"hakurei.app/hst"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrDuplicate = errors.New("store contains duplicates")
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
Joiner is the interface that wraps the Join method.
|
|
||||||
|
|
||||||
The Join function uses Joiner if available.
|
|
||||||
*/
|
|
||||||
type Joiner interface {
|
|
||||||
Join() (map[hst.ID]*hst.State, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Join returns joined state entries of all active identities.
|
|
||||||
func Join(s Store) (map[hst.ID]*hst.State, error) {
|
|
||||||
if j, ok := s.(Joiner); ok {
|
|
||||||
return j.Join()
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
aids []int
|
|
||||||
entries = make(map[hst.ID]*hst.State)
|
|
||||||
|
|
||||||
el int
|
|
||||||
res map[hst.ID]*hst.State
|
|
||||||
loadErr error
|
|
||||||
)
|
|
||||||
|
|
||||||
if ln, err := s.List(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
aids = ln
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, aid := range aids {
|
|
||||||
if _, err := s.Do(aid, func(c Cursor) {
|
|
||||||
res, loadErr = c.Load()
|
|
||||||
}); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if loadErr != nil {
|
|
||||||
return nil, loadErr
|
|
||||||
}
|
|
||||||
|
|
||||||
// save expected length
|
|
||||||
el = len(entries) + len(res)
|
|
||||||
maps.Copy(entries, res)
|
|
||||||
if len(entries) != el {
|
|
||||||
return nil, ErrDuplicate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return entries, nil
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user