Skip to content

Commit

Permalink
NotFoundError now exposes correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonRichardson committed Dec 8, 2017
1 parent 89409ce commit 4d33634
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 64 deletions.
2 changes: 1 addition & 1 deletion cmd/coherence/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func runCache(args []string) error {
}

var (
persistence = store.New(*cacheBuckets, *cacheSize)
persistence = store.New(*cacheBuckets, *cacheSize, log.With(logger, "component", "store"))
nodeSet = nodes.NewNodeSet(peer)
supervisor = farm.NewReal(nodeSet)
)
Expand Down
2 changes: 1 addition & 1 deletion pkg/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func (a *API) handleSelect(w http.ResponseWriter, r *http.Request) {

member, err := a.store.Select(qp.Key(), qp.Field())
if err != nil {
if store.NotFoundError(err) {
if selectors.NotFoundError(err) {
a.errors.NotFound(w, r)
} else {
a.errors.InternalServerError(w, r, err.Error())
Expand Down
27 changes: 3 additions & 24 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

"github.com/SimonRichardson/resilience/breaker"
"github.com/pkg/errors"
"github.com/trussle/coherence/pkg/selectors"
)

const (
Expand Down Expand Up @@ -45,7 +46,7 @@ func (c *Client) Get(u string) (b []byte, err error) {
defer resp.Body.Close()

if resp.StatusCode == http.StatusNotFound {
return NewNotFoundError(errors.Errorf("invalid status code: %d", resp.StatusCode))
return selectors.NewNotFoundError(errors.Errorf("invalid status code: %d", resp.StatusCode))
}
if resp.StatusCode != http.StatusOK {
return errors.Errorf("invalid status code: %d", resp.StatusCode)
Expand All @@ -71,7 +72,7 @@ func (c *Client) Post(u string, p []byte) (b []byte, err error) {
defer resp.Body.Close()

if resp.StatusCode == http.StatusNotFound {
return NewNotFoundError(errors.Errorf("invalid status code: %d", resp.StatusCode))
return selectors.NewNotFoundError(errors.Errorf("invalid status code: %d", resp.StatusCode))
}
if resp.StatusCode != http.StatusOK {
return errors.Errorf("invalid status code: %d", resp.StatusCode)
Expand All @@ -88,25 +89,3 @@ func (c *Client) Post(u string, p []byte) (b []byte, err error) {
func (c *Client) Host() string {
return c.host
}

type errNotFound struct {
err error
}

// NewNotFoundError creates a new NotFoundError
func NewNotFoundError(err error) error {
return errNotFound{err}
}

func (e errNotFound) Error() string {
return e.err.Error()
}

// NotFoundError finds if the error passed in, is actually a partial error or not
func NotFoundError(err error) bool {
if err == nil {
return false
}
_, ok := err.(errNotFound)
return ok
}
3 changes: 1 addition & 2 deletions pkg/farm/nop.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package farm

import (
"github.com/pkg/errors"
"github.com/trussle/coherence/pkg/client"
"github.com/trussle/coherence/pkg/selectors"
"github.com/trussle/coherence/pkg/store"
)
Expand All @@ -27,7 +26,7 @@ func (nop) Delete(key selectors.Key, members []selectors.FieldValueScore) (selec
}, nil
}
func (nop) Select(selectors.Key, selectors.Field) (selectors.FieldValueScore, error) {
return selectors.FieldValueScore{}, client.NewNotFoundError(errors.New("not found"))
return selectors.FieldValueScore{}, selectors.NewNotFoundError(errors.New("not found"))
}
func (nop) Keys() ([]selectors.Key, error) { return nil, nil }
func (nop) Size(selectors.Key) (int64, error) { return -1, nil }
Expand Down
5 changes: 2 additions & 3 deletions pkg/farm/real.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/SimonRichardson/resilience/breaker"
"github.com/pkg/errors"
"github.com/trussle/coherence/pkg/client"
"github.com/trussle/coherence/pkg/nodes"
"github.com/trussle/coherence/pkg/selectors"
"github.com/trussle/coherence/pkg/store"
Expand Down Expand Up @@ -400,10 +399,10 @@ func tactic(n []nodes.Node, fn func(k int, n nodes.Node)) error {
func mapErrors(errs []error) error {
notFound := true
for _, v := range errs {
notFound = notFound && client.NotFoundError(v)
notFound = notFound && selectors.NotFoundError(v)
}
if notFound {
return client.NewNotFoundError(errors.New("not found"))
return selectors.NewNotFoundError(errors.New("not found"))
}
return errors.Wrapf(joinErrors(errs), "partial error")
}
Expand Down
23 changes: 23 additions & 0 deletions pkg/selectors/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package selectors

type errNotFound struct {
err error
}

// NewNotFoundError creates a new NotFoundError
func NewNotFoundError(err error) error {
return errNotFound{err}
}

func (e errNotFound) Error() string {
return e.err.Error()
}

// NotFoundError finds if the error passed in, is actually a partial error or not
func NotFoundError(err error) bool {
if err == nil {
return false
}
_, ok := err.(errNotFound)
return ok
}
2 changes: 1 addition & 1 deletion pkg/store/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func (b *Bucket) Select(field selectors.Field) (selectors.FieldValueScore, error
Score: v.Score,
}, nil
}
return selectors.FieldValueScore{}, errNotFound{errors.New("not found")}
return selectors.FieldValueScore{}, selectors.NewNotFoundError(errors.New("not found"))
}

// Members defines a way to return all members
Expand Down
2 changes: 1 addition & 1 deletion pkg/store/bucket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ func TestBucketDeletion(t *testing.T) {
}

_, err = bucket.Select(field)
return NotFoundError(err)
return selectors.NotFoundError(err)
}
if err := quick.Check(fn, nil); err != nil {
t.Error(err)
Expand Down
8 changes: 7 additions & 1 deletion pkg/store/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package store
import (
"strings"

"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"

"github.com/pkg/errors"
"github.com/trussle/coherence/pkg/selectors"
)
Expand All @@ -14,11 +17,12 @@ type memory struct {
size uint
buckets []*Bucket
keys map[selectors.Key]struct{}
logger log.Logger
}

// New creates a new in-memory Store according to the size required by
// the value requested.
func New(amountBuckets, amountPerBucket uint) Store {
func New(amountBuckets, amountPerBucket uint, logger log.Logger) Store {
buckets := make([]*Bucket, amountBuckets)
for k := range buckets {
buckets[k] = NewBucket(int(amountPerBucket))
Expand All @@ -28,6 +32,7 @@ func New(amountBuckets, amountPerBucket uint) Store {
size: amountBuckets,
buckets: buckets,
keys: make(map[selectors.Key]struct{}),
logger: logger,
}
}

Expand Down Expand Up @@ -84,6 +89,7 @@ func (m *memory) Delete(key selectors.Key, members []selectors.FieldValueScore)

func (m *memory) Select(key selectors.Key, field selectors.Field) (selectors.FieldValueScore, error) {
index := uint(key.Hash()) % m.size
level.Info(m.logger).Log("key", key, "index", index, "field", field)
return m.buckets[index].Select(field)
}

Expand Down
27 changes: 14 additions & 13 deletions pkg/store/memory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"testing"
"testing/quick"

"github.com/go-kit/kit/log"
"github.com/trussle/coherence/pkg/selectors"
)

Expand All @@ -14,7 +15,7 @@ func TestMemoryInsertion(t *testing.T) {

t.Run("inserting key and value", func(t *testing.T) {
fn := func(key selectors.Key, members []selectors.FieldValueScore) bool {
store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
changeSet, err := store.Insert(key, members)
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -46,7 +47,7 @@ func TestMemoryInsertion(t *testing.T) {
Score: member.Score - 1,
},
}
store := New(1, 1)
store := New(1, 1, log.NewNopLogger())
if _, err := store.Insert(key, members0); err != nil {
t.Fatal(err)
}
Expand All @@ -72,7 +73,7 @@ func TestMemoryInsertion(t *testing.T) {
member,
}

store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Insert(key, members)
if err != nil {
t.Fatal(err)
Expand All @@ -96,7 +97,7 @@ func TestMemoryInsertion(t *testing.T) {
return true
}

store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Insert(key, members)
if err != nil {
t.Fatal(err)
Expand All @@ -118,7 +119,7 @@ func TestMemoryInsertion(t *testing.T) {

t.Run("inserting members", func(t *testing.T) {
fn := func(key selectors.Key, members []selectors.FieldValueScore) bool {
store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Insert(key, members)
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -152,7 +153,7 @@ func TestMemoryInsertion(t *testing.T) {
member,
}

store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Insert(key, members)
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -180,7 +181,7 @@ func TestMemoryDeletion(t *testing.T) {

t.Run("deleting key and value", func(t *testing.T) {
fn := func(key selectors.Key, members []selectors.FieldValueScore) bool {
store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
changeSet, err := store.Delete(key, members)
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -209,7 +210,7 @@ func TestMemoryDeletion(t *testing.T) {
},
}

store := New(1, 1)
store := New(1, 1, log.NewNopLogger())
if _, err := store.Delete(key, members0); err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -237,14 +238,14 @@ func TestMemoryDeletion(t *testing.T) {
member,
}

store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Delete(key, members)
if err != nil {
t.Fatal(err)
}

_, err = store.Select(key, member.Field)
return NotFoundError(err)
return selectors.NotFoundError(err)
}
if err := quick.Check(fn, nil); err != nil {
t.Error(err)
Expand All @@ -253,7 +254,7 @@ func TestMemoryDeletion(t *testing.T) {

t.Run("deleting keys", func(t *testing.T) {
fn := func(key selectors.Key, members []selectors.FieldValueScore) bool {
store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())

_, err := store.Insert(key, members)
if err != nil {
Expand All @@ -277,7 +278,7 @@ func TestMemoryDeletion(t *testing.T) {

t.Run("deleting members", func(t *testing.T) {
fn := func(key selectors.Key, members []selectors.FieldValueScore) bool {
store := New(1, uint(len(members)*2))
store := New(1, uint(len(members)*2), log.NewNopLogger())
_, err := store.Delete(key, members)
if err != nil {
t.Fatal(err)
Expand All @@ -301,7 +302,7 @@ func TestMemoryDeletion(t *testing.T) {
member,
}

store := New(1, 1)
store := New(1, 1, log.NewNopLogger())
_, err := store.Delete(key, members)
if err != nil {
t.Fatal(err)
Expand Down
17 changes: 0 additions & 17 deletions pkg/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,3 @@ type Store interface {
// Repair attempts to repair the store depending on the elements
Repair([]selectors.KeyFieldValue) error
}

type errNotFound struct {
err error
}

func (e errNotFound) Error() string {
return e.err.Error()
}

// NotFoundError finds if the error passed in, is actually a partial error or not
func NotFoundError(err error) bool {
if err == nil {
return false
}
_, ok := err.(errNotFound)
return ok
}

0 comments on commit 4d33634

Please sign in to comment.