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
e71f43de
Commit
e71f43de
authored
Nov 10, 2015
by
k8s-merge-robot
Committed by
Dr. Stefan Schimanski
Nov 12, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge pull request #15976 from mesosphere/sur-k8sm-475-error-checking
Rebased previously reverted merge, just before this scheduler refactoring. Auto commit by PR queue bot
parent
d7964de2
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
36 deletions
+62
-36
algorithm.go
...rib/mesos/pkg/scheduler/components/algorithm/algorithm.go
+27
-10
deleter_test.go
...ib/mesos/pkg/scheduler/components/deleter/deleter_test.go
+12
-2
framework.go
...rib/mesos/pkg/scheduler/components/framework/framework.go
+2
-2
registry.go
contrib/mesos/pkg/scheduler/podtask/registry.go
+13
-14
registry_test.go
contrib/mesos/pkg/scheduler/podtask/registry_test.go
+8
-8
No files found.
contrib/mesos/pkg/scheduler/components/algorithm/algorithm.go
View file @
e71f43de
...
...
@@ -79,12 +79,19 @@ func (k *schedulerAlgorithm) Schedule(pod *api.Pod) (string, error) {
log
.
Infof
(
"aborting Schedule, pod has been deleted %+v"
,
pod
)
return
""
,
errors
.
NoSuchPodErr
}
podTask
,
err
:=
podtask
.
New
(
ctx
,
""
,
pod
)
if
err
!=
nil
{
log
.
Warningf
(
"aborting Schedule, unable to create podtask object %+v: %v"
,
pod
,
err
)
return
""
,
err
}
return
k
.
doSchedule
(
k
.
sched
.
Tasks
()
.
Register
(
podTask
,
nil
))
podTask
,
err
=
k
.
sched
.
Tasks
()
.
Register
(
podTask
)
if
err
!=
nil
{
return
""
,
err
}
return
k
.
doSchedule
(
podTask
)
//TODO(jdef) it's possible that the pod state has diverged from what
//we knew previously, we should probably update the task.Pod state here
...
...
@@ -100,7 +107,7 @@ func (k *schedulerAlgorithm) Schedule(pod *api.Pod) (string, error) {
// but we're going to let someone else handle it, probably the mesos task error handler
return
""
,
fmt
.
Errorf
(
"task %s has already been launched, aborting schedule"
,
task
.
ID
)
}
else
{
return
k
.
doSchedule
(
task
,
nil
)
return
k
.
doSchedule
(
task
)
}
default
:
...
...
@@ -109,15 +116,16 @@ func (k *schedulerAlgorithm) Schedule(pod *api.Pod) (string, error) {
}
// Call ScheduleFunc and subtract some resources, returning the name of the machine the task is scheduled on
func
(
k
*
schedulerAlgorithm
)
doSchedule
(
task
*
podtask
.
T
,
err
error
)
(
string
,
error
)
{
func
(
k
*
schedulerAlgorithm
)
doSchedule
(
task
*
podtask
.
T
)
(
string
,
error
)
{
var
offer
offers
.
Perishable
var
err
error
if
task
.
HasAcceptedOffer
()
{
// verify that the offer is still on the table
offerId
:=
task
.
GetOfferId
()
if
offer
,
ok
:=
k
.
sched
.
Offers
()
.
Get
(
offerId
);
ok
&&
!
offer
.
HasExpired
()
{
// skip tasks that have already have assigned offers
offer
=
task
.
Offer
}
else
{
var
ok
bool
offer
,
ok
=
k
.
sched
.
Offers
()
.
Get
(
task
.
GetOfferId
())
if
!
ok
||
offer
.
HasExpired
()
{
task
.
Offer
.
Release
()
task
.
Reset
()
if
err
=
k
.
sched
.
Tasks
()
.
Update
(
task
);
err
!=
nil
{
...
...
@@ -125,26 +133,35 @@ func (k *schedulerAlgorithm) doSchedule(task *podtask.T, err error) (string, err
}
}
}
if
err
==
nil
&&
offer
==
nil
{
if
offer
==
nil
{
offer
,
err
=
k
.
podScheduler
.
SchedulePod
(
k
.
sched
.
Offers
(),
task
)
}
if
err
!=
nil
{
return
""
,
err
}
details
:=
offer
.
Details
()
if
details
==
nil
{
return
""
,
fmt
.
Errorf
(
"offer already invalid/expired for task %v"
,
task
.
ID
)
}
if
task
.
Offer
!=
nil
&&
task
.
Offer
!=
offer
{
return
""
,
fmt
.
Errorf
(
"task.offer assignment must be idempotent, task %+v: offer %+v"
,
task
,
offer
)
}
task
.
Offer
=
offer
k
.
podScheduler
.
Procurement
()(
task
,
details
)
// TODO(jdef) why is nothing checking the error returned here?
if
err
:=
k
.
podScheduler
.
Procurement
()(
task
,
details
);
err
!=
nil
{
offer
.
Release
()
task
.
Reset
()
return
""
,
err
}
if
err
:=
k
.
sched
.
Tasks
()
.
Update
(
task
);
err
!=
nil
{
offer
.
Release
()
return
""
,
err
}
return
details
.
GetHostname
(),
nil
}
contrib/mesos/pkg/scheduler/components/deleter/deleter_test.go
View file @
e71f43de
...
...
@@ -60,11 +60,16 @@ func TestDeleteOne_PendingPod(t *testing.T) {
UID
:
"foo0"
,
Namespace
:
api
.
NamespaceDefault
,
}}}
_
,
err
:=
reg
.
Register
(
podtask
.
New
(
api
.
NewDefaultContext
(),
"bar"
,
pod
.
Pod
)
)
task
,
err
:=
podtask
.
New
(
api
.
NewDefaultContext
(),
"bar"
,
pod
.
Pod
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create task: %v"
,
err
)
}
_
,
err
=
reg
.
Register
(
task
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to register task: %v"
,
err
)
}
// preconditions
q
:=
queue
.
NewDelayFIFO
()
qr
:=
queuer
.
New
(
q
,
nil
)
...
...
@@ -95,7 +100,12 @@ func TestDeleteOne_Running(t *testing.T) {
UID
:
"foo0"
,
Namespace
:
api
.
NamespaceDefault
,
}}}
task
,
err
:=
reg
.
Register
(
podtask
.
New
(
api
.
NewDefaultContext
(),
"bar"
,
pod
.
Pod
))
task
,
err
:=
podtask
.
New
(
api
.
NewDefaultContext
(),
"bar"
,
pod
.
Pod
)
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %v"
,
err
)
}
task
,
err
=
reg
.
Register
(
task
)
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %v"
,
err
)
}
...
...
contrib/mesos/pkg/scheduler/components/framework/framework.go
View file @
e71f43de
...
...
@@ -484,7 +484,7 @@ func (k *framework) reconcileNonTerminalTask(driver bindings.SchedulerDriver, ta
}
else
if
pod
,
err
:=
k
.
client
.
Pods
(
namespace
)
.
Get
(
name
);
err
==
nil
{
if
t
,
ok
,
err
:=
podtask
.
RecoverFrom
(
*
pod
);
ok
{
log
.
Infof
(
"recovered task %v from metadata in pod %v/%v"
,
taskId
,
namespace
,
name
)
_
,
err
:=
k
.
sched
.
Tasks
()
.
Register
(
t
,
nil
)
_
,
err
:=
k
.
sched
.
Tasks
()
.
Register
(
t
)
if
err
!=
nil
{
// someone beat us to it?!
log
.
Warningf
(
"failed to register recovered task: %v"
,
err
)
...
...
@@ -688,7 +688,7 @@ func (ks *framework) recoverTasks() error {
log
.
Errorf
(
"failed to delete pod '%v/%v': %v"
,
pod
.
Namespace
,
pod
.
Name
,
err
)
}
}
else
if
ok
{
ks
.
sched
.
Tasks
()
.
Register
(
t
,
nil
)
ks
.
sched
.
Tasks
()
.
Register
(
t
)
recoverSlave
(
t
)
log
.
Infof
(
"recovered task %v from pod %v/%v"
,
t
.
ID
,
pod
.
Namespace
,
pod
.
Name
)
}
...
...
contrib/mesos/pkg/scheduler/podtask/registry.go
View file @
e71f43de
...
...
@@ -41,7 +41,7 @@ const (
type
Registry
interface
{
// register the specified task with this registry, as long as the current error
// condition is nil. if no errors occur then return a copy of the registered task.
Register
(
*
T
,
error
)
(
*
T
,
error
)
Register
(
*
T
)
(
*
T
,
error
)
// unregister the specified task from this registry
Unregister
(
*
T
)
...
...
@@ -103,20 +103,19 @@ func (k *inMemoryRegistry) ForPod(podID string) (task *T, currentState StateType
}
// registers a pod task unless the spec'd error is not nil
func
(
k
*
inMemoryRegistry
)
Register
(
task
*
T
,
err
error
)
(
*
T
,
error
)
{
if
err
==
nil
{
k
.
rw
.
Lock
()
defer
k
.
rw
.
Unlock
()
if
_
,
found
:=
k
.
podToTask
[
task
.
podKey
];
found
{
return
nil
,
fmt
.
Errorf
(
"task already registered for pod key %q"
,
task
.
podKey
)
}
if
_
,
found
:=
k
.
taskRegistry
[
task
.
ID
];
found
{
return
nil
,
fmt
.
Errorf
(
"task already registered for id %q"
,
task
.
ID
)
}
k
.
podToTask
[
task
.
podKey
]
=
task
.
ID
k
.
taskRegistry
[
task
.
ID
]
=
task
func
(
k
*
inMemoryRegistry
)
Register
(
task
*
T
)
(
*
T
,
error
)
{
k
.
rw
.
Lock
()
defer
k
.
rw
.
Unlock
()
if
_
,
found
:=
k
.
podToTask
[
task
.
podKey
];
found
{
return
nil
,
fmt
.
Errorf
(
"task already registered for pod key %q"
,
task
.
podKey
)
}
if
_
,
found
:=
k
.
taskRegistry
[
task
.
ID
];
found
{
return
nil
,
fmt
.
Errorf
(
"task already registered for id %q"
,
task
.
ID
)
}
return
task
.
Clone
(),
err
k
.
podToTask
[
task
.
podKey
]
=
task
.
ID
k
.
taskRegistry
[
task
.
ID
]
=
task
return
task
.
Clone
(),
nil
}
// updates internal task state. updates are limited to Spec, Flags, and Offer for
...
...
contrib/mesos/pkg/scheduler/podtask/registry_test.go
View file @
e71f43de
...
...
@@ -38,14 +38,14 @@ func TestInMemoryRegistry_RegisterGetUnregister(t *testing.T) {
// add a task
a
,
_
:=
fakePodTask
(
"a"
)
a_clone
,
err
:=
registry
.
Register
(
a
,
nil
)
a_clone
,
err
:=
registry
.
Register
(
a
)
assert
.
NoError
(
err
)
assert
.
Equal
(
a_clone
.
ID
,
a
.
ID
)
assert
.
Equal
(
a_clone
.
podKey
,
a
.
podKey
)
// add another task
b
,
_
:=
fakePodTask
(
"b"
)
b_clone
,
err
:=
registry
.
Register
(
b
,
nil
)
b_clone
,
err
:=
registry
.
Register
(
b
)
assert
.
NoError
(
err
)
assert
.
Equal
(
b_clone
.
ID
,
b
.
ID
)
assert
.
Equal
(
b_clone
.
podKey
,
b
.
podKey
)
...
...
@@ -79,21 +79,21 @@ func TestInMemoryRegistry_RegisterGetUnregister(t *testing.T) {
assert
.
Nil
(
task
)
// re-add a task
a_clone
,
err
=
registry
.
Register
(
a
,
nil
)
a_clone
,
err
=
registry
.
Register
(
a
)
assert
.
Error
(
err
)
assert
.
Nil
(
a_clone
)
// re-add a task with another podKey, but same task id
another_a
:=
a
.
Clone
()
another_a
.
podKey
=
"another-pod"
another_a_clone
,
err
:=
registry
.
Register
(
another_a
,
nil
)
another_a_clone
,
err
:=
registry
.
Register
(
another_a
)
assert
.
Error
(
err
)
assert
.
Nil
(
another_a_clone
)
// re-add a task with another task ID, but same podKey
another_b
:=
b
.
Clone
()
another_b
.
ID
=
"another-task-id"
another_b_clone
,
err
:=
registry
.
Register
(
another_b
,
nil
)
another_b_clone
,
err
:=
registry
.
Register
(
another_b
)
assert
.
Error
(
err
)
assert
.
Nil
(
another_b_clone
)
...
...
@@ -124,7 +124,7 @@ func TestInMemoryRegistry_State(t *testing.T) {
// add a task
a
,
_
:=
fakePodTask
(
"a"
)
a_clone
,
err
:=
registry
.
Register
(
a
,
nil
)
a_clone
,
err
:=
registry
.
Register
(
a
)
assert
.
NoError
(
err
)
assert
.
Equal
(
a
.
State
,
a_clone
.
State
)
...
...
@@ -167,7 +167,7 @@ func TestInMemoryRegistry_Update(t *testing.T) {
// create registry
registry
:=
NewInMemoryRegistry
()
a
,
_
:=
fakePodTask
(
"a"
)
registry
.
Register
(
a
.
Clone
()
,
nil
)
// here clone a because we change it below
registry
.
Register
(
a
.
Clone
())
// here clone a because we change it below
// state changes are ignored
a
.
State
=
StateRunning
...
...
@@ -256,7 +256,7 @@ func testStateTrace(t *testing.T, transitions []transition) *Registry {
registry
:=
NewInMemoryRegistry
()
a
,
_
:=
fakePodTask
(
"a"
)
a
,
_
=
registry
.
Register
(
a
,
nil
)
a
,
_
=
registry
.
Register
(
a
)
// initial pending state
assert
.
Equal
(
a
.
State
,
StatePending
)
...
...
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