Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
f80b59ba
Commit
f80b59ba
authored
May 09, 2016
by
Jordan Liggitt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Return 'too old' errors from watch cache via watch stream
parent
dee24333
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
5 deletions
+56
-5
cacher.go
pkg/storage/cacher.go
+47
-1
cacher_test.go
pkg/storage/cacher_test.go
+9
-4
No files found.
pkg/storage/cacher.go
View file @
f80b59ba
...
@@ -18,6 +18,7 @@ package storage
...
@@ -18,6 +18,7 @@ package storage
import
(
import
(
"fmt"
"fmt"
"net/http"
"reflect"
"reflect"
"strconv"
"strconv"
"strings"
"strings"
...
@@ -25,8 +26,10 @@ import (
...
@@ -25,8 +26,10 @@ import (
"time"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
...
@@ -259,7 +262,10 @@ func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string,
...
@@ -259,7 +262,10 @@ func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string,
defer
c
.
watchCache
.
RUnlock
()
defer
c
.
watchCache
.
RUnlock
()
initEvents
,
err
:=
c
.
watchCache
.
GetAllEventsSinceThreadUnsafe
(
watchRV
)
initEvents
,
err
:=
c
.
watchCache
.
GetAllEventsSinceThreadUnsafe
(
watchRV
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
// To match the uncached watch implementation, once we have passed authn/authz/admission,
// and successfully parsed a resource version, other errors must fail with a watch event of type ERROR,
// rather than a directly returned error.
return
newErrWatcher
(
err
),
nil
}
}
c
.
Lock
()
c
.
Lock
()
...
@@ -455,6 +461,46 @@ func (lw *cacherListerWatcher) Watch(options api.ListOptions) (watch.Interface,
...
@@ -455,6 +461,46 @@ func (lw *cacherListerWatcher) Watch(options api.ListOptions) (watch.Interface,
return
lw
.
storage
.
WatchList
(
context
.
TODO
(),
lw
.
resourcePrefix
,
options
.
ResourceVersion
,
Everything
)
return
lw
.
storage
.
WatchList
(
context
.
TODO
(),
lw
.
resourcePrefix
,
options
.
ResourceVersion
,
Everything
)
}
}
// cacherWatch implements watch.Interface to return a single error
type
errWatcher
struct
{
result
chan
watch
.
Event
}
func
newErrWatcher
(
err
error
)
*
errWatcher
{
// Create an error event
errEvent
:=
watch
.
Event
{
Type
:
watch
.
Error
}
switch
err
:=
err
.
(
type
)
{
case
runtime
.
Object
:
errEvent
.
Object
=
err
case
*
errors
.
StatusError
:
errEvent
.
Object
=
&
err
.
ErrStatus
default
:
errEvent
.
Object
=
&
unversioned
.
Status
{
Status
:
unversioned
.
StatusFailure
,
Message
:
err
.
Error
(),
Reason
:
unversioned
.
StatusReasonInternalError
,
Code
:
http
.
StatusInternalServerError
,
}
}
// Create a watcher with room for a single event, populate it, and close the channel
watcher
:=
&
errWatcher
{
result
:
make
(
chan
watch
.
Event
,
1
)}
watcher
.
result
<-
errEvent
close
(
watcher
.
result
)
return
watcher
}
// Implements watch.Interface.
func
(
c
*
errWatcher
)
ResultChan
()
<-
chan
watch
.
Event
{
return
c
.
result
}
// Implements watch.Interface.
func
(
c
*
errWatcher
)
Stop
()
{
// no-op
}
// cacherWatch implements watch.Interface
// cacherWatch implements watch.Interface
type
cacheWatcher
struct
{
type
cacheWatcher
struct
{
sync
.
Mutex
sync
.
Mutex
...
...
pkg/storage/cacher_test.go
View file @
f80b59ba
...
@@ -25,6 +25,7 @@ import (
...
@@ -25,6 +25,7 @@ import (
"time"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/testapi"
apitesting
"k8s.io/kubernetes/pkg/api/testing"
apitesting
"k8s.io/kubernetes/pkg/api/testing"
...
@@ -231,11 +232,15 @@ func TestWatch(t *testing.T) {
...
@@ -231,11 +232,15 @@ func TestWatch(t *testing.T) {
verifyWatchEvent
(
t
,
watcher
,
watch
.
Added
,
podFoo
)
verifyWatchEvent
(
t
,
watcher
,
watch
.
Added
,
podFoo
)
verifyWatchEvent
(
t
,
watcher
,
watch
.
Modified
,
podFooPrime
)
verifyWatchEvent
(
t
,
watcher
,
watch
.
Modified
,
podFooPrime
)
// Check whether we get too-old error
.
// Check whether we get too-old error
via the watch channel
_
,
err
=
cacher
.
Watch
(
context
.
TODO
(),
"pods/ns/foo"
,
"1"
,
storage
.
Everything
)
tooOldWatcher
,
err
:
=
cacher
.
Watch
(
context
.
TODO
(),
"pods/ns/foo"
,
"1"
,
storage
.
Everything
)
if
err
=
=
nil
{
if
err
!
=
nil
{
t
.
Errorf
(
"Expected 'error too old' error"
)
t
.
Fatalf
(
"Expected no direct error, got %v"
,
err
)
}
}
defer
tooOldWatcher
.
Stop
()
// Ensure we get a "Gone" error
expectedGoneError
:=
errors
.
NewGone
(
""
)
.
(
*
errors
.
StatusError
)
.
ErrStatus
verifyWatchEvent
(
t
,
tooOldWatcher
,
watch
.
Error
,
&
expectedGoneError
)
initialWatcher
,
err
:=
cacher
.
Watch
(
context
.
TODO
(),
"pods/ns/foo"
,
fooCreated
.
ResourceVersion
,
storage
.
Everything
)
initialWatcher
,
err
:=
cacher
.
Watch
(
context
.
TODO
(),
"pods/ns/foo"
,
fooCreated
.
ResourceVersion
,
storage
.
Everything
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment