Skip to content

Commit

Permalink
Only enforce RangeEnd + Limit restriction when RangeEnd is set (k3s-i…
Browse files Browse the repository at this point in the history
  • Loading branch information
neoaggelos authored Nov 29, 2022
1 parent 6eefad1 commit d47190d
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 12 deletions.
18 changes: 9 additions & 9 deletions pkg/logstructured/logstructured.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,21 @@ func (l *LogStructured) Start(ctx context.Context) error {
return nil
}

func (l *LogStructured) Get(ctx context.Context, key string, revision int64) (revRet int64, kvRet *server.KeyValue, errRet error) {
func (l *LogStructured) Get(ctx context.Context, key, rangeEnd string, limit, revision int64) (revRet int64, kvRet *server.KeyValue, errRet error) {
defer func() {
l.adjustRevision(ctx, &revRet)
logrus.Debugf("GET %s, rev=%d => rev=%d, kv=%v, err=%v", key, revision, revRet, kvRet != nil, errRet)
}()

rev, event, err := l.get(ctx, key, revision, false)
rev, event, err := l.get(ctx, key, rangeEnd, limit, revision, false)
if event == nil {
return rev, nil, err
}
return rev, event.KV, err
}

func (l *LogStructured) get(ctx context.Context, key string, revision int64, includeDeletes bool) (int64, *server.Event, error) {
rev, events, err := l.log.List(ctx, key, "", 1, revision, includeDeletes)
func (l *LogStructured) get(ctx context.Context, key, rangeEnd string, limit, revision int64, includeDeletes bool) (int64, *server.Event, error) {
rev, events, err := l.log.List(ctx, key, rangeEnd, limit, revision, includeDeletes)
if err == server.ErrCompacted {
// ignore compacted when getting by revision
err = nil
Expand Down Expand Up @@ -86,7 +86,7 @@ func (l *LogStructured) Create(ctx context.Context, key string, value []byte, le
logrus.Debugf("CREATE %s, size=%d, lease=%d => rev=%d, err=%v", key, len(value), lease, revRet, errRet)
}()

rev, prevEvent, err := l.get(ctx, key, 0, true)
rev, prevEvent, err := l.get(ctx, key, "", 1, 0, true)
if err != nil {
return 0, err
}
Expand Down Expand Up @@ -118,7 +118,7 @@ func (l *LogStructured) Delete(ctx context.Context, key string, revision int64)
logrus.Debugf("DELETE %s, rev=%d => rev=%d, kv=%v, deleted=%v, err=%v", key, revision, revRet, kvRet != nil, deletedRet, errRet)
}()

rev, event, err := l.get(ctx, key, 0, true)
rev, event, err := l.get(ctx, key, "", 1, 0, true)
if err != nil {
return 0, nil, false, err
}
Expand All @@ -145,7 +145,7 @@ func (l *LogStructured) Delete(ctx context.Context, key string, revision int64)
if err != nil {
// If error on Append we assume it's a UNIQUE constraint error, so we fetch the latest (if we can)
// and return that the delete failed
latestRev, latestEvent, latestErr := l.get(ctx, key, 0, true)
latestRev, latestEvent, latestErr := l.get(ctx, key, "", 1, 0, true)
if latestErr != nil || latestEvent == nil {
return rev, event.KV, false, nil
}
Expand Down Expand Up @@ -215,7 +215,7 @@ func (l *LogStructured) Update(ctx context.Context, key string, value []byte, re
logrus.Debugf("UPDATE %s, value=%d, rev=%d, lease=%v => rev=%d, kvrev=%d, updated=%v, err=%v", key, len(value), revision, lease, revRet, kvRev, updateRet, errRet)
}()

rev, event, err := l.get(ctx, key, 0, false)
rev, event, err := l.get(ctx, key, "", 1, 0, false)
if err != nil {
return 0, nil, false, err
}
Expand All @@ -240,7 +240,7 @@ func (l *LogStructured) Update(ctx context.Context, key string, value []byte, re

rev, err = l.log.Append(ctx, updateEvent)
if err != nil {
rev, event, err := l.get(ctx, key, 0, false)
rev, event, err := l.get(ctx, key, "", 1, 0, false)
if event == nil {
return rev, nil, false, err
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/server/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import (
)

func (l *LimitedServer) get(ctx context.Context, r *etcdserverpb.RangeRequest) (*RangeResponse, error) {
if r.Limit != 0 {
if r.Limit != 0 && len(r.RangeEnd) != 0 {
return nil, fmt.Errorf("invalid combination of rangeEnd and limit, limit should be 0 got %d", r.Limit)
}

rev, kv, err := l.backend.Get(ctx, string(r.Key), r.Revision)
rev, kv, err := l.backend.Get(ctx, string(r.Key), string(r.RangeEnd), r.Limit, r.Revision)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/server/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var (

type Backend interface {
Start(ctx context.Context) error
Get(ctx context.Context, key string, revision int64) (int64, *KeyValue, error)
Get(ctx context.Context, key, rangeEnd string, limit, revision int64) (int64, *KeyValue, error)
Create(ctx context.Context, key string, value []byte, lease int64) (int64, error)
Delete(ctx context.Context, key string, revision int64) (int64, *KeyValue, bool, error)
List(ctx context.Context, prefix, startKey string, limit, revision int64) (int64, []*KeyValue, error)
Expand Down

0 comments on commit d47190d

Please sign in to comment.