Skip to content
GitLab
Menu
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
b32534b2
Commit
b32534b2
authored
Sep 26, 2003
by
Mac Newbold
Browse files
Don't show nodes that are the parent of one or more subnodes.
In particular, this keeps the ixp host nodes from showing up.
parent
a50afa5c
Changes
1
Hide whitespace changes
Inline
Side-by-side
vis/prerender.in
View file @
b32534b2
...
...
@@ -57,17 +57,17 @@ my $debug = 0;
my
$thumb
=
0
;
my
$foreground
=
0
;
if
(
defined
(
$options
{"
v
"})
)
{
$debug
++
;
if
(
defined
(
$options
{"
v
"})
)
{
$debug
++
;
# pass verbosity along to thumbnail render.
$THUMB_CMD
.=
"
-v
";
$THUMB_CMD
.=
"
-v
";
}
if
(
defined
(
$options
{"
t
"})
)
{
$thumb
++
;
if
(
defined
(
$options
{"
t
"})
)
{
$thumb
++
;
}
if
(
defined
(
$options
{"
f
"})
)
{
$foreground
++
;
if
(
defined
(
$options
{"
f
"})
)
{
$foreground
++
;
}
#my ($pid) = $ARGV[0];
...
...
@@ -89,26 +89,26 @@ sub handler ($) {
#
# See if another prerender is still running. If so, kill it and update the
# pid in the DB. We always kill a running prerender.
# pid in the DB. We always kill a running prerender.
#
KillOldRender
();
### If they specified -r, meaning they just wanted to remove vis info
### If they specified -r, meaning they just wanted to remove vis info
### from the DB, we do it and quit.
if
(
defined
(
$options
{"
r
"}))
{
DBQueryFatal
("
DELETE FROM vis_nodes WHERE pid='
$pid
' AND eid='
$eid
'
");
exit
0
;
DBQueryFatal
("
DELETE FROM vis_nodes WHERE pid='
$pid
' AND eid='
$eid
'
");
exit
0
;
}
#
# Okay, go into the background.
#
# Okay, go into the background.
#
if
(
!
$foreground
)
{
if
(
TBBackGround
("
prerender.output
"))
{
#
# Parent exits normally
#
print
STDOUT
"
Image rendering proceeding in background mode ...
\n
";
print
STDOUT
"
Image rendering proceeding in background mode ...
\n
";
exit
(
0
);
}
...
...
@@ -122,7 +122,7 @@ if (! $foreground) {
# Enter our pid into the DB.
#
$renderpid
=
$PID
;
DBQueryFatal
("
update experiments set
"
.
"
prerender_pid=
$renderpid
"
.
"
where pid='
$pid
' and eid='
$eid
'
");
...
...
@@ -135,7 +135,7 @@ setpriority(PRIO_PROCESS, 0, 15);
# read nodes
my
$result
=
DBQueryWarn
("
SELECT vname FROM virt_nodes
"
.
my
$result
=
DBQueryWarn
("
SELECT vname
,fixed
FROM virt_nodes
"
.
"
WHERE pid='
$pid
' AND eid='
$eid
'
");
fatal
("
Failed to get virt_nodes info from DB
")
...
...
@@ -144,10 +144,23 @@ fatal("Failed to get virt_nodes info from DB")
my
$nodes
=
();
my
$lans
=
();
my
$links
=
();
my
$fixednodes
=
();
# all virt_nodes are visualizer nodes of type "node"
while
(
my
(
$vname
)
=
$result
->
fetchrow
)
{
$nodes
{
$vname
}{"
type
"}
=
"
node
";
while
(
my
(
$vname
,
$fixed
)
=
$result
->
fetchrow
)
{
if
(
!
defined
(
$fixednodes
{
$vname
}))
{
# This node is not a parent node, so we can add it
$nodes
{
$vname
}{"
type
"}
=
"
node
";
}
if
(
defined
(
$fixed
)
&&
$fixed
ne
"")
{
# $vname is a subnode of $fixed, so we don't want
# to viz any vnames named $fixed
$fixednodes
{
$fixed
}
=
$vname
;
if
(
defined
(
$nodes
{
$fixed
}))
{
# Remove the node if it is already there
delete
$nodes
{
$fixed
};
}
}
}
# read lans
...
...
@@ -160,7 +173,10 @@ fatal("Failed to get virt_lans info from DB")
while
(
my
(
$vname
,
$member
)
=
$result
->
fetchrow
)
{
$member
=~
s/\:.*//
;
$lans
{
$vname
}{
$member
}
=
1
;
if
(
defined
(
$nodes
{
$vname
}))
{
# the node exists, so add the link
$lans
{
$vname
}{
$member
}
=
1
;
}
}
# construct links from lans
...
...
@@ -233,21 +249,21 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
# stashes away all properties returned for each graph node.
# (All we care about for now is "pos")
# Links are ignored.
while
(
<
NEATO
>
)
{
if
(
/^\s*(\w+)\s\[([^\]]*)\]/
)
{
# this line is a property set
(
$cmd
,
$props
)
=
(
$
1
,
$
2
);
$props
=~
s/[\=\,]/ /g
;
while
((
$props
=~
s/^\s*(\w+)\s+((\"[^\"]*\")|(\w+))\s*//
))
{
# add each property to %props
(
$k
,
$v
)
=
(
$
1
,
$
2
);
$v
=~
s/\"//g
;
$props
{
$k
}
=
$v
;
# print "property $k gets value $v\n";
}
}
if
(
$cmd
=~
/^node$/
)
{
# print "node property $props\n";
}
elsif
(
$cmd
=~
/^graph$/
)
{
...
...
@@ -255,32 +271,32 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
}
else
{
# there is a name here, not "node" or "graph"
# so it terminates the node.. store props away.
$nodeProps
{
$cmd
}
=
{
%props
};
$nodeProps
{
$cmd
}
=
{
%props
};
%props
=
();
}
}
}
}
# done with neato process.
close
(
NEATO
);
# obtain X,Y for each node from stashed Properties.
foreach
$node
(
keys
%nodes
)
{
my
$mungedName
=
mungeName
(
$node
);
if
(
exists
$nodeProps
{
$mungedName
}{"
pos
"})
{
$s
=
$nodeProps
{
$mungedName
}{"
pos
"};
$s
=~
/^\s*(\d+)\s+(\d+)/
;
$s
=~
/^\s*(\d+)\s+(\d+)/
;
$nodes
{
$node
}{"
x
"}
=
$
1
;
$nodes
{
$node
}{"
y
"}
=
$
2
;
$nodes
{
$node
}{"
y
"}
=
$
2
;
}
else
{
warn
"
No position information returned for
$node
(mungedName=
$mungedName
)
";
}
}
### Fixup positions (eat free columns and rows)
my
$subX
=
0
;
my
$lastX
=
0
;
foreach
$i
(
sort
{
$nodes
{
$a
}{"
x
"}
<=>
$nodes
{
$b
}{"
x
"}}
keys
%nodes
)
{
...
...
@@ -292,7 +308,7 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
$lastX
=
$nodes
{
$i
}{"
x
"};
$nodes
{
$i
}{"
x
"}
-=
$subX
;
}
my
$subY
=
0
;
my
$lastY
=
0
;
foreach
$i
(
sort
{
$nodes
{
$a
}{"
y
"}
<=>
$nodes
{
$b
}{"
y
"}}
keys
%nodes
)
{
...
...
@@ -305,7 +321,7 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
$nodes
{
$i
}{"
y
"}
-=
$subY
;
}
# check for overlaps
# check for overlaps
# false positive: each pair is checked twice. should fix this
# false positive: two edges which end at the same node "collide".
# but, this shouldn't give any attempt an unfair advantage.
...
...
@@ -331,7 +347,7 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
foreach
my
$linkb
(
keys
%links
)
{
# never check a link against itself
if
(
$linka
eq
$linkb
)
{
next
;
}
my
(
$b1
,
$b2
)
=
(
$linkb
=~
/(\S+)\s(\S+)/
);
defined
$b1
or
fatal
("
b1
");
...
...
@@ -360,13 +376,13 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
# there's nothing to be done.
next
;
}
# if segments share a common endpoint,
# then see if they are at a greater than 5 degree angle.
my
(
$adx
,
$ady
)
=
(
$nodes
{
$unshared0
}{"
x
"}
-
$nodes
{
$shared
}{"
x
"},
my
(
$adx
,
$ady
)
=
(
$nodes
{
$unshared0
}{"
x
"}
-
$nodes
{
$shared
}{"
x
"},
$nodes
{
$unshared0
}{"
y
"}
-
$nodes
{
$shared
}{"
y
"}
);
my
(
$bdx
,
$bdy
)
=
(
$nodes
{
$unshared1
}{"
x
"}
-
$nodes
{
$shared
}{"
x
"},
my
(
$bdx
,
$bdy
)
=
(
$nodes
{
$unshared1
}{"
x
"}
-
$nodes
{
$shared
}{"
x
"},
$nodes
{
$unshared1
}{"
y
"}
-
$nodes
{
$shared
}{"
y
"}
);
my
$alen
=
sqrt
(
$adx
*
$adx
+
$ady
*
$ady
);
...
...
@@ -377,42 +393,42 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
# cos(Theta), which we compare with cos(5 degrees).
my
$dotProduct
=
(
$adx
*
$bdx
+
$ady
*
$bdy
)
/
(
$alen
*
$blen
);
# cosine of 10 deg is ~0.9848
# cosine of 5 deg is ~0.9962
if
(
$dotProduct
>
0.9962
)
{
# cosine of 10 deg is ~0.9848
# cosine of 5 deg is ~0.9962
if
(
$dotProduct
>
0.9962
)
{
# dprint "overlap '$linka'-'$linkb' $dotProduct\n";
# bad overlap.
$overlaps
+=
0.9
;
}
elsif
(
$dotProduct
>
0.9848
)
{
$overlaps
+=
0.9
;
}
elsif
(
$dotProduct
>
0.9848
)
{
# dprint "overlap '$linka'-'$linkb' $dotProduct\n";
$overlaps
+=
0.5
;
$overlaps
+=
0.5
;
}
next
;
}
# formula derived from solving simultaneous parametric line equations
# u is parameter for line A, v is for line B.
# for line segments to collide, u and v of collision must both be
# for line segments to collide, u and v of collision must both be
# between 0 and 1 (inclusive).
my
(
$k0
,
$k1
,
$k2
)
=
(
$a2x
-
$a1x
,
$b1x
-
$b2x
,
$a1x
-
$b1x
);
my
(
$k3
,
$k4
,
$k5
)
=
(
$a2y
-
$a1y
,
$b1y
-
$b2y
,
$a1y
-
$b1y
);
my
$v_n
=
(
$k2
*
$k3
-
$k0
*
$k5
);
my
$v_d
=
(
$k0
*
$k4
-
$k3
*
$k1
);
if
(
$v_d
<
0.001
&&
$v_d
>
-
0.001
)
{
next
;
}
# no solution (i.e., lines are parallel)
my
$v
=
$v_n
/
$v_d
;
my
$u_n
=
-
(
$k4
*
$v
+
$k5
);
my
$u_d
=
$k3
;
if
(
$u_d
<
0.001
&&
$u_d
>
-
0.001
)
{
next
;
}
# no solution (i.e., lines are parallel)
my
$u
=
$u_n
/
$u_d
;
if
(
$u
>=
0.0
&&
$u
<=
1.0
&&
if
(
$u
>=
0.0
&&
$u
<=
1.0
&&
$v
>=
0.0
&&
$v
<=
1.0
)
{
#dprint "overlap '$linka'-'$linkb' u=$u v=$v\n";
$overlaps
++
;
...
...
@@ -435,7 +451,7 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
# trying to vis this experiment during this window.
$result
=
DBQueryWarn
("
lock tables vis_nodes write
");
fatal
("
Failed to lock vis_nodes table.
")
if
(
!
$result
);
...
...
@@ -447,20 +463,20 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
# Then stash new one.
foreach
$node
(
keys
%nodes
)
{
$result
=
$result
=
DBQueryWarn
("
INSERT INTO vis_nodes
"
.
"
(vname, pid, eid, vis_type, x, y) VALUES
"
.
"
('
$node
', '
$pid
', '
$eid
',
"
.
"
'
"
.
$nodes
{
$node
}{"
type
"}
.
"
',
"
.
"
'
"
.
$nodes
{
$node
}{"
x
"}
.
"
',
"
.
"
'
"
.
$nodes
{
$node
}{"
y
"}
.
"
')
");
fatal
("
Failed to insert new vis_nodes into DB
")
if
(
!
$result
);
}
$result
=
DBQueryWarn
("
unlock tables
");
fatal
("
Failed to unlock vis_nodes table.
")
if
(
!
$result
);
...
...
@@ -473,7 +489,7 @@ for ($attempt = 0; $attempt < 16; $attempt++) {
if
(
$thumb
)
{
my
$workdir
=
TBExptWorkDir
(
$pid
,
$eid
);
my
$fname
=
"
$workdir
/
$eid
.png
";
if
(
system
("
$THUMB_CMD
$pid
$eid
>
$fname
"))
{
print
STDERR
"
Error generating thumbnail.
\n
";
}
...
...
@@ -505,7 +521,7 @@ sub mungeName($) {
return
$mungeMap
{
$n
};
}
my
$nm
=
$n
;
$nm
=~
s/\W+/_/g
;
$nm
=~
s/\W+/_/g
;
$nm
.=
"
__
"
.
$mungeUID
++
;
$mungeMap
{
$n
}
=
$nm
;
return
$nm
;
...
...
@@ -532,9 +548,9 @@ sub cleanup()
sub
fatal
($)
{
my
$msg
=
shift
;
cleanup
();
DBQueryFatal
("
DELETE FROM vis_nodes WHERE pid='
$pid
' AND eid='
$eid
'
");
DBQueryFatal
("
DELETE FROM vis_nodes WHERE pid='
$pid
' AND eid='
$eid
'
");
die
("
*** $0:
\n
"
.
"
$msg
\n
");
}
...
...
@@ -546,11 +562,11 @@ sub KillOldRender()
my
$query_result
=
DBQueryFatal
("
select prerender_pid from experiments
"
.
"
where pid='
$pid
' and eid='
$eid
'
");
DBQueryFatal
("
update experiments set
"
.
"
prerender_pid=-prerender_pid
"
.
"
where pid='
$pid
' and eid='
$eid
'
");
DBQueryWarn
("
unlock tables
");
my
@row
=
$query_result
->
fetchrow_array
();
...
...
@@ -566,7 +582,7 @@ sub KillOldRender()
DBQueryWarn
("
update experiments set
"
.
"
prerender_pid=-prerender_pid
"
.
"
where pid='
$pid
' and eid='
$eid
'
");
SENDMAIL
(
$TBOPS
,
"
Failed to stop prerender for
$pid
/
$eid
",
"
Could not kill(TERM) process
$procid
: $?
$err
");
...
...
Write
Preview
Supports
Markdown
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