This commit is contained in:
Oliver Kennedy 2021-04-07 23:16:52 -04:00
parent dd1fe23458
commit ed4460808f
Signed by: okennedy
GPG key ID: 3E5F9B3ABD3FDB60
7 changed files with 1595 additions and 1 deletions

View file

@ -104,15 +104,18 @@ schedule:
slides: slide/2021-04-06-TheoryOfTransactions.html
- date: "Apr. 8"
topic: "Transactions: Pessimistic"
materials:
slides: slide/2021-04-08-Locking.html
- date: "Apr. 12"
due: "Checkpoint 2"
- date: "Apr. 13"
topic: "Aggregation + Checkpoint 3"
- date: "Apr. 15"
topic: "Transactions: Optimistic"
due: "Checkpoint 3"
- date: "Apr. 20"
topic: "Indexing Review + Checkpoint 4"
- date: "Apr. 22"
due: "Checkpoint 3"
topic: "Logging + Recovery"
- date: "Apr. 27"
topic: "Distributed Commit"

View file

@ -0,0 +1,590 @@
---
template: templates/cse4562_2021_slides.erb
title: Pessimistic Concurrency Control
date: April 8, 2021
textbook: Ch. 18.3-18.7, 19.2
---
<!-- 2019 by OK
This ended up being a bit long, but mostly because I spent a lot of time going over
Happens-Before again. Especially since the last lecture ended up a bit short,
it might be worth doing some more thorough examples next year.
Another point that might be made better is that locking is used to enforce ORDER and not ISOLATION. That is, classical OS-style locking is used to keep multiple transactions from executing in parallel (strict serial ordering). 2-phase locking is used to ensure the relative ordering of conflicts. A timeline along the lines of the validation tests in the OCC lecture might be helpful.
-->
<section>
<section>
<dl>
<div class="fragment">
<dt>Schedule</dt>
<dd>A sequence of read and writes from one or more transactions to objects</dd>
</div>
<div class="fragment">
<dt>Serial Schedule</dt>
<dd>A schedule with <u>no</u> interleaving</dd>
<dd class="fragment">... but with an arbitrary transaction order</dd>
</div>
<div class="fragment">
<dt>Serial<u>izable</u> Schedule</dt>
<dd>A schedule that produces the same output as a serial schedule</dd>
</div>
</dl>
</section>
<section>
<table style="float: left;">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
<tr>
<td> | </td>
<td><code>W(A)</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td> | </td>
<td></td>
<td><code>W(A)</code></td>
<td></td>
</tr>
<tr>
<td> | </td>
<td></td>
<td><code>W(B)</code></td>
<td></td>
</tr>
<tr>
<td> | </td>
<td></td>
<td></td>
<td><code>W(B)</code></td>
</tr>
<tr>
<td> ↓ </td>
<td><code>W(B)</code></td>
<td></td>
<td></td>
</tr>
</table>
<p class="fragment" style="font-size: 80%">T1's write to A "happens before" T2's write</p>
<p class="fragment" style="font-size: 80%">T2's write to B "happens before" T3's write</p>
<p class="fragment" style="font-size: 80%">T2's write to B "happens before" T1's write</p>
<img src="2021-04-08/DependencyCycle.svg" height="150px" class="fragment"/>
<p class="fragment" style="font-size: 80%">Cycle! No equivalent serial schedule!</p>
</section>
<section>
<p>An acyclic "Happens Before" or <u>Dependency Graph</u> is conflict serializable.</p>
</section>
<section>
<h3>Forcing Acyclicity</h3>
<dl>
<div class="fragment highlight-blue">
<dt>Locking</dt>
<dd></dd>
</div>
<div>
<dt>Snapshot Isolation</dt>
<dd></dd>
</div>
<div>
<dt>Timestamp Concurrency Control<span style="font-size: 80%; vertical-align: top">*</span></dt>
<dd></dd>
</div>
</dl>
</section>
</section>
<section>
<section>
<p><b>Goal:</b> Enforce acyclic conflict graphs</p>
</section>
<section>
<p><b>Observation:</b> Conflicts only occur on accesses to the same object</p>
</section>
<section>
<p><b>Idea:</b> When a second transaction tries to access an object, require the first to COMMIT or ABORT first.</p>
</section>
<section>
<p><b>Idea:</b> When a second transaction tries to access an object, require the first to <strike>COMMIT or ABORT first</strike> agree to never create more conflicts.</p>
</section>
<section>
<h3>2-Phase Locking</h3>
<p class="fragment">Create one lock for each object.</p>
<p class="fragment">Each transaction operates in two "phases".</p>
</section>
<section>
<dl>
<div class="fragment">
<dt>Acquire Phase</dt>
<dd>Before accessing an object, the transaction must acquire the object's lock.</dd>
<dd class="fragment">The transaction does not release locks.</dd>
</div>
<div class="fragment">
<dt>Release Phase</dt>
<dd>A transaction can release locks</dd>
<dd class="fragment">A transaction can never again access an object it doesn't have a lock for.</dd>
</div>
</dl>
<p class="fragment">In practice, the release phase happens all at once at the end</p>
</section>
<section>
<img src="2021-04-08/2PhaseLocking.svg" height="400px"/>
</section>
<section>
<table style="float: left;">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
<tr>
<td> | </td>
<td></td>
<td></td>
<td><code>R(C)</code></td>
</tr>
<tr>
<td> | </td>
<td><code>W(A)</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td> | </td>
<td></td>
<td><code>R(B)</code></td>
<td></td>
</tr>
<tr>
<td> | </td>
<td></td>
<td></td>
<td><code>W(C)</code></td>
</tr>
<tr>
<td> | </td>
<td><code>W(B)</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td> ↓ </td>
<td></td>
<td><code>W(C)</code></td>
<td></td>
</tr>
</table>
<img src="2021-04-08/2PLDepGraph.svg" style="margin-top: 100px;">
<p class="fragment">Conflict Serializable.</p>
<p class="fragment">Can 2PL create this schedule?</p>
</section>
<section>
<div style="float:right">
<table>
<tr><td style="vertical-align: middle"><code>L(...)</code></td><td>Acquire <span style="font-size: 70%">(Lock)</span></td></tr>
<tr><td style="vertical-align: middle"><code>U(...)</code></td><td>Release <span style="font-size: 70%">(Unlock)</span></td></tr>
</table>
<p class="fragment" data-fragment-index="11" style="margin-top: 50px;">2PL <b>can</b> create this schedule</p>
</div>
<table style="font-size: 50%">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
<tr>
<td> | <br/> | </td>
<td></td>
<td></td>
<td><code class="fragment" data-fragment-index="1">L(C)</code><br/><code>R(C)</code></td>
</tr>
<tr>
<td> | <br/> | </td>
<td><code class="fragment" data-fragment-index="2">L(A)</code><br/><code>W(A)</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td> | <br/> | </td>
<td></td>
<td><code class="fragment" data-fragment-index="3">L(B)</code><br/><code>R(B)</code></td>
<td></td>
</tr>
<tr>
<td> | <br/> | </td>
<td></td>
<td></td>
<td><code>W(C)</code><br/><code class="fragment" data-fragment-index="10">U(C)</code></td>
</tr>
<tr>
<td> | <br/> | </td>
<td></td>
<td><code class="fragment" data-fragment-index="9">L(C)</code><br/><span class="fragment highlight-red" data-fragment-index="8"><code class="fragment" data-fragment-index="7">U(B)</code></td>
<td></td>
</tr>
<tr>
<td> | <br/> | </td>
<td><span class="fragment highlight-red" data-fragment-index="5"><code class="fragment" data-fragment-index="4">L(B)</code></span><br/><code>W(B)</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td> | <br/> ↓ </td>
<td></td>
<td><span class="fragment fade-out" data-fragment-index="9"><code class="fragment" data-fragment-index="6" style="color: red">L(C)</code></span><br/><code>W(C)</code></td>
<td></td>
</tr>
</table>
</section>
</section>
<section>
<section>
<h2>Optimizations</h2>
</section>
<section>
<p><b>Observation 1: </b> Read-Read conflicts aren't a problem</p>
<p class="fragment"><b>Solution: </b> Reader/Writer Locks</p>
<p class="fragment" style="font-size: 70%">(Any number of readers <b>or</b> one writer can hold the lock)</p>
<p class="fragment">... also called Shared (S)/Exclusive (X) locks</p>
</section>
<section>
<table style="font-size: 200%">
<tr><td></td><td></td><td colspan=2 style="font-size: 60%; font-weight: bold;">Requested</td></tr>
<tr><td></td><td></td><td style="font-weight: bold;">S</td><td style="font-weight: bold;">X</td></tr>
<tr><td rowspan=2 style="font-size: 60%; font-weight: bold;">H<br/>e<br/>l<br/>d</td>
<td style="font-weight: bold">S</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: bisque">Block</td></tr>
<tr><td style="font-weight: bold;">X</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: bisque">Block</td></tr>
</table>
</section>
<section>
<h3>An object is ...</h3>
<ul>
<li>... a table</li>
<li>... a record</li>
<li>... a page</li>
<li>... a column</li>
</ul>
<p class="fragment">Which should be used?</p>
</section>
<section>
<p><b>Observation 1:</b> Too coarse locking prevents concurrency</p>
<p><b>Observation 2:</b> Too fine locking is slow</p>
</section>
<section>
<p><b>Idea 1:</b> Separate locks for tables, pages, rows, cells.</p>
<p class="fragment">Doesn't Work! Need to use the same lock for all conflicts.</p>
</section>
<section>
<p><b>Idea 2:</b> Organize locks hierarchically. Set a flag in the parent when a child is locked.</p>
</section>
<section>
<h3>New Lock Modes</h3>
<dl>
<dt>Exclusive (X)</dt>
<dd>The holding thread can safely modify the object</dd>
<dt>Shared (S)</dt>
<dd>A holding thread can safely read the object</dd>
<div class="fragment">
<dt>Intent-Exclusive (IX)</dt>
<dd>Descendant locks may be held Exclusive</dd>
<dt>Intent-Shared (IS)</dt>
<dd>Descendant locks may be held Shared</dd>
</div>
</dl>
</section>
<section>
<p>Before acquiring a descendant lock, a thread must first intent-acquire all ancestors (top-down)
</section>
<section>
<table style="font-size: 120%">
<tr><td></td><td></td><td colspan=4 style="font-size: 100%; font-weight: bold;">Requested</td></tr>
<tr><td></td><td></td>
<td style="font-weight: bold;">IS</td>
<td style="font-weight: bold;">IX</td>
<td style="font-weight: bold;">S</td>
<td style="font-weight: bold;">X</td>
</tr>
<tr><td rowspan=5 style="font-size: 100%; font-weight: bold; vertical-align: middle;">H<br/>e<br/>l<br/>d</td>
<td style="font-weight: bold">None</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td></tr>
<tr><td style="font-weight: bold;">IS</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: bisque">Block</td></tr>
<tr><td style="font-weight: bold;">IX</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: bisque">Block</td></tr>
<tr><td style="font-weight: bold;">S</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: lightblue">Allow</td>
<td style="background-color: bisque">Block</td></tr>
<tr><td style="font-weight: bold;">X</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: bisque">Block</td>
<td style="background-color: bisque">Block</td></tr>
</table>
</section>
<section>
<h3>Example 1</h3>
<svg data-src="2021-04-08/HierarchicalOK.svg"/>
</section>
<section>
<h3>Example 2</h3>
<svg data-src="2021-04-08/HierarchicalNotOK.svg"/>
</section>
</section>
<section>
<section>
<table style="font-size: 80%">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
<%
ops = [
{ t: 1, op: "S(A)" },
{ t: 1, op: "R(A)" },
{ t: 2, op: "X(B)" },
{ t: 2, op: "W(B)" },
{ t: 1, op: "S(B)", animate: "highlight-red" },
{ t: 3, op: "S(C)" },
{ t: 3, op: "R(C)" },
{ t: 2, op: "X(C)", animate: "highlight-red" },
{ t: 4, op: "X(B)", animate: "highlight-red" },
{ t: 3, op: "X(A)", animate: "highlight-red" },
]
ops.each do |op|
op[:bar] = "|"
if op.has_key? :animate
op[:op] = '<span class="fragment highlight-red">'+op[:op]+"</span>"
end
end
ops[-1][:bar] = "↓"
ops.each do |op| %>
<tr><td><%=op[:bar]%></td>
<% (1..4).each do |i|
if i == op[:t] then %>
<td><code class="fragment"><%= op[:op] %></code></td>
<% else %>
<td></td>
<% end end %>
</tr>
<% end %>
</table>
</section>
<section>
<h2>Deadlock</h2>
<p>A cycle of transactions waiting on each other's locks</p>
</section>
<section>
<p class="fragment highlight-blue"><b>Approach 1</b> Detect deadlock situations as they occur and abort deadlocked transaction</p>
<p><b>Approach 2</b> Anticipate deadlock situations before they happen</p>
</section>
<section>
<h3>The Waits-For Graph</h3>
<dl>
<dt>Nodes</dt>
<dd>Every running transaction</dd>
<dt>Directed Edges</dt>
<dd>From a transaction blocked to the transaction it's waiting for</dd>
</dl>
</section>
<section>
<table style="font-size: 80%; float: left">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
<% ops.each do |op| %>
<tr><td><%=op[:bar]%></td>
<% (1..4).each do |i|
if i == op[:t] then %>
<td><code><%= op[:op].gsub('<span class="fragment highlight-red">', '<span style="color: red">') %></code></td>
<% else %>
<td></td>
<% end end %>
</tr>
<% end %>
</table>
<svg width="200px" height="200px" style="margin-top: 100px;">
<defs>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1206"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1204"
inkscape:connector-curvature="0" />
</marker>
</defs>
<text x="0px" y="30px">T1</text>
<text x="150px" y="30px">T2</text>
<text x="0px" y="200px">T4</text>
<text x="150px" y="200px">T3</text>
<% [
[[ "50,18 140,18", 1]],
[[ "170,50 170,160", 1]],
[[ "50,160 140,40", 1]],
[[ "140,160 50,40", 1]],
[[ "50,18 140,18", 3],
[ "170,50 170,160", 3],
[ "140,160 50,40", 3]]
].each do |g| %>
<g class="fragment"><% g.each do |path, lw| %>
<path
style="fill:none;stroke:#000000;stroke-width:<%=lw%>;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1206)"
d="M <%=path%>"
inkscape:connector-curvature="0" />
<% end %></g><% end %>
</svg>
</section>
<section>
<p>A cycle is a set of transactions that will never finish</p>
<p class="fragment">Periodically check for cycles in the waits-for graph</p>
<p class="fragment">Abort transactions until the cycle is broken</p>
</section>
<section>
<b>Detecting cycles is expensive!</b>
</section>
</section>
<section>
<section>
<p><b>Idea 2:</b> Create an order over the locks (give each a #)<br/>Only allow locks to be acquired in sequence order</p>
</section>
<section>
<table style="font-size: 70%">
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
<% ops.each do |op| %>
<tr><td><%=op[:bar]%></td>
<% (1..4).each do |i|
if i == op[:t] then %>
<td><code><%= if op[:t] != 3 then op[:op].gsub('<span class="fragment highlight-red">', '<span>') else op[:op] end %></code></td>
<% else %>
<td></td>
<% end end %>
</tr>
<% end %>
</table>
<p class="fragment">T3 can't acquire X(A) because it already has S(C)</p>
</section>
<section>
<p><b>Idea 2.B:</b> Acquire all locks at the start of a transaction.</p>
</section>
<section>
<p><b>Pro: </b> No deadlocks... ever.</p>
<p><b>Pro: </b> No (expensive) cycle detection.</p>
<p><b>Con: </b> Not all transactions are supported <br/>or transactions need to know all necessary locks in advance.</p>
</section>
</section>
<section>
<section>
<p><b>Idea 3:</b> False positive deadlock detections are ok</p>
</section>
<section>
<p><b>Trivial solution:</b> Timeouts</p>
<p class="fragment">... but how long should the timeout be?</p>
</section>
<section>
<p><b>Alternative:</b> Create an order over transactions<br/>Only allow a transaction to block on "older" transactions</p>
</section>
<section>
<h3>Variant 1</h3>
<dl>
<dt class="fragment">T1 holds a lock on A</dt>
<dd class="fragment">T2 tries to acquire the lock on A and blocks</dd>
<dd class="fragment">(ok, because T1 is "older")</dd>
<dt class="fragment">T2 holds a lock on A</dt>
<dd class="fragment">T1 tries to acquire the lock on A</dd>
<dd class="fragment">ABORT T1 and restart it as a "younger" transaction</dd>
</dl>
<p class="fragment">"Wait-Die"</p>
</section>
<section>
<h3>Variant 2</h3>
<dl>
<dt class="fragment">T1 holds a lock on A</dt>
<dd class="fragment">T2 tries to acquire the lock on A and blocks</dd>
<dd class="fragment">(ok, because T1 is "older")</dd>
<dt class="fragment">T2 holds a lock on A</dt>
<dd class="fragment">T1 tries to acquire the lock on A</dd>
<dd class="fragment">ABORT T2 and restart it at the same age.</dd>
</dl>
<p class="fragment">"Wait-Wound"</p>
</section>
<section>
<dl>
<dt>Wait-Die</dt>
<dd>Abort an older transaction that tries to wait on a younger one.</dd>
<dt>Wait-Wound</dt>
<dd>If an older transaction tries to wait on a younger one, kill the younger.</dd>
</dl>
</section>
<section>
<h3>Managing Deadlocks</h3>
<dl>
<dt>Approach 1: Detection</dt>
<dd>Detect cycles (or conditions that could indicate cycles)</dd>
<dd>Abort transactions until the cycles go away</dd>
<dt>Approach 2: Recovery</dt>
<dd>Enforce an invariant on lock acquisition order</dd>
<dd>Acquire all locks upfront</dd>
</dl>
</section>
</section>

View file

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="49.325436mm"
height="37.451424mm"
viewBox="0 0 49.325435 37.451424"
version="1.1"
id="svg910"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="2019-04-01-2PLDepGraph.svg">
<defs
id="defs904">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1206"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1204"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path931"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="75.31172"
inkscape:cy="32.837877"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata907">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-84.635658,-51.020171)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="84.666664"
y="58.874992"
id="text914"><tspan
sodipodi:role="line"
id="tspan912"
x="84.666664"
y="58.874992"
style="stroke-width:0.26458332">T1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="121.81713"
y="58.874989"
id="text918"><tspan
sodipodi:role="line"
id="tspan916"
x="121.81713"
y="58.874989"
style="stroke-width:0.26458332">T2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="99.445038"
y="88.321732"
id="text922"><tspan
sodipodi:role="line"
id="tspan920"
x="99.445038"
y="88.321732"
style="stroke-width:0.26458332">T3</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1206)"
d="M 109.71414,79.175326 126.01758,60.600094"
id="path924"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 120.80582,54.452895 H 98.355186"
id="path926"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="185.08134mm"
height="75.127823mm"
viewBox="0 0 185.08134 75.127823"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="2019-04-01-2PhaseLocking.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.90509668"
inkscape:cx="531.08154"
inkscape:cy="85.914308"
inkscape:document-units="mm"
inkscape:current-layer="g871"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(2.157262,-31.668136)">
<g
id="g863"
transform="translate(-0.89340272)">
<g
id="g848">
<rect
style="fill:#87decd;stroke:#800000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect815"
width="51.422966"
height="16.646688"
x="44.601189"
y="44.511906"
rx="1.5987263"
ry="1.4699826" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:9.92000675em;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="50.605865"
y="56.368881"
id="text821"><tspan
sodipodi:role="line"
id="tspan819"
x="50.605865"
y="56.368881"
style="line-height:9.92000675em;stroke-width:0.26458332">Acquire</tspan></text>
</g>
<g
id="g853">
<rect
ry="1.4699826"
rx="1.5987263"
y="44.511906"
x="96.024155"
height="16.646687"
width="51.422974"
id="rect817"
style="fill:#de8787;stroke:#800000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:9.92000675em;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="100.81702"
y="56.368881"
id="text825"><tspan
sodipodi:role="line"
id="tspan823"
x="100.81702"
y="56.368881"
style="line-height:9.92000675em;stroke-width:0.26458332">Release</tspan></text>
</g>
</g>
<g
id="g871">
<text
id="text829"
y="71.925652"
x="89.620079"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
id="tspan833"
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="71.925652"
x="91.86628"
sodipodi:role="line">Can only be the LHS </tspan><tspan
id="tspan837"
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="82.508987"
x="89.620079"
sodipodi:role="line">of a new conflict edge</tspan><tspan
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="93.092316"
x="89.620079"
sodipodi:role="line"
id="tspan881">(would block otherwise)</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="99.266838"
y="71.925652"
id="text843"><tspan
sodipodi:role="line"
x="99.266838"
y="71.925652"
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
id="tspan841">Can never create a</tspan><tspan
sodipodi:role="line"
x="99.266838"
y="82.508987"
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
id="tspan879">new conflict edge</tspan><tspan
sodipodi:role="line"
x="99.266838"
y="93.092316"
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
id="tspan883">(no new locks)</tspan></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 95.005963,31.668136 V 106.79596"
id="path873"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

View file

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="54.720177mm"
height="51.909008mm"
viewBox="0 0 54.720177 51.909008"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="2019-04-01-DependencyCycle.svg">
<defs
id="defs2">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker867"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path865" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path830"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1117"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1115"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path827"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="-80.527164"
inkscape:cy="20.672795"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-27.939232,-43.838633)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="27.970238"
y="82.995712"
id="text817"><tspan
sodipodi:role="line"
id="tspan815"
x="27.970238"
y="82.995712"
style="stroke-width:0.26458332">T1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="70.303574"
y="83.065475"
id="text821"><tspan
sodipodi:role="line"
id="tspan819"
x="70.303574"
y="83.065475"
style="stroke-width:0.26458332">T2</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 75.595238,73.72945 c -12.365465,-13.437121 -25.497805,-15.754545 -39.876488,0"
id="path823"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
id="path825"
d="m 75.595238,84.841955 c -13.836302,14.470732 -27.047194,14.257365 -39.876488,0"
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart)"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="70.114586"
y="67.190475"
id="text1339"><tspan
sodipodi:role="line"
id="tspan1337"
x="70.114586"
y="67.190475"
style="font-size:7.05555534px;stroke-width:0.26458332">B</tspan></text>
<text
id="text1343"
y="94.404762"
x="53.483635"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="font-size:7.05555534px;stroke-width:0.26458332"
y="94.404762"
x="53.483635"
id="tspan1341"
sodipodi:role="line">A</tspan></text>
<text
id="text855"
y="51.693451"
x="70.303574"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="51.693451"
x="70.303574"
id="tspan853"
sodipodi:role="line">T3</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker867)"
d="M 75.595238,73.72945 V 54.170258"
id="path857"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

View file

@ -0,0 +1,251 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="201.10849mm"
height="126.47292mm"
viewBox="0 0 201.10849 126.47292"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="2019-04-01-HierarchicalNotOK.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="48.991591"
inkscape:cy="250.0477"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-12.820185,-29.097564)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="100.54166"
y="48.29166"
id="text817"><tspan
sodipodi:role="line"
id="tspan815"
x="100.54166"
y="48.29166"
style="stroke-width:0.26458332">Table</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="15.119047"
y="95.160713"
id="text821"><tspan
sodipodi:role="line"
id="tspan819"
x="15.119047"
y="95.160713"
style="stroke-width:0.26458332">Block1</tspan></text>
<text
id="text825"
y="95.160713"
x="73.327385"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="95.160713"
x="73.327385"
id="tspan823"
sodipodi:role="line">Block2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="126.24406"
y="95.160713"
id="text829"><tspan
sodipodi:role="line"
id="tspan827"
x="126.24406"
y="95.160713"
style="stroke-width:0.26458332">Block3</tspan></text>
<text
id="text833"
y="95.160713"
x="179.16077"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="95.160713"
x="179.16077"
id="tspan831"
sodipodi:role="line">Block4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="30.994047"
y="153.36906"
id="text837"><tspan
sodipodi:role="line"
id="tspan835"
x="30.994047"
y="153.36906"
style="stroke-width:0.26458332">Tuple2</tspan></text>
<text
id="text841"
y="153.36906"
x="78.619049"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="153.36906"
x="78.619049"
id="tspan839"
sodipodi:role="line">Tuple3</tspan></text>
<text
id="text845"
y="153.36906"
x="126.24404"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="153.36906"
x="126.24404"
id="tspan843"
sodipodi:role="line">Tuple4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="173.86908"
y="153.36906"
id="text849"><tspan
sodipodi:role="line"
id="tspan847"
x="173.86908"
y="153.36906"
style="stroke-width:0.26458332">Tuple5</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 97.363276,82.380028 113.77083,53.96131 32.883929,82.6875"
id="path851"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 142.49702,81.931546 113.77083,53.96131 196.16964,82.309524"
id="path853"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 143.25297,97.050594 142.875,141.27381"
id="path855"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 143.25297,97.050592 190.5,140.13988"
id="path857"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 95.249999,141.65178 94.116071,97.806546 48.002976,140.89583"
id="path859"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="75.973213"
y="37.708332"
id="text863"
class=""><tspan
sodipodi:role="line"
id="tspan861"
x="75.973213"
y="37.708332"
style="fill:#d35f5f;stroke-width:0.26458332">T1:IX</tspan></text>
<text
id="text867"
y="84.577377"
x="61.610119"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class=""><tspan
style="fill:#d35f5f;stroke-width:0.26458332"
y="84.577377"
x="61.610119"
id="tspan865"
sodipodi:role="line">T1:IX</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="12.851191"
y="140.89583"
id="text871"
class=""><tspan
sodipodi:role="line"
id="tspan869"
x="12.851191"
y="140.89583"
style="fill:#d35f5f;stroke-width:0.26458332">T1:X</tspan></text>
<text
id="text875"
y="36.952381"
x="117.92857"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"><tspan
style="fill:#6600ff;stroke-width:0.26458332"
y="36.952381"
x="117.92857"
id="tspan873"
sodipodi:role="line">T2:IS</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="100.91965"
y="84.577385"
id="text879"
class="fragment"><tspan
sodipodi:role="line"
id="tspan877"
x="100.91965"
y="84.577385"
style="fill:#6600ff;stroke-width:0.26458332">T2:S</tspan></text>
<path
style="fill:none;stroke:#aa0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 97.363274,80.792526 H 127.72494"
id="path949"
inkscape:connector-curvature="0"
class="fragment" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="201.10849mm"
height="126.47292mm"
viewBox="0 0 201.10849 126.47292"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="2019-04-01-HierarchicalOK.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="48.991591"
inkscape:cy="250.0477"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-12.820185,-29.097564)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="100.54166"
y="48.29166"
id="text817"><tspan
sodipodi:role="line"
id="tspan815"
x="100.54166"
y="48.29166"
style="stroke-width:0.26458332">Table</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="15.119047"
y="95.160713"
id="text821"><tspan
sodipodi:role="line"
id="tspan819"
x="15.119047"
y="95.160713"
style="stroke-width:0.26458332">Block1</tspan></text>
<text
id="text825"
y="95.160713"
x="73.327385"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="95.160713"
x="73.327385"
id="tspan823"
sodipodi:role="line">Block2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="126.24406"
y="95.160713"
id="text829"><tspan
sodipodi:role="line"
id="tspan827"
x="126.24406"
y="95.160713"
style="stroke-width:0.26458332">Block3</tspan></text>
<text
id="text833"
y="95.160713"
x="179.16077"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="95.160713"
x="179.16077"
id="tspan831"
sodipodi:role="line">Block4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="30.994047"
y="153.36906"
id="text837"><tspan
sodipodi:role="line"
id="tspan835"
x="30.994047"
y="153.36906"
style="stroke-width:0.26458332">Tuple2</tspan></text>
<text
id="text841"
y="153.36906"
x="78.619049"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="153.36906"
x="78.619049"
id="tspan839"
sodipodi:role="line">Tuple3</tspan></text>
<text
id="text845"
y="153.36906"
x="126.24404"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="153.36906"
x="126.24404"
id="tspan843"
sodipodi:role="line">Tuple4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="173.86908"
y="153.36906"
id="text849"><tspan
sodipodi:role="line"
id="tspan847"
x="173.86908"
y="153.36906"
style="stroke-width:0.26458332">Tuple5</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 97.363276,82.380028 113.77083,53.96131 32.883929,82.6875"
id="path851"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 142.49702,81.931546 113.77083,53.96131 196.16964,82.309524"
id="path853"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 143.25297,97.050594 142.875,141.27381"
id="path855"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 143.25297,97.050592 190.5,140.13988"
id="path857"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 95.249999,141.65178 94.116071,97.806546 48.002976,140.89583"
id="path859"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="75.973213"
y="37.708332"
id="text863"
class="fragment"><tspan
sodipodi:role="line"
id="tspan861"
x="75.973213"
y="37.708332"
style="fill:#d35f5f;stroke-width:0.26458332">T1:IX</tspan></text>
<text
id="text867"
y="84.577377"
x="61.610119"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"><tspan
style="fill:#d35f5f;stroke-width:0.26458332"
y="84.577377"
x="61.610119"
id="tspan865"
sodipodi:role="line">T1:IX</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="12.851191"
y="140.89583"
id="text871"
class="fragment"><tspan
sodipodi:role="line"
id="tspan869"
x="12.851191"
y="140.89583"
style="fill:#d35f5f;stroke-width:0.26458332">T1:X</tspan></text>
<text
id="text875"
y="36.952381"
x="117.92857"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"><tspan
style="fill:#6600ff;stroke-width:0.26458332"
y="36.952381"
x="117.92857"
id="tspan873"
sodipodi:role="line">T2:IX</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="100.91965"
y="84.577385"
id="text879"
class="fragment"><tspan
sodipodi:role="line"
id="tspan877"
x="100.91965"
y="84.577385"
style="fill:#6600ff;stroke-width:0.26458332">T2:IX</tspan></text>
<text
id="text883"
y="141.65179"
x="100.54167"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"><tspan
style="fill:#6600ff;stroke-width:0.26458332"
y="141.65179"
x="100.54167"
id="tspan881"
sodipodi:role="line">T2:X</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB