diff --git a/pkg/logstructured/logstructured.go b/pkg/logstructured/logstructured.go index 5b9ffdb3..d19aef86 100644 --- a/pkg/logstructured/logstructured.go +++ b/pkg/logstructured/logstructured.go @@ -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 @@ -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 } @@ -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 } @@ -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 } @@ -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 } @@ -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 } diff --git a/pkg/server/get.go b/pkg/server/get.go index faefb562..2a126742 100644 --- a/pkg/server/get.go +++ b/pkg/server/get.go @@ -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 } diff --git a/pkg/server/types.go b/pkg/server/types.go index 8b78dc59..ef989173 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -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)