Skip to content

Commit 1c94e77

Browse files
committed
Properly enforce RangeEnd + Limit restriction
Required for compatibility with Kubernetes 1.24, which when searching within a namespace for a resource using FieldSelector on metatada.name, sends a Get request for the fully qualified resource name, but with a non-zero limit. Signed-off-by: Brad Davidson <[email protected]>
1 parent 27bd5e7 commit 1c94e77

File tree

4 files changed

+14
-14
lines changed

4 files changed

+14
-14
lines changed

pkg/drivers/jetstream/jetstream.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func (j *JetStream) isKeyExpired(_ context.Context, createTime time.Time, value
280280
}
281281

282282
// Get returns the associated server.KeyValue
283-
func (j *JetStream) Get(ctx context.Context, key string, revision int64) (revRet int64, kvRet *server.KeyValue, errRet error) {
283+
func (j *JetStream) Get(ctx context.Context, key, rangeEnd string, limit, revision int64) (revRet int64, kvRet *server.KeyValue, errRet error) {
284284
//logrus.Tracef("GET %s, rev=%d", key, revision)
285285
start := time.Now()
286286
defer func() {
@@ -674,7 +674,7 @@ func (j *JetStream) listAfter(ctx context.Context, prefix string, revision int64
674674
KV: kv.KV,
675675
PrevKV: &server.KeyValue{},
676676
}
677-
if _, prevKV, err := j.Get(ctx, kv.KV.Key, kv.PrevRevision); err == nil && prevKV != nil {
677+
if _, prevKV, err := j.Get(ctx, kv.KV.Key, "", 1, kv.PrevRevision); err == nil && prevKV != nil {
678678
event.PrevKV = prevKV
679679
}
680680

pkg/logstructured/logstructured.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,21 @@ func (l *LogStructured) Start(ctx context.Context) error {
4444
return nil
4545
}
4646

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

53-
rev, event, err := l.get(ctx, key, revision, false)
53+
rev, event, err := l.get(ctx, key, rangeEnd, limit, revision, false)
5454
if event == nil {
5555
return rev, nil, err
5656
}
5757
return rev, event.KV, err
5858
}
5959

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

94-
rev, prevEvent, err := l.get(ctx, key, 0, true)
94+
rev, prevEvent, err := l.get(ctx, key, "", 1, 0, true)
9595
if err != nil {
9696
return 0, err
9797
}
@@ -123,7 +123,7 @@ func (l *LogStructured) Delete(ctx context.Context, key string, revision int64)
123123
logrus.Tracef("DELETE %s, rev=%d => rev=%d, kv=%v, deleted=%v, err=%v", key, revision, revRet, kvRet != nil, deletedRet, errRet)
124124
}()
125125

126-
rev, event, err := l.get(ctx, key, 0, true)
126+
rev, event, err := l.get(ctx, key, "", 1, 0, true)
127127
if err != nil {
128128
return 0, nil, false, err
129129
}
@@ -150,7 +150,7 @@ func (l *LogStructured) Delete(ctx context.Context, key string, revision int64)
150150
if err != nil {
151151
// If error on Append we assume it's a UNIQUE constraint error, so we fetch the latest (if we can)
152152
// and return that the delete failed
153-
latestRev, latestEvent, latestErr := l.get(ctx, key, 0, true)
153+
latestRev, latestEvent, latestErr := l.get(ctx, key, "", 1, 0, true)
154154
if latestErr != nil || latestEvent == nil {
155155
return rev, event.KV, false, nil
156156
}
@@ -220,7 +220,7 @@ func (l *LogStructured) Update(ctx context.Context, key string, value []byte, re
220220
logrus.Tracef("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)
221221
}()
222222

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

246246
rev, err = l.log.Append(ctx, updateEvent)
247247
if err != nil {
248-
rev, event, err := l.get(ctx, key, 0, false)
248+
rev, event, err := l.get(ctx, key, "", 1, 0, false)
249249
if event == nil {
250250
return rev, nil, false, err
251251
}

pkg/server/get.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import (
88
)
99

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

15-
rev, kv, err := l.backend.Get(ctx, string(r.Key), r.Revision)
15+
rev, kv, err := l.backend.Get(ctx, string(r.Key), string(r.RangeEnd), r.Limit, r.Revision)
1616
if err != nil {
1717
return nil, err
1818
}

pkg/server/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var (
1414

1515
type Backend interface {
1616
Start(ctx context.Context) error
17-
Get(ctx context.Context, key string, revision int64) (int64, *KeyValue, error)
17+
Get(ctx context.Context, key, rangeEnd string, limit, revision int64) (int64, *KeyValue, error)
1818
Create(ctx context.Context, key string, value []byte, lease int64) (int64, error)
1919
Delete(ctx context.Context, key string, revision int64) (int64, *KeyValue, bool, error)
2020
List(ctx context.Context, prefix, startKey string, limit, revision int64) (int64, []*KeyValue, error)

0 commit comments

Comments
 (0)