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
a51f266e
Commit
a51f266e
authored
Apr 28, 2016
by
Wojciech Tyczynski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove nodeName from predicate signature.
parent
7e462c23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
64 additions
and
49 deletions
+64
-49
kubelet.go
pkg/kubelet/kubelet.go
+1
-1
predicates.go
plugin/pkg/scheduler/algorithm/predicates/predicates.go
+32
-32
predicates_test.go
plugin/pkg/scheduler/algorithm/predicates/predicates_test.go
+0
-0
types.go
plugin/pkg/scheduler/algorithm/types.go
+1
-1
factory_test.go
plugin/pkg/scheduler/factory/factory_test.go
+2
-2
generic_scheduler.go
plugin/pkg/scheduler/generic_scheduler.go
+3
-3
generic_scheduler_test.go
plugin/pkg/scheduler/generic_scheduler_test.go
+22
-7
cache.go
plugin/pkg/scheduler/schedulercache/cache.go
+3
-3
No files found.
pkg/kubelet/kubelet.go
View file @
a51f266e
...
...
@@ -2339,7 +2339,7 @@ func (kl *Kubelet) canAdmitPod(pods []*api.Pod, pod *api.Pod) (bool, string, str
}
nodeInfo
:=
schedulercache
.
NewNodeInfo
(
otherPods
...
)
nodeInfo
.
SetNode
(
node
)
fit
,
err
:=
predicates
.
GeneralPredicates
(
pod
,
kl
.
nodeName
,
nodeInfo
)
fit
,
err
:=
predicates
.
GeneralPredicates
(
pod
,
nodeInfo
)
if
!
fit
{
if
re
,
ok
:=
err
.
(
*
predicates
.
PredicateFailureError
);
ok
{
reason
:=
re
.
PredicateName
...
...
plugin/pkg/scheduler/algorithm/predicates/predicates.go
View file @
a51f266e
...
...
@@ -101,7 +101,7 @@ func isVolumeConflict(volume api.Volume, pod *api.Pod) bool {
// - AWS EBS forbids any two pods mounting the same volume ID
// - Ceph RBD forbids if any two pods share at least same monitor, and match pool and image.
// TODO: migrate this into some per-volume specific code?
func
NoDiskConflict
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
NoDiskConflict
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
for
_
,
v
:=
range
pod
.
Spec
.
Volumes
{
for
_
,
ev
:=
range
nodeInfo
.
Pods
()
{
if
isVolumeConflict
(
v
,
ev
)
{
...
...
@@ -177,7 +177,7 @@ func (c *MaxPDVolumeCountChecker) filterVolumes(volumes []api.Volume, namespace
return
nil
}
func
(
c
*
MaxPDVolumeCountChecker
)
predicate
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
(
c
*
MaxPDVolumeCountChecker
)
predicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
newVolumes
:=
make
(
map
[
string
]
bool
)
if
err
:=
c
.
filterVolumes
(
pod
.
Spec
.
Volumes
,
pod
.
Namespace
,
newVolumes
);
err
!=
nil
{
return
false
,
err
...
...
@@ -275,10 +275,10 @@ func NewVolumeZonePredicate(pvInfo PersistentVolumeInfo, pvcInfo PersistentVolum
return
c
.
predicate
}
func
(
c
*
VolumeZoneChecker
)
predicate
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
(
c
*
VolumeZoneChecker
)
predicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found
: %q"
,
nodeName
)
return
false
,
fmt
.
Errorf
(
"node not found
"
)
}
nodeConstraints
:=
make
(
map
[
string
]
string
)
...
...
@@ -335,7 +335,7 @@ func (c *VolumeZoneChecker) predicate(pod *api.Pod, nodeName string, nodeInfo *s
}
nodeV
,
_
:=
nodeConstraints
[
k
]
if
v
!=
nodeV
{
glog
.
V
(
2
)
.
Infof
(
"Won't schedule pod %q onto node %q due to volume %q (mismatch on %q)"
,
pod
.
Name
,
nodeName
,
pvName
,
k
)
glog
.
V
(
2
)
.
Infof
(
"Won't schedule pod %q onto node %q due to volume %q (mismatch on %q)"
,
pod
.
Name
,
node
.
Name
,
pvName
,
k
)
return
false
,
ErrVolumeZoneConflict
}
}
...
...
@@ -391,10 +391,10 @@ func podName(pod *api.Pod) string {
return
pod
.
Namespace
+
"/"
+
pod
.
Name
}
func
podFitsResourcesInternal
(
pod
*
api
.
Pod
,
nodeName
string
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PodFitsResources
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found
: %q"
,
nodeName
)
return
false
,
fmt
.
Errorf
(
"node not found
"
)
}
allocatable
:=
node
.
Status
.
Allocatable
allowedPodNumber
:=
allocatable
.
Pods
()
.
Value
()
...
...
@@ -419,14 +419,10 @@ func podFitsResourcesInternal(pod *api.Pod, nodeName string, nodeInfo *scheduler
newInsufficientResourceError
(
memoryResoureceName
,
podRequest
.
memory
,
nodeInfo
.
RequestedResource
()
.
Memory
,
totalMemory
)
}
glog
.
V
(
10
)
.
Infof
(
"Schedule Pod %+v on Node %+v is allowed, Node is running only %v out of %v Pods."
,
podName
(
pod
),
nodeName
,
len
(
nodeInfo
.
Pods
()),
allowedPodNumber
)
podName
(
pod
),
node
.
Name
,
len
(
nodeInfo
.
Pods
()),
allowedPodNumber
)
return
true
,
nil
}
func
PodFitsResources
(
pod
*
api
.
Pod
,
nodeName
string
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
return
podFitsResourcesInternal
(
pod
,
nodeName
,
nodeInfo
)
}
// nodeMatchesNodeSelectorTerms checks if a node's labels satisfy a list of node selector terms,
// terms are ORed, and an emtpy a list of terms will match nothing.
func
nodeMatchesNodeSelectorTerms
(
node
*
api
.
Node
,
nodeSelectorTerms
[]
api
.
NodeSelectorTerm
)
bool
{
...
...
@@ -496,10 +492,10 @@ func PodMatchesNodeLabels(pod *api.Pod, node *api.Node) bool {
return
nodeAffinityMatches
}
func
PodSelectorMatches
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PodSelectorMatches
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found
: %q"
,
nodeName
)
return
false
,
fmt
.
Errorf
(
"node not found
"
)
}
if
PodMatchesNodeLabels
(
pod
,
node
)
{
return
true
,
nil
...
...
@@ -507,11 +503,15 @@ func PodSelectorMatches(pod *api.Pod, nodeName string, nodeInfo *schedulercache.
return
false
,
ErrNodeSelectorNotMatch
}
func
PodFitsHost
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PodFitsHost
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
if
len
(
pod
.
Spec
.
NodeName
)
==
0
{
return
true
,
nil
}
if
pod
.
Spec
.
NodeName
==
nodeName
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found"
)
}
if
pod
.
Spec
.
NodeName
==
node
.
Name
{
return
true
,
nil
}
return
false
,
ErrPodNotMatchHostName
...
...
@@ -542,10 +542,10 @@ func NewNodeLabelPredicate(labels []string, presence bool) algorithm.FitPredicat
// Alternately, eliminating nodes that have a certain label, regardless of value, is also useful
// A node may have a label with "retiring" as key and the date as the value
// and it may be desirable to avoid scheduling new pods on this node
func
(
n
*
NodeLabelChecker
)
CheckNodeLabelPresence
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
(
n
*
NodeLabelChecker
)
CheckNodeLabelPresence
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found
: %q"
,
nodeName
)
return
false
,
fmt
.
Errorf
(
"node not found
"
)
}
var
exists
bool
...
...
@@ -585,7 +585,7 @@ func NewServiceAffinityPredicate(podLister algorithm.PodLister, serviceLister al
// - L is listed in the ServiceAffinity object that is passed into the function
// - the pod does not have any NodeSelector for L
// - some other pod from the same service is already scheduled onto a node that has value V for label L
func
(
s
*
ServiceAffinity
)
CheckServiceAffinity
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
(
s
*
ServiceAffinity
)
CheckServiceAffinity
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
var
affinitySelector
labels
.
Selector
// check if the pod being scheduled has the affinity labels specified in its NodeSelector
...
...
@@ -645,9 +645,9 @@ func (s *ServiceAffinity) CheckServiceAffinity(pod *api.Pod, nodeName string, no
affinitySelector
=
labels
.
Set
(
affinityLabels
)
.
AsSelector
()
}
node
,
err
:=
s
.
nodeInfo
.
GetNodeInfo
(
nodeName
)
if
err
!
=
nil
{
return
false
,
err
node
:=
nodeInfo
.
Node
(
)
if
node
=
=
nil
{
return
false
,
fmt
.
Errorf
(
"node not found"
)
}
// check if the node matches the selector
...
...
@@ -657,7 +657,7 @@ func (s *ServiceAffinity) CheckServiceAffinity(pod *api.Pod, nodeName string, no
return
false
,
ErrServiceAffinityViolated
}
func
PodFitsHostPorts
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PodFitsHostPorts
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
wantPorts
:=
getUsedPorts
(
pod
)
if
len
(
wantPorts
)
==
0
{
return
true
,
nil
...
...
@@ -703,21 +703,21 @@ func haveSame(a1, a2 []string) bool {
return
false
}
func
GeneralPredicates
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
fit
,
err
:=
podFitsResourcesInternal
(
pod
,
nodeName
,
nodeInfo
)
func
GeneralPredicates
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
fit
,
err
:=
PodFitsResources
(
pod
,
nodeInfo
)
if
!
fit
{
return
fit
,
err
}
fit
,
err
=
PodFitsHost
(
pod
,
node
Name
,
node
Info
)
fit
,
err
=
PodFitsHost
(
pod
,
nodeInfo
)
if
!
fit
{
return
fit
,
err
}
fit
,
err
=
PodFitsHostPorts
(
pod
,
node
Name
,
node
Info
)
fit
,
err
=
PodFitsHostPorts
(
pod
,
nodeInfo
)
if
!
fit
{
return
fit
,
err
}
fit
,
err
=
PodSelectorMatches
(
pod
,
node
Name
,
node
Info
)
fit
,
err
=
PodSelectorMatches
(
pod
,
nodeInfo
)
if
!
fit
{
return
fit
,
err
}
...
...
@@ -739,10 +739,10 @@ func NewPodAffinityPredicate(info NodeInfo, podLister algorithm.PodLister, failu
return
checker
.
InterPodAffinityMatches
}
func
(
checker
*
PodAffinityChecker
)
InterPodAffinityMatches
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
,
err
:=
checker
.
info
.
GetNodeInfo
(
nodeName
)
if
err
!
=
nil
{
return
false
,
err
func
(
checker
*
PodAffinityChecker
)
InterPodAffinityMatches
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
(
)
if
node
=
=
nil
{
return
false
,
fmt
.
Errorf
(
"node not found"
)
}
allPods
,
err
:=
checker
.
podLister
.
List
(
labels
.
Everything
())
if
err
!=
nil
{
...
...
plugin/pkg/scheduler/algorithm/predicates/predicates_test.go
View file @
a51f266e
This diff is collapsed.
Click to expand it.
plugin/pkg/scheduler/algorithm/types.go
View file @
a51f266e
...
...
@@ -24,7 +24,7 @@ import (
// FitPredicate is a function that indicates if a pod fits into an existing node.
// The failure information is given by the error.
type
FitPredicate
func
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
type
FitPredicate
func
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
type
PriorityFunction
func
(
pod
*
api
.
Pod
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
nodeLister
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
...
...
plugin/pkg/scheduler/factory/factory_test.go
View file @
a51f266e
...
...
@@ -116,11 +116,11 @@ func TestCreateFromEmptyConfig(t *testing.T) {
factory
.
CreateFromConfig
(
policy
)
}
func
PredicateOne
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PredicateOne
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
return
true
,
nil
}
func
PredicateTwo
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
PredicateTwo
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
return
true
,
nil
}
...
...
plugin/pkg/scheduler/generic_scheduler.go
View file @
a51f266e
...
...
@@ -144,7 +144,7 @@ func findNodesThatFit(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.No
checkNode
:=
func
(
i
int
)
{
nodeName
:=
nodes
.
Items
[
i
]
.
Name
fits
,
failedPredicate
,
err
:=
podFitsOnNode
(
pod
,
nodeName
,
nodeName
ToInfo
[
nodeName
],
predicateFuncs
)
fits
,
failedPredicate
,
err
:=
podFitsOnNode
(
pod
,
nodeNameToInfo
[
nodeName
],
predicateFuncs
)
predicateResultLock
.
Lock
()
defer
predicateResultLock
.
Unlock
()
...
...
@@ -179,9 +179,9 @@ func findNodesThatFit(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.No
}
// Checks whether node with a given name and NodeInfo satisfies all predicateFuncs.
func
podFitsOnNode
(
pod
*
api
.
Pod
,
nodeName
string
,
info
*
schedulercache
.
NodeInfo
,
predicateFuncs
map
[
string
]
algorithm
.
FitPredicate
)
(
bool
,
string
,
error
)
{
func
podFitsOnNode
(
pod
*
api
.
Pod
,
info
*
schedulercache
.
NodeInfo
,
predicateFuncs
map
[
string
]
algorithm
.
FitPredicate
)
(
bool
,
string
,
error
)
{
for
_
,
predicate
:=
range
predicateFuncs
{
fit
,
err
:=
predicate
(
pod
,
nodeName
,
info
)
fit
,
err
:=
predicate
(
pod
,
info
)
if
err
!=
nil
{
switch
e
:=
err
.
(
type
)
{
case
*
predicates
.
InsufficientResourceError
:
...
...
plugin/pkg/scheduler/generic_scheduler_test.go
View file @
a51f266e
...
...
@@ -23,32 +23,37 @@ import (
"reflect"
"strconv"
"testing"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/util/sets"
"k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
algorithmpredicates
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache"
schedulertesting
"k8s.io/kubernetes/plugin/pkg/scheduler/testing"
)
func
falsePredicate
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
falsePredicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
return
false
,
algorithmpredicates
.
ErrFakePredicate
}
func
truePredicate
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
truePredicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
return
true
,
nil
}
func
matchesPredicate
(
pod
*
api
.
Pod
,
nodeName
string
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
if
pod
.
Name
==
nodeName
{
func
matchesPredicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
node
:=
nodeInfo
.
Node
()
if
node
==
nil
{
return
false
,
fmt
.
Errorf
(
"node not found"
)
}
if
pod
.
Name
==
node
.
Name
{
return
true
,
nil
}
return
false
,
algorithmpredicates
.
ErrFakePredicate
}
func
hasNoPodsPredicate
(
pod
*
api
.
Pod
,
node
Name
string
,
node
Info
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
func
hasNoPodsPredicate
(
pod
*
api
.
Pod
,
nodeInfo
*
schedulercache
.
NodeInfo
)
(
bool
,
error
)
{
if
len
(
nodeInfo
.
Pods
())
==
0
{
return
true
,
nil
}
...
...
@@ -273,7 +278,14 @@ func TestGenericScheduler(t *testing.T) {
}
for
_
,
test
:=
range
tests
{
random
:=
rand
.
New
(
rand
.
NewSource
(
0
))
scheduler
:=
NewGenericScheduler
(
schedulertesting
.
PodsToCache
(
test
.
pods
),
test
.
predicates
,
test
.
prioritizers
,
[]
algorithm
.
SchedulerExtender
{},
random
)
cache
:=
schedulercache
.
New
(
time
.
Duration
(
0
),
wait
.
NeverStop
)
for
_
,
pod
:=
range
test
.
pods
{
cache
.
AddPod
(
pod
)
}
for
_
,
name
:=
range
test
.
nodes
{
cache
.
AddNode
(
&
api
.
Node
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
name
}})
}
scheduler
:=
NewGenericScheduler
(
cache
,
test
.
predicates
,
test
.
prioritizers
,
[]
algorithm
.
SchedulerExtender
{},
random
)
machine
,
err
:=
scheduler
.
Schedule
(
test
.
pod
,
algorithm
.
FakeNodeLister
(
makeNodeList
(
test
.
nodes
)))
if
test
.
expectsErr
{
if
err
==
nil
{
...
...
@@ -328,6 +340,9 @@ func TestFindFitSomeError(t *testing.T) {
"2"
:
schedulercache
.
NewNodeInfo
(),
"1"
:
schedulercache
.
NewNodeInfo
(
pod
),
}
for
name
:=
range
nodeNameToInfo
{
nodeNameToInfo
[
name
]
.
SetNode
(
&
api
.
Node
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
name
}})
}
_
,
predicateMap
,
err
:=
findNodesThatFit
(
pod
,
nodeNameToInfo
,
predicates
,
makeNodeList
(
nodes
),
nil
)
if
err
!=
nil
&&
!
reflect
.
DeepEqual
(
err
,
algorithmpredicates
.
ErrFakePredicate
)
{
...
...
plugin/pkg/scheduler/schedulercache/cache.go
View file @
a51f266e
...
...
@@ -35,14 +35,14 @@ var (
// It automatically starts a go routine that manages expiration of assumed pods.
// "ttl" is how long the assumed pod will get expired.
// "stop" is the channel that would close the background goroutine.
func
New
(
ttl
time
.
Duration
,
stop
chan
struct
{})
Cache
{
func
New
(
ttl
time
.
Duration
,
stop
<-
chan
struct
{})
Cache
{
cache
:=
newSchedulerCache
(
ttl
,
cleanAssumedPeriod
,
stop
)
cache
.
run
()
return
cache
}
type
schedulerCache
struct
{
stop
chan
struct
{}
stop
<-
chan
struct
{}
ttl
time
.
Duration
period
time
.
Duration
...
...
@@ -62,7 +62,7 @@ type podState struct {
deadline
*
time
.
Time
}
func
newSchedulerCache
(
ttl
,
period
time
.
Duration
,
stop
chan
struct
{})
*
schedulerCache
{
func
newSchedulerCache
(
ttl
,
period
time
.
Duration
,
stop
<-
chan
struct
{})
*
schedulerCache
{
return
&
schedulerCache
{
ttl
:
ttl
,
period
:
period
,
...
...
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