endpoint: refactor, fix stale holds on initial replication, holds release subcmds

- endpoint abstractions now share an interface `Abstraction`
- pkg endpoint now has a query facitilty (`ListAbstractions`) which is
  used to find on-disk
    - step holds and bookmarks
    - replication cursors (v1, v2)
    - last-received-holds
- the `zrepl holds list` command consumes endpoint.ListAbstractions
- the new `zrepl holds release-{all,stale}` commands can be used
  to remove abstractions of package endpoint

Co-authored-by: InsanePrawn <insane.prawny@gmail.com>

supersedes #282
fixes #280
fixes #278
This commit is contained in:
Christian Schwarz
2020-03-26 23:43:17 +01:00
parent 44bd354eae
commit f3734ed0d4
28 changed files with 1854 additions and 1168 deletions
+43
View File
@@ -0,0 +1,43 @@
package errorarray
import (
"fmt"
"strings"
)
type Errors struct {
Msg string
Wrapped []error
}
var _ error = (*Errors)(nil)
func Wrap(errs []error, msg string) Errors {
if len(errs) == 0 {
panic("passing empty errs argument")
}
return Errors{Msg: msg, Wrapped: errs}
}
func (e Errors) Unwrap() error {
if len(e.Wrapped) == 1 {
return e.Wrapped[0]
}
return nil // ... limitation of the Go 1.13 errors API
}
func (e Errors) Error() string {
if len(e.Wrapped) == 1 {
return fmt.Sprintf("%s: %s", e.Msg, e.Wrapped[0])
}
var buf strings.Builder
fmt.Fprintf(&buf, "%s: multiple errors:\n", e.Msg)
for i, err := range e.Wrapped {
fmt.Fprintf(&buf, "%s", err)
if i != len(e.Wrapped)-1 {
fmt.Fprintf(&buf, "\n")
}
}
return buf.String()
}