Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
emulab
emulab-devel
Commits
7df6f955
Commit
7df6f955
authored
Jan 10, 2017
by
Gary Wong
Browse files
Properly handle admission control for "nalloc -p".
parent
c4ef4fdf
Changes
1
Hide whitespace changes
Inline
Side-by-side
db/nalloc.in
View file @
7df6f955
...
...
@@ -112,6 +112,7 @@ my @need_clearbl = ();
my
@need_pxeconfig
=
();
my
$errormsg
=
"";
my
$admission_ctrl
=
0
;
my
$slice_expires
;
TBDebugTimeStamp
("
nalloc started
");
...
...
@@ -129,6 +130,14 @@ if (!defined($project)) {
die
("
*** $0:
\n
"
.
"
Could not get project for experiment
$experiment
!
\n
");
}
if
(
$PGENISUPPORT
)
{
require
GeniSlice
;
my
$slice
=
GeniSlice
->
LookupByExperiment
(
$experiment
);
if
(
defined
(
$slice
)
)
{
$slice_expires
=
$slice
->
expires
();
}
}
#
# User must have permission to modify the experiment.
...
...
@@ -215,14 +224,6 @@ foreach my $n (@node_names) {
next
;
}
}
else
{
# Freshly allocated nodes need a history entry.
push
(
@need_history
,
$node
);
# ... and need to have their bootlogs purged.
push
(
@need_clearbl
,
$node
);
# ... and may need to recreate its pxelinux conf
push
(
@need_pxeconfig
,
$node
);
}
#
# Add info the list of nodes to reserve; done in a single query below.
...
...
@@ -247,6 +248,7 @@ if ($debug) {
}
my
%types
=
();
my
%unavail_types
=
();
foreach
my
$node
(
@nodes
)
{
$types
{
$node
->
type
()
}
=
1
;
}
...
...
@@ -254,18 +256,17 @@ foreach my $type ( keys( %types ) ) {
my
$reservations
=
Reservation
->
LookupAll
(
$type
);
if
(
!
Reservation
->
IsFeasible
(
$reservations
,
\
$errormsg
)
)
{
print
"
Existing admission control violation for type
$type
:
$errormsg
\n
";
if
(
$admission_ctrl
)
{
$error
++
;
}
print
"
Omitting admission control verification.
\n
";
goto
admissionfailure
;
print
"
Omitting
$type
admission control verification.
\n
";
$unavail_types
{
$type
}
=
1
;
}
}
my
$endtime
=
$experiment
->
autoswap
()
?
time
()
+
$experiment
->
autoswap_timeout
*
60
:
undef
;
time
()
+
$experiment
->
autoswap_timeout
*
60
:
$slice_expires
;
foreach
my
$type
(
keys
(
%types
)
)
{
next
if
(
$unavail_types
{
$type
}
);
my
$reservations
=
Reservation
->
LookupAll
(
$type
);
foreach
my
$node
(
@nodes
)
{
if
(
$node
->
type
()
eq
$type
)
{
...
...
@@ -280,20 +281,40 @@ foreach my $type ( keys( %types ) ) {
}
if
(
!
Reservation
->
IsFeasible
(
$reservations
,
\
$errormsg
)
)
{
print
"
Admission control violation for type
$type
:
$errormsg
\n
";
if
(
$force
)
{
print
"
Forcing allocation anyway...
\n
";
print
STDERR
"
WARNING: SCHEDULED RESERVATIONS ARE NOW INFEASIBLE!
\n
";
# FIXME notify admins about violation
}
$unavail_types
{
$type
}
=
1
;
}
}
if
(
$admission_ctrl
&&
!
$force
)
{
my
@goodnodes
=
();
foreach
my
$node
(
@nodes
)
{
if
(
!
exists
(
$unavail_types
{
$node
->
type
()
}
)
)
{
push
(
@goodnodes
,
$node
);
}
else
{
if
(
$admission_ctrl
)
{
$error
++
;
}
# FIXME if some but not all nodes of a given type are
# admissable, it would be nice to try harder
$noalloc
++
;
}
goto
admissionfailure
;
}
@nodes
=
@goodnodes
;
}
admissionfailure:
foreach
my
$node
(
@nodes
)
{
# Freshly allocated nodes need a history entry.
push
(
@need_history
,
$node
);
# ... and need to have their bootlogs purged.
push
(
@need_clearbl
,
$node
);
# ... and may need to recreate its pxelinux conf
push
(
@need_pxeconfig
,
$node
);
}
# Now make the reservations in the DB.
if
((
!
$noalloc
||
$partial
)
&&
(
@nodes
||
@oldnodes
)
&&
!
$error
)
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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