Merge branch 'doc/machi-high-level-design-port' (unfinished/partial merge)

This commit is contained in:
Scott Lystig Fritchie 2015-04-20 21:21:22 +09:00
commit e1a6c3678e
12 changed files with 5761 additions and 331 deletions

View file

@ -6,7 +6,27 @@ Erlang documentation, please use this link:
## Documents in this directory
* __chain-self-management-sketch.org__ is an introduction to the
### chain-self-management-sketch.org
__chain-self-management-sketch.org__ is an introduction to the
self-management algorithm proposed for Machi. This algorithm is
(hoped to be) sufficient for managing the Chain Replication state of a
Machi cluster.
### high-level-machi.pdf
__high-level-machi.pdf__ is an overview of the high level design for
Machi. Its abstract:
> Our goal is a robust & reliable, distributed, highly available large
> file store based upon write-once registers, append-only files, Chain
> Replication, and client-server style architecture. All members of
> the cluster store all of the files. Distributed load
> balancing/sharding of files is outside of the scope of this system.
> However, it is a high priority that this system be able to integrate
> easily into systems that do provide distributed load balancing,
> e.g., Riak Core. Although strong consistency is a major feature of
> Chain Replication, this document will focus mainly on eventual
> consistency features --- strong consistency design will be discussed
> in a separate document.

View file

@ -5,20 +5,10 @@
#+SEQ_TODO: TODO WORKING WAITING DONE
* 1. Abstract
Yo, this is the first draft of a document that attempts to describe a
proposed self-management algorithm for Machi's chain replication.
Welcome! Sit back and enjoy the disjointed prose.
The high level design of the Machi "chain manager" has moved to the
[[high-level-chain-manager.pdf][Machi chain manager high level design]] document.
We attempt to describe first the self-management and self-reliance
goals of the algorithm. Then we make a side trip to talk about
write-once registers and how they're used by Machi, but we don't
really fully explain exactly why write-once is so critical (why not
general purpose registers?) ... but they are indeed critical. Then we
sketch the algorithm by providing detailed annotation of a flowchart,
then let the flowchart speak for itself, because writing good prose is
prose is damn hard, but flowcharts are very specific and concise.
Finally, we try to discuss the network partition simulator that the
We try to discuss the network partition simulator that the
algorithm runs in and how the algorithm behaves in both symmetric and
asymmetric network partition scenarios. The symmetric partition cases
are all working well (surprising in a good way), and the asymmetric
@ -46,325 +36,13 @@ the simulator.
%% under the License.
#+END_SRC
* 3. Naming: possible ideas (TODO)
** Humming consensus?
See [[https://tools.ietf.org/html/rfc7282][On Consensus and Humming in the IETF]], RFC 7282.
* 3. Document restructuring
See also: [[http://www.snookles.com/slf-blog/2015/03/01/on-humming-consensus-an-allegory/][On “Humming Consensus”, an allegory]].
Much of the text previously appearing in this document has moved to the
[[high-level-chain-manager.pdf][Machi chain manager high level design]] document.
** Foggy consensus?
CORFU-like consensus between mist-shrouded islands of network
partitions
** Rough consensus
This is my favorite, but it might be too close to handwavy/vagueness
of English language, even with a precise definition and proof
sketching?
** Let the bikeshed continue!
I agree with Chris: there may already be a definition that's close
enough to "rough consensus" to continue using that existing tag than
to invent a new one. TODO: more research required
* 4. What does "self-management" mean in this context?
For the purposes of this document, chain replication self-management
is the ability for the N nodes in an N-length chain replication chain
to manage the state of the chain without requiring an external party
to participate. Chain state includes:
1. Preserve data integrity of all data stored within the chain. Data
loss is not an option.
2. Stably preserve knowledge of chain membership (i.e. all nodes in
the chain, regardless of operational status). A systems
administrators is expected to make "permanent" decisions about
chain membership.
3. Use passive and/or active techniques to track operational
state/status, e.g., up, down, restarting, full data sync, partial
data sync, etc.
4. Choose the run-time replica ordering/state of the chain, based on
current member status and past operational history. All chain
state transitions must be done safely and without data loss or
corruption.
5. As a new node is added to the chain administratively or old node is
restarted, add the node to the chain safely and perform any data
synchronization/"repair" required to bring the node's data into
full synchronization with the other nodes.
* 5. Goals
** Better than state-of-the-art: Chain Replication self-management
We hope/believe that this new self-management algorithem can improve
the current state-of-the-art by eliminating all external management
entities. Current state-of-the-art for management of chain
replication chains is discussed below, to provide historical context.
*** "Leveraging Sharding in the Design of Scalable Replication Protocols" by Abu-Libdeh, van Renesse, and Vigfusson.
Multiple chains are arranged in a ring (called a "band" in the paper).
The responsibility for managing the chain at position N is delegated
to chain N-1. As long as at least one chain is running, that is
sufficient to start/bootstrap the next chain, and so on until all
chains are running. (The paper then estimates mean-time-to-failure
(MTTF) and suggests a "band of bands" topology to handle very large
clusters while maintaining an MTTF that is as good or better than
other management techniques.)
If the chain self-management method proposed for Machi does not
succeed, this paper's technique is our best fallback recommendation.
*** An external management oracle, implemented by ZooKeeper
This is not a recommendation for Machi: we wish to avoid using ZooKeeper.
However, many other open and closed source software products use
ZooKeeper for exactly this kind of data replica management problem.
*** An external management oracle, implemented by Riak Ensemble
This is a much more palatable choice than option #2 above. We also
wish to avoid an external dependency on something as big as Riak
Ensemble. However, if it comes between choosing Riak Ensemble or
choosing ZooKeeper, the choice feels quite clear: Riak Ensemble will
win, unless there is some critical feature missing from Riak
Ensemble. If such an unforseen missing feature is discovered, it
would probably be preferable to add the feature to Riak Ensemble
rather than to use ZooKeeper (and document it and provide product
support for it and so on...).
** Support both eventually consistent & strongly consistent modes of operation
Machi's first use case is for Riak CS, as an eventually consistent
store for CS's "block" storage. Today, Riak KV is used for "block"
storage. Riak KV is an AP-style key-value store; using Machi in an
AP-style mode would match CS's current behavior from points of view of
both code/execution and human administrator exectations.
Later, we wish the option of using CP support to replace other data
store services that Riak KV provides today. (Scope and timing of such
replacement TBD.)
We believe this algorithm allows a Machi cluster to fragment into
arbitrary islands of network partition, all the way down to 100% of
members running in complete network isolation from each other.
Furthermore, it provides enough agreement to allow
formerly-partitioned members to coordinate the reintegration &
reconciliation of their data when partitions are healed.
** Preserve data integrity of Chain Replicated data
While listed last in this section, preservation of data integrity is
paramount to any chain state management technique for Machi.
** Anti-goal: minimize churn
This algorithm's focus is data safety and not availability. If
participants have differing notions of time, e.g., running on
extremely fast or extremely slow hardware, then this algorithm will
"churn" in different states where the chain's data would be
effectively unavailable.
In practice, however, any series of network partition changes that
case this algorithm to churn will cause other management techniques
(such as an external "oracle") similar problems. [Proof by handwaving
assertion.] See also: "time model" assumptions (below).
* 6. Assumptions
** Introduction to assumptions, why they differ from other consensus algorithms
Given a long history of consensus algorithms (viewstamped replication,
Paxos, Raft, et al.), why bother with a slightly different set of
assumptions and a slightly different protocol?
The answer lies in one of our explicit goals: to have an option of
running in an "eventually consistent" manner. We wish to be able to
make progress, i.e., remain available in the CAP sense, even if we are
partitioned down to a single isolated node. VR, Paxos, and Raft
alone are not sufficient to coordinate service availability at such
small scale.
** The CORFU protocol is correct
This work relies tremendously on the correctness of the CORFU
protocol, a cousin of the Paxos protocol. If the implementation of
this self-management protocol breaks an assumption or prerequisite of
CORFU, then we expect that the implementation will be flawed.
** Communication model: Asyncronous message passing
*** Unreliable network: messages may be arbitrarily dropped and/or reordered
**** Network partitions may occur at any time
**** Network partitions may be asymmetric: msg A->B is ok but B->A fails
*** Messages may be corrupted in-transit
**** Assume that message MAC/checksums are sufficient to detect corruption
**** Receiver informs sender of message corruption
**** Sender may resend, if/when desired
*** System particpants may be buggy but not actively malicious/Byzantine
** Time model: per-node clocks, loosely synchronized (e.g. NTP)
The protocol & algorithm presented here do not specify or require any
timestamps, physical or logical. Any mention of time inside of data
structures are for human/historic/diagnostic purposes only.
Having said that, some notion of physical time is suggested for
purposes of efficiency. It's recommended that there be some "sleep
time" between iterations of the algorithm: there is no need to "busy
wait" by executing the algorithm as quickly as possible. See below,
"sleep intervals between executions".
** Failure detector model: weak, fallible, boolean
We assume that the failure detector that the algorithm uses is weak,
it's fallible, and it informs the algorithm in boolean status
updates/toggles as a node becomes available or not.
If the failure detector is fallible and tells us a mistaken status
change, then the algorithm will "churn" the operational state of the
chain, e.g. by removing the failed node from the chain or adding a
(re)started node (that may not be alive) to the end of the chain.
Such extra churn is regrettable and will cause periods of delay as the
"rough consensus" (decribed below) decision is made. However, the
churn cannot (we assert/believe) cause data loss.
** The "wedge state", as described by the Machi RFC & CORFU
A chain member enters "wedge state" when it receives information that
a newer projection (i.e., run-time chain state reconfiguration) is
available. The new projection may be created by a system
administrator or calculated by the self-management algorithm.
Notification may arrive via the projection store API or via the file
I/O API.
When in wedge state, the server/FLU will refuse all file write I/O API
requests until the self-management algorithm has determined that
"rough consensus" has been decided (see next bullet item). The server
may also refuse file read I/O API requests, depending on its CP/AP
operation mode.
See the Machi RFC for more detail of the wedge state and also the
CORFU papers.
** "Rough consensus": consensus built upon data that is *visible now*
CS literature uses the word "consensus" in the context of the problem
description at
[[http://en.wikipedia.org/wiki/Consensus_(computer_science)#Problem_description]].
This traditional definition differs from what is described in this
document.
The phrase "rough consensus" will be used to describe
consensus derived only from data that is visible/known at the current
time. This implies that a network partition may be in effect and that
not all chain members are reachable. The algorithm will calculate
"rough consensus" despite not having input from all/majority/minority
of chain members. "Rough consensus" may proceed to make a
decision based on data from only a single participant, i.e., the local
node alone.
When operating in AP mode, i.e., in eventual consistency mode, "rough
consensus" could mean that an chain of length N could split into N
independent chains of length 1. When a network partition heals, the
rough consensus is sufficient to manage the chain so that each
replica's data can be repaired/merged/reconciled safely.
(Other features of the Machi system are designed to assist such
repair safely.)
When operating in CP mode, i.e., in strong consistency mode, "rough
consensus" would require additional supplements. For example, any
chain that didn't have a minimum length of the quorum majority size of
all members would be invalid and therefore would not move itself out
of wedged state. In very general terms, this requirement for a quorum
majority of surviving participants is also a requirement for Paxos,
Raft, and ZAB.
(Aside: The Machi RFC also proposes using "witness" chain members to
make service more available, e.g. quorum majority of "real" plus
"witness" nodes *and* at least one member must be a "real" node. See
the Machi RFC for more details.)
** Heavy reliance on a key-value store that maps write-once registers
The projection store is implemented using "write-once registers"
inside a key-value store: for every key in the store, the value must
be either of:
- The special 'unwritten' value
- An application-specific binary blob that is immutable thereafter
* 7. The projection store, built with write-once registers
- NOTE to the reader: The notion of "public" vs. "private" projection
stores does not appear in the Machi RFC.
Each participating chain node has its own "projection store", which is
a specialized key-value store. As a whole, a node's projection store
is implemented using two different key-value stores:
- A publicly-writable KV store of write-once registers
- A privately-writable KV store of write-once registers
Both stores may be read by any cluster member.
The store's key is a positive integer; the integer represents the
epoch number of the projection. The store's value is an opaque
binary blob whose meaning is meaningful only to the store's clients.
See the Machi RFC for more detail on projections and epoch numbers.
** The publicly-writable half of the projection store
The publicly-writable projection store is used to share information
during the first half of the self-management algorithm. Any chain
member may write a projection to this store.
** The privately-writable half of the projection store
The privately-writable projection store is used to store the "rough
consensus" result that has been calculated by the local node. Only
the local server/FLU may write values into this store.
The private projection store serves multiple purposes, including:
- remove/clear the local server from "wedge state"
- act as the store of record for chain state transitions
- communicate to remote nodes the past states and current operational
state of the local node
* 8. Modification of CORFU-style epoch numbering and "wedge state" triggers
According to the CORFU research papers, if a server node N or client
node C believes that epoch E is the latest epoch, then any information
that N or C receives from any source that an epoch E+delta (where
delta > 0) exists will push N into the "wedge" state and C into a mode
of searching for the projection definition for the newest epoch.
In the algorithm sketch below, it should become clear that it's
possible to have a race where two nodes may attempt to make proposals
for a single epoch number. In the simplest case, assume a chain of
nodes A & B. Assume that a symmetric network partition between A & B
happens, and assume we're operating in AP/eventually consistent mode.
On A's network partitioned island, A can choose a UPI list of `[A]'.
Similarly B can choose a UPI list of `[B]'. Both might choose the
epoch for their proposal to be #42. Because each are separated by
network partition, neither can realize the conflict. However, when
the network partition heals, it can become obvious that there are
conflicting values for epoch #42 ... but if we use CORFU's protocol
design, which identifies the epoch identifier as an integer only, then
the integer 42 alone is not sufficient to discern the differences
between the two projections.
The proposal modifies all use of CORFU's projection identifier
to use the identifier below instead. (A later section of this
document presents a detailed example.)
#+BEGIN_SRC
{epoch #, hash of the entire projection (minus hash field itself)}
#+END_SRC
* 9. Diagram of the self-management algorithm
* 4. Diagram of the self-management algorithm
** Introduction
Refer to the diagram
[[https://github.com/basho/machi/blob/master/doc/chain-self-management-sketch.Diagram1.pdf][chain-self-management-sketch.Diagram1.pdf]],
@ -579,7 +257,7 @@ use of quorum majority for UPI members is out of scope of this
document. Also out of scope is the use of "witness servers" to
augment the quorum majority UPI scheme.)
* 10. The Network Partition Simulator
* 5. The Network Partition Simulator
** Overview
The function machi_chain_manager1_test:convergence_demo_test()
executes the following in a simulated network environment within a

BIN
doc/high-level-machi.pdf Normal file

Binary file not shown.

4
doc/src.high-level/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
*.aux
*.dvi
*.log
*.pdf

View file

@ -0,0 +1,8 @@
all:
latex high-level-machi.tex
dvipdfm high-level-machi.dvi
latex high-level-chain-mgr.tex
dvipdfm high-level-chain-mgr.dvi
clean:
rm -f *.aux *.dvi *.log

View file

@ -0,0 +1,268 @@
%!PS-Adobe-3.0 EPSF-2.0
%%BoundingBox: 0 0 416.500000 280.000000
%%Creator: mscgen 0.18
%%EndComments
0.700000 0.700000 scale
0 0 moveto
0 400 lineto
595 400 lineto
595 0 lineto
closepath
clip
%PageTrailer
%Page: 1 1
/Helvetica findfont
10 scalefont
setfont
/Helvetica findfont
12 scalefont
setfont
0 400 translate
/mtrx matrix def
/ellipse
{ /endangle exch def
/startangle exch def
/ydia exch def
/xdia exch def
/y exch def
/x exch def
/savematrix mtrx currentmatrix def
x y translate
xdia 2 div ydia 2 div scale
1 -1 scale
0 0 1 startangle endangle arc
savematrix setmatrix
} def
(client) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 42 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
42 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(Projection) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 127 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
127 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(ProjStore_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 212 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
212 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(Sequencer_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 297 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
297 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 382 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
382 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_B) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 467 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
467 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_C) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 552 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
552 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
newpath 42 -22 moveto 42 -49 lineto stroke
newpath 127 -22 moveto 127 -49 lineto stroke
newpath 212 -22 moveto 212 -49 lineto stroke
newpath 297 -22 moveto 297 -49 lineto stroke
newpath 382 -22 moveto 382 -49 lineto stroke
newpath 467 -22 moveto 467 -49 lineto stroke
newpath 552 -22 moveto 552 -49 lineto stroke
newpath 42 -35 moveto 127 -35 lineto stroke
newpath 127 -35 moveto 117 -41 lineto stroke
(get current) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 57 -33 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
57 -33 moveto show
newpath 42 -49 moveto 42 -76 lineto stroke
newpath 127 -49 moveto 127 -76 lineto stroke
newpath 212 -49 moveto 212 -76 lineto stroke
newpath 297 -49 moveto 297 -76 lineto stroke
newpath 382 -49 moveto 382 -76 lineto stroke
newpath 467 -49 moveto 467 -76 lineto stroke
newpath 552 -49 moveto 552 -76 lineto stroke
newpath 127 -62 moveto 42 -62 lineto stroke
newpath 42 -62 moveto 52 -68 lineto stroke
(ok, #12...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 61 -60 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
61 -60 moveto show
newpath 42 -76 moveto 42 -103 lineto stroke
newpath 127 -76 moveto 127 -103 lineto stroke
newpath 212 -76 moveto 212 -103 lineto stroke
newpath 297 -76 moveto 297 -103 lineto stroke
newpath 382 -76 moveto 382 -103 lineto stroke
newpath 467 -76 moveto 467 -103 lineto stroke
newpath 552 -76 moveto 552 -103 lineto stroke
newpath 42 -89 moveto 297 -89 lineto stroke
newpath 297 -89 moveto 287 -95 lineto stroke
(Req. 123 bytes, prefix="foo", epoch=12) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 66 -87 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
66 -87 moveto show
newpath 42 -103 moveto 42 -130 lineto stroke
newpath 127 -103 moveto 127 -130 lineto stroke
newpath 212 -103 moveto 212 -130 lineto stroke
newpath 297 -103 moveto 297 -130 lineto stroke
newpath 382 -103 moveto 382 -130 lineto stroke
newpath 467 -103 moveto 467 -130 lineto stroke
newpath 552 -103 moveto 552 -130 lineto stroke
newpath 297 -116 moveto 42 -116 lineto stroke
newpath 42 -116 moveto 52 -122 lineto stroke
1.000000 0.000000 0.000000 setrgbcolor
(bad_epoch, 13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 131 -114 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
1.000000 0.000000 0.000000 setrgbcolor
131 -114 moveto show
0.000000 0.000000 0.000000 setrgbcolor
newpath 42 -130 moveto 42 -157 lineto stroke
newpath 127 -130 moveto 127 -157 lineto stroke
newpath 212 -130 moveto 212 -157 lineto stroke
newpath 297 -130 moveto 297 -157 lineto stroke
newpath 382 -130 moveto 382 -157 lineto stroke
newpath 467 -130 moveto 467 -157 lineto stroke
newpath 552 -130 moveto 552 -157 lineto stroke
newpath 42 -143 moveto 212 -143 lineto stroke
newpath 212 -143 moveto 202 -149 lineto stroke
(get epoch #13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 89 -141 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
89 -141 moveto show
newpath 42 -157 moveto 42 -184 lineto stroke
newpath 127 -157 moveto 127 -184 lineto stroke
newpath 212 -157 moveto 212 -184 lineto stroke
newpath 297 -157 moveto 297 -184 lineto stroke
newpath 382 -157 moveto 382 -184 lineto stroke
newpath 467 -157 moveto 467 -184 lineto stroke
newpath 552 -157 moveto 552 -184 lineto stroke
newpath 212 -170 moveto 42 -170 lineto stroke
newpath 42 -170 moveto 52 -176 lineto stroke
(ok, #13...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 103 -168 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
103 -168 moveto show
newpath 42 -184 moveto 42 -211 lineto stroke
newpath 127 -184 moveto 127 -211 lineto stroke
newpath 212 -184 moveto 212 -211 lineto stroke
newpath 297 -184 moveto 297 -211 lineto stroke
newpath 382 -184 moveto 382 -211 lineto stroke
newpath 467 -184 moveto 467 -211 lineto stroke
newpath 552 -184 moveto 552 -211 lineto stroke
newpath 42 -197 moveto 297 -197 lineto stroke
newpath 297 -197 moveto 287 -203 lineto stroke
(Req. 123 bytes, prefix="foo", epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 66 -195 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
66 -195 moveto show
newpath 42 -211 moveto 42 -238 lineto stroke
newpath 127 -211 moveto 127 -238 lineto stroke
newpath 212 -211 moveto 212 -238 lineto stroke
newpath 297 -211 moveto 297 -238 lineto stroke
newpath 382 -211 moveto 382 -238 lineto stroke
newpath 467 -211 moveto 467 -238 lineto stroke
newpath 552 -211 moveto 552 -238 lineto stroke
newpath 297 -224 moveto 42 -224 lineto stroke
newpath 42 -224 moveto 52 -230 lineto stroke
(ok, "foo.seq_a.009" offset=447) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 89 -222 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
89 -222 moveto show
newpath 42 -238 moveto 42 -265 lineto stroke
newpath 127 -238 moveto 127 -265 lineto stroke
newpath 212 -238 moveto 212 -265 lineto stroke
newpath 297 -238 moveto 297 -265 lineto stroke
newpath 382 -238 moveto 382 -265 lineto stroke
newpath 467 -238 moveto 467 -265 lineto stroke
newpath 552 -238 moveto 552 -265 lineto stroke
newpath 42 -251 moveto 382 -251 lineto stroke
newpath 382 -251 moveto 372 -257 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 51 -249 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
51 -249 moveto show
newpath 42 -265 moveto 42 -292 lineto stroke
newpath 127 -265 moveto 127 -292 lineto stroke
newpath 212 -265 moveto 212 -292 lineto stroke
newpath 297 -265 moveto 297 -292 lineto stroke
newpath 382 -265 moveto 382 -292 lineto stroke
newpath 467 -265 moveto 467 -292 lineto stroke
newpath 552 -265 moveto 552 -292 lineto stroke
newpath 382 -278 moveto 42 -278 lineto stroke
newpath 42 -278 moveto 52 -284 lineto stroke
(ok) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 206 -276 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
206 -276 moveto show
newpath 42 -292 moveto 42 -319 lineto stroke
newpath 127 -292 moveto 127 -319 lineto stroke
newpath 212 -292 moveto 212 -319 lineto stroke
newpath 297 -292 moveto 297 -319 lineto stroke
newpath 382 -292 moveto 382 -319 lineto stroke
newpath 467 -292 moveto 467 -319 lineto stroke
newpath 552 -292 moveto 552 -319 lineto stroke
newpath 42 -305 moveto 467 -305 lineto stroke
newpath 467 -305 moveto 457 -311 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 94 -303 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
94 -303 moveto show
newpath 42 -319 moveto 42 -346 lineto stroke
newpath 127 -319 moveto 127 -346 lineto stroke
newpath 212 -319 moveto 212 -346 lineto stroke
newpath 297 -319 moveto 297 -346 lineto stroke
newpath 382 -319 moveto 382 -346 lineto stroke
newpath 467 -319 moveto 467 -346 lineto stroke
newpath 552 -319 moveto 552 -346 lineto stroke
newpath 467 -332 moveto 42 -332 lineto stroke
newpath 42 -332 moveto 52 -338 lineto stroke
(ok) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 249 -330 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
249 -330 moveto show
newpath 42 -346 moveto 42 -373 lineto stroke
newpath 127 -346 moveto 127 -373 lineto stroke
newpath 212 -346 moveto 212 -373 lineto stroke
newpath 297 -346 moveto 297 -373 lineto stroke
newpath 382 -346 moveto 382 -373 lineto stroke
newpath 467 -346 moveto 467 -373 lineto stroke
newpath 552 -346 moveto 552 -373 lineto stroke
newpath 42 -359 moveto 552 -359 lineto stroke
newpath 552 -359 moveto 542 -365 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 136 -357 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
136 -357 moveto show
newpath 42 -373 moveto 42 -400 lineto stroke
newpath 127 -373 moveto 127 -400 lineto stroke
newpath 212 -373 moveto 212 -400 lineto stroke
newpath 297 -373 moveto 297 -400 lineto stroke
newpath 382 -373 moveto 382 -400 lineto stroke
newpath 467 -373 moveto 467 -400 lineto stroke
newpath 552 -373 moveto 552 -400 lineto stroke
newpath 552 -386 moveto 42 -386 lineto stroke
newpath 42 -386 moveto 52 -392 lineto stroke
(ok) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 291 -384 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
291 -384 moveto show

View file

@ -0,0 +1,345 @@
%!PS-Adobe-3.0 EPSF-2.0
%%BoundingBox: 0 0 416.500000 355.600006
%%Creator: mscgen 0.18
%%EndComments
0.700000 0.700000 scale
0 0 moveto
0 508 lineto
595 508 lineto
595 0 lineto
closepath
clip
%PageTrailer
%Page: 1 1
/Helvetica findfont
10 scalefont
setfont
/Helvetica findfont
12 scalefont
setfont
0 508 translate
/mtrx matrix def
/ellipse
{ /endangle exch def
/startangle exch def
/ydia exch def
/xdia exch def
/y exch def
/x exch def
/savematrix mtrx currentmatrix def
x y translate
xdia 2 div ydia 2 div scale
1 -1 scale
0 0 1 startangle endangle arc
savematrix setmatrix
} def
(client) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 42 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
42 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(Projection) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 127 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
127 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(ProjStore_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 212 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
212 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(Sequencer_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 297 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
297 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_A) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 382 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
382 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_B) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 467 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
467 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_C) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 552 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
552 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
newpath 42 -22 moveto 42 -49 lineto stroke
newpath 127 -22 moveto 127 -49 lineto stroke
newpath 212 -22 moveto 212 -49 lineto stroke
newpath 297 -22 moveto 297 -49 lineto stroke
newpath 382 -22 moveto 382 -49 lineto stroke
newpath 467 -22 moveto 467 -49 lineto stroke
newpath 552 -22 moveto 552 -49 lineto stroke
newpath 42 -35 moveto 127 -35 lineto stroke
newpath 127 -35 moveto 117 -41 lineto stroke
(get current) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 57 -33 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
57 -33 moveto show
newpath 42 -49 moveto 42 -76 lineto stroke
newpath 127 -49 moveto 127 -76 lineto stroke
newpath 212 -49 moveto 212 -76 lineto stroke
newpath 297 -49 moveto 297 -76 lineto stroke
newpath 382 -49 moveto 382 -76 lineto stroke
newpath 467 -49 moveto 467 -76 lineto stroke
newpath 552 -49 moveto 552 -76 lineto stroke
newpath 127 -62 moveto 42 -62 lineto stroke
newpath 42 -62 moveto 52 -68 lineto stroke
(ok, #12...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 61 -60 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
61 -60 moveto show
newpath 42 -76 moveto 42 -103 lineto stroke
newpath 127 -76 moveto 127 -103 lineto stroke
newpath 212 -76 moveto 212 -103 lineto stroke
newpath 297 -76 moveto 297 -103 lineto stroke
newpath 382 -76 moveto 382 -103 lineto stroke
newpath 467 -76 moveto 467 -103 lineto stroke
newpath 552 -76 moveto 552 -103 lineto stroke
newpath 42 -89 moveto 382 -89 lineto stroke
newpath 382 -89 moveto 372 -95 lineto stroke
(append prefix="foo" <<123 bytes...>> epoch=12) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 85 -87 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
85 -87 moveto show
newpath 42 -103 moveto 42 -130 lineto stroke
newpath 127 -103 moveto 127 -130 lineto stroke
newpath 212 -103 moveto 212 -130 lineto stroke
newpath 297 -103 moveto 297 -130 lineto stroke
newpath 382 -103 moveto 382 -130 lineto stroke
newpath 467 -103 moveto 467 -130 lineto stroke
newpath 552 -103 moveto 552 -130 lineto stroke
newpath 382 -116 moveto 42 -116 lineto stroke
newpath 42 -116 moveto 52 -122 lineto stroke
1.000000 0.000000 0.000000 setrgbcolor
(bad_epoch, 13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 173 -114 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
1.000000 0.000000 0.000000 setrgbcolor
173 -114 moveto show
0.000000 0.000000 0.000000 setrgbcolor
newpath 42 -130 moveto 42 -157 lineto stroke
newpath 127 -130 moveto 127 -157 lineto stroke
newpath 212 -130 moveto 212 -157 lineto stroke
newpath 297 -130 moveto 297 -157 lineto stroke
newpath 382 -130 moveto 382 -157 lineto stroke
newpath 467 -130 moveto 467 -157 lineto stroke
newpath 552 -130 moveto 552 -157 lineto stroke
newpath 42 -143 moveto 212 -143 lineto stroke
newpath 212 -143 moveto 202 -149 lineto stroke
(get epoch #13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 89 -141 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
89 -141 moveto show
newpath 42 -157 moveto 42 -184 lineto stroke
newpath 127 -157 moveto 127 -184 lineto stroke
newpath 212 -157 moveto 212 -184 lineto stroke
newpath 297 -157 moveto 297 -184 lineto stroke
newpath 382 -157 moveto 382 -184 lineto stroke
newpath 467 -157 moveto 467 -184 lineto stroke
newpath 552 -157 moveto 552 -184 lineto stroke
newpath 212 -170 moveto 42 -170 lineto stroke
newpath 42 -170 moveto 52 -176 lineto stroke
(ok, #13...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 103 -168 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
103 -168 moveto show
newpath 42 -184 moveto 42 -211 lineto stroke
newpath 127 -184 moveto 127 -211 lineto stroke
newpath 212 -184 moveto 212 -211 lineto stroke
newpath 297 -184 moveto 297 -211 lineto stroke
newpath 382 -184 moveto 382 -211 lineto stroke
newpath 467 -184 moveto 467 -211 lineto stroke
newpath 552 -184 moveto 552 -211 lineto stroke
newpath 42 -197 moveto 382 -197 lineto stroke
newpath 382 -197 moveto 372 -203 lineto stroke
(append prefix="foo" <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 85 -195 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
85 -195 moveto show
newpath 42 -211 moveto 42 -238 lineto stroke
newpath 127 -211 moveto 127 -238 lineto stroke
newpath 212 -211 moveto 212 -238 lineto stroke
newpath 297 -211 moveto 297 -238 lineto stroke
newpath 382 -211 moveto 382 -238 lineto stroke
newpath 467 -211 moveto 467 -238 lineto stroke
newpath 552 -211 moveto 552 -238 lineto stroke
1.000000 1.000000 1.000000 setrgbcolor
newpath 263 -211 moveto 417 -211 lineto 417 -236 lineto 263 -236 lineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
newpath 269 -211 moveto 411 -211 lineto stroke
newpath 269 -236 moveto 411 -236 lineto stroke
newpath 269 -211 moveto 263 -223 lineto stroke
newpath 263 -223 moveto 269 -236 lineto stroke
newpath 411 -211 moveto 417 -223 lineto stroke
newpath 417 -223 moveto 411 -236 lineto stroke
(Co-located on same box) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 275 -227 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
275 -227 moveto show
newpath 42 -238 moveto 42 -265 lineto stroke
newpath 127 -238 moveto 127 -265 lineto stroke
newpath 212 -238 moveto 212 -265 lineto stroke
newpath 297 -238 moveto 297 -265 lineto stroke
newpath 382 -238 moveto 382 -265 lineto stroke
newpath 467 -238 moveto 467 -265 lineto stroke
newpath 552 -238 moveto 552 -265 lineto stroke
newpath 382 -251 moveto 297 -251 lineto stroke
newpath 297 -251 moveto 307 -257 lineto stroke
(Req. 123 bytes, prefix="foo", epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 236 -249 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
236 -249 moveto show
newpath 42 -265 moveto 42 -292 lineto stroke
newpath 127 -265 moveto 127 -292 lineto stroke
newpath 212 -265 moveto 212 -292 lineto stroke
newpath 297 -265 moveto 297 -292 lineto stroke
newpath 382 -265 moveto 382 -292 lineto stroke
newpath 467 -265 moveto 467 -292 lineto stroke
newpath 552 -265 moveto 552 -292 lineto stroke
newpath 297 -278 moveto 382 -278 lineto stroke
newpath 382 -278 moveto 372 -284 lineto stroke
(ok, "foo.seq_a.009" offset=447) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 259 -276 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
259 -276 moveto show
newpath 42 -292 moveto 42 -319 lineto stroke
newpath 127 -292 moveto 127 -319 lineto stroke
newpath 212 -292 moveto 212 -319 lineto stroke
newpath 297 -292 moveto 297 -319 lineto stroke
newpath 382 -292 moveto 382 -319 lineto stroke
newpath 467 -292 moveto 467 -319 lineto stroke
newpath 552 -292 moveto 552 -319 lineto stroke
newpath 382 -305 85 13 270 90 ellipse stroke
newpath 382 -311 moveto 392 -317 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 58 -303 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
58 -303 moveto show
newpath 42 -319 moveto 42 -346 lineto stroke
newpath 127 -319 moveto 127 -346 lineto stroke
newpath 212 -319 moveto 212 -346 lineto stroke
newpath 297 -319 moveto 297 -346 lineto stroke
newpath 382 -319 moveto 382 -346 lineto stroke
newpath 467 -319 moveto 467 -346 lineto stroke
newpath 552 -319 moveto 552 -346 lineto stroke
newpath 382 -332 moveto 467 -332 lineto stroke
newpath 467 -332 moveto 457 -338 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 264 -330 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
264 -330 moveto show
newpath 42 -346 moveto 42 -373 lineto stroke
newpath 127 -346 moveto 127 -373 lineto stroke
newpath 212 -346 moveto 212 -373 lineto stroke
newpath 297 -346 moveto 297 -373 lineto stroke
newpath 382 -346 moveto 382 -373 lineto stroke
newpath 467 -346 moveto 467 -373 lineto stroke
newpath 552 -346 moveto 552 -373 lineto stroke
newpath 467 -359 moveto 552 -359 lineto stroke
newpath 552 -359 moveto 542 -365 lineto stroke
(write "foo.seq_a.009" offset=447 <<123 bytes...>> epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 273 -357 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
273 -357 moveto show
newpath 42 -373 moveto 42 -400 lineto stroke
newpath 127 -373 moveto 127 -400 lineto stroke
newpath 212 -373 moveto 212 -400 lineto stroke
newpath 297 -373 moveto 297 -400 lineto stroke
newpath 382 -373 moveto 382 -400 lineto stroke
newpath 467 -373 moveto 467 -400 lineto stroke
newpath 552 -373 moveto 552 -400 lineto stroke
newpath 552 -386 moveto 42 -386 lineto stroke
newpath 42 -386 moveto 52 -392 lineto stroke
(ok, "foo.seq_a.009" offset=447) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 216 -384 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
216 -384 moveto show
newpath 42 -400 moveto 42 -427 lineto stroke
newpath 127 -400 moveto 127 -427 lineto stroke
newpath 212 -400 moveto 212 -427 lineto stroke
newpath 297 -400 moveto 297 -427 lineto stroke
newpath 382 -400 moveto 382 -427 lineto stroke
newpath 467 -400 moveto 467 -427 lineto stroke
newpath 552 -400 moveto 552 -427 lineto stroke
(The above is "fast path" for FLU->FLU forwarding.) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 164 -416 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
164 -416 moveto show
[2] 0 setdash
newpath 21 -413 moveto 162 -413 lineto stroke
[] 0 setdash
[2] 0 setdash
newpath 432 -413 moveto 574 -413 lineto stroke
[] 0 setdash
newpath 42 -427 moveto 42 -454 lineto stroke
newpath 127 -427 moveto 127 -454 lineto stroke
newpath 212 -427 moveto 212 -454 lineto stroke
newpath 297 -427 moveto 297 -454 lineto stroke
newpath 382 -427 moveto 382 -454 lineto stroke
newpath 467 -427 moveto 467 -454 lineto stroke
newpath 552 -427 moveto 552 -454 lineto stroke
(If, in an alternate scenario, FLU_C has an error...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 167 -443 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
167 -443 moveto show
[2] 0 setdash
newpath 21 -440 moveto 165 -440 lineto stroke
[] 0 setdash
[2] 0 setdash
newpath 429 -440 moveto 574 -440 lineto stroke
[] 0 setdash
newpath 42 -454 moveto 42 -481 lineto stroke
newpath 127 -454 moveto 127 -481 lineto stroke
newpath 212 -454 moveto 212 -481 lineto stroke
newpath 297 -454 moveto 297 -481 lineto stroke
newpath 382 -454 moveto 382 -481 lineto stroke
newpath 467 -454 moveto 467 -481 lineto stroke
newpath 552 -454 moveto 552 -481 lineto stroke
newpath 552 -467 moveto 42 -467 lineto stroke
newpath 42 -467 moveto 52 -473 lineto stroke
1.000000 0.000000 0.000000 setrgbcolor
(bad_epoch, 15) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 258 -465 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
1.000000 0.000000 0.000000 setrgbcolor
258 -465 moveto show
0.000000 0.000000 0.000000 setrgbcolor
newpath 42 -481 moveto 42 -508 lineto stroke
newpath 127 -481 moveto 127 -508 lineto stroke
newpath 212 -481 moveto 212 -508 lineto stroke
newpath 297 -481 moveto 297 -508 lineto stroke
newpath 382 -481 moveto 382 -508 lineto stroke
newpath 467 -481 moveto 467 -508 lineto stroke
newpath 552 -481 moveto 552 -508 lineto stroke
(... then repair becomes the client's responsibility \("slow path"\).) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 133 -497 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
133 -497 moveto show
[2] 0 setdash
newpath 21 -494 moveto 131 -494 lineto stroke
[] 0 setdash
[2] 0 setdash
newpath 464 -494 moveto 574 -494 lineto stroke
[] 0 setdash

View file

@ -0,0 +1,557 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Title: figure6.fig
%%Creator: fig2dev Version 3.2 Patchlevel 5d
%%CreationDate: Mon Oct 20 21:56:33 2014
%%For: fritchie@sbb3.local (Scott Lystig Fritchie)
%%BoundingBox: 0 0 633 332
%Magnification: 1.0000
%%EndComments
%%BeginProlog
/$F2psDict 200 dict def
$F2psDict begin
$F2psDict /mtrx matrix put
/col-1 {0 setgray} bind def
/col0 {0.000 0.000 0.000 srgb} bind def
/col1 {0.000 0.000 1.000 srgb} bind def
/col2 {0.000 1.000 0.000 srgb} bind def
/col3 {0.000 1.000 1.000 srgb} bind def
/col4 {1.000 0.000 0.000 srgb} bind def
/col5 {1.000 0.000 1.000 srgb} bind def
/col6 {1.000 1.000 0.000 srgb} bind def
/col7 {1.000 1.000 1.000 srgb} bind def
/col8 {0.000 0.000 0.560 srgb} bind def
/col9 {0.000 0.000 0.690 srgb} bind def
/col10 {0.000 0.000 0.820 srgb} bind def
/col11 {0.530 0.810 1.000 srgb} bind def
/col12 {0.000 0.560 0.000 srgb} bind def
/col13 {0.000 0.690 0.000 srgb} bind def
/col14 {0.000 0.820 0.000 srgb} bind def
/col15 {0.000 0.560 0.560 srgb} bind def
/col16 {0.000 0.690 0.690 srgb} bind def
/col17 {0.000 0.820 0.820 srgb} bind def
/col18 {0.560 0.000 0.000 srgb} bind def
/col19 {0.690 0.000 0.000 srgb} bind def
/col20 {0.820 0.000 0.000 srgb} bind def
/col21 {0.560 0.000 0.560 srgb} bind def
/col22 {0.690 0.000 0.690 srgb} bind def
/col23 {0.820 0.000 0.820 srgb} bind def
/col24 {0.500 0.190 0.000 srgb} bind def
/col25 {0.630 0.250 0.000 srgb} bind def
/col26 {0.750 0.380 0.000 srgb} bind def
/col27 {1.000 0.500 0.500 srgb} bind def
/col28 {1.000 0.630 0.630 srgb} bind def
/col29 {1.000 0.750 0.750 srgb} bind def
/col30 {1.000 0.880 0.880 srgb} bind def
/col31 {1.000 0.840 0.000 srgb} bind def
end
/cp {closepath} bind def
/ef {eofill} bind def
/gr {grestore} bind def
/gs {gsave} bind def
/sa {save} bind def
/rs {restore} bind def
/l {lineto} bind def
/m {moveto} bind def
/rm {rmoveto} bind def
/n {newpath} bind def
/s {stroke} bind def
/sh {show} bind def
/slc {setlinecap} bind def
/slj {setlinejoin} bind def
/slw {setlinewidth} bind def
/srgb {setrgbcolor} bind def
/rot {rotate} bind def
/sc {scale} bind def
/sd {setdash} bind def
/ff {findfont} bind def
/sf {setfont} bind def
/scf {scalefont} bind def
/sw {stringwidth} bind def
/tr {translate} bind def
/tnt {dup dup currentrgbcolor
4 -2 roll dup 1 exch sub 3 -1 roll mul add
4 -2 roll dup 1 exch sub 3 -1 roll mul add
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
bind def
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
4 -2 roll mul srgb} bind def
/reencdict 12 dict def /ReEncode { reencdict begin
/newcodesandnames exch def /newfontname exch def /basefontname exch def
/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
basefontdict { exch dup /FID ne { dup /Encoding eq
{ exch dup length array copy newfont 3 1 roll put }
{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
newfont /FontName newfontname put newcodesandnames aload pop
128 1 255 { newfont /Encoding get exch /.notdef put } for
newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
newfontname newfont definefont pop end } def
/isovec [
8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
8#220 /dotlessi 8#230 /oe 8#231 /OE
8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
/Times-Bold /Times-Bold-iso isovec ReEncode
/Times-Roman /Times-Roman-iso isovec ReEncode
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
/$F2psEnd {$F2psEnteredState restore end} def
/pageheader {
save
newpath 0 332 moveto 0 0 lineto 633 0 lineto 633 332 lineto closepath clip newpath
-331.7 473.8 translate
1 -1 scale
$F2psBegin
10 setmiterlimit
0 slj 0 slc
0.06000 0.06000 sc
} bind def
/pagefooter {
$F2psEnd
restore
} bind def
%%EndProlog
pageheader
%
% Fig objects follow
%
%
% here starts figure with depth 50
/Times-Roman-iso ff 166.67 scf sf
5925 7275 m
gs 1 -1 sc (Step 6: Client now knows that projection 12 is invalid. Fetch projection 13, then retry at step #8.) col16 sh gr
/Times-Bold-iso ff 200.00 scf sf
8550 3225 m
gs 1 -1 sc (Get epoch 13) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 6900 m
gs 1 -1 sc (Active=[a,b,c]) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 6675 m
gs 1 -1 sc (Members=[a,b,c]) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 6450 m
gs 1 -1 sc (Epoch=13) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 5580 m
gs 1 -1 sc (Epoch=12) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 5835 m
gs 1 -1 sc (Members=[a,b,c]) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 6090 m
gs 1 -1 sc (Active=[a,b]) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5925 5175 m
gs 1 -1 sc (Projection \(data structure\)) col0 sh gr
% Polyline
0 slj
0 slc
15.000 slw
n 8400 4950 m 5625 4950 l 5625 7050 l 8400 7050 l
cp gs col0 s gr
/Times-Bold-iso ff 200.00 scf sf
12825 6405 m
gs 1 -1 sc (- write once) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 6660 m
gs 1 -1 sc (- key=integer) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 6915 m
gs 1 -1 sc (- value=projection data structure) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 7170 m
gs 1 -1 sc (k=11, v=...) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 7425 m
gs 1 -1 sc (k=12, v=...) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 7680 m
gs 1 -1 sc (k=13, v=...) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 6150 m
gs 1 -1 sc (FLU projection store \(proc\)) col0 sh gr
% Polyline
n 12750 5925 m 15900 5925 l 15900 7725 l 12750 7725 l
cp gs col0 s gr
% Polyline
gs clippath
14788 5055 m 14940 5055 l 14940 4995 l 14788 4995 l 14788 4995 l 14908 5025 l 14788 5055 l cp
14612 4995 m 14460 4995 l 14460 5055 l 14612 5055 l 14612 5055 l 14492 5025 l 14612 4995 l cp
eoclip
n 14475 5025 m
14925 5025 l gs col0 s gr gr
% arrowhead
7.500 slw
n 14612 4995 m 14492 5025 l 14612 5055 l col0 s
% arrowhead
n 14788 5055 m 14908 5025 l 14788 4995 l col0 s
% Polyline
15.000 slw
gs clippath
15688 5055 m 15840 5055 l 15840 4995 l 15688 4995 l 15688 4995 l 15808 5025 l 15688 5055 l cp
15137 4995 m 14985 4995 l 14985 5055 l 15137 5055 l 15137 5055 l 15017 5025 l 15137 4995 l cp
eoclip
n 15000 5025 m
15825 5025 l gs col0 s gr gr
% arrowhead
7.500 slw
n 15137 4995 m 15017 5025 l 15137 5055 l col0 s
% arrowhead
n 15688 5055 m 15808 5025 l 15688 4995 l col0 s
% Polyline
15.000 slw
gs clippath
14638 5355 m 14790 5355 l 14790 5295 l 14638 5295 l 14638 5295 l 14758 5325 l 14638 5355 l cp
14612 5295 m 14460 5295 l 14460 5355 l 14612 5355 l 14612 5355 l 14492 5325 l 14612 5295 l cp
eoclip
n 14475 5325 m 14550 5325 l 14625 5325 l 14700 5325 l 14775 5325 l 14700 5325 l
14775 5325 l gs col0 s gr gr
% arrowhead
7.500 slw
n 14612 5295 m 14492 5325 l 14612 5355 l col0 s
% arrowhead
n 14638 5355 m 14758 5325 l 14638 5295 l col0 s
% Polyline
15.000 slw
gs clippath
15163 5355 m 15315 5355 l 15315 5295 l 15163 5295 l 15163 5295 l 15283 5325 l 15163 5355 l cp
15137 5295 m 14985 5295 l 14985 5355 l 15137 5355 l 15137 5355 l 15017 5325 l 15137 5295 l cp
eoclip
n 15000 5325 m 15075 5325 l 15150 5325 l 15225 5325 l
15300 5325 l gs col0 s gr gr
% arrowhead
7.500 slw
n 15137 5295 m 15017 5325 l 15137 5355 l col0 s
% arrowhead
n 15163 5355 m 15283 5325 l 15163 5295 l col0 s
% Polyline
15.000 slw
gs clippath
15688 5355 m 15840 5355 l 15840 5295 l 15688 5295 l 15688 5295 l 15808 5325 l 15688 5355 l cp
15587 5295 m 15435 5295 l 15435 5355 l 15587 5355 l 15587 5355 l 15467 5325 l 15587 5295 l cp
eoclip
n 15450 5325 m 15525 5325 l 15600 5325 l 15675 5325 l 15750 5325 l
15825 5325 l gs col0 s gr gr
% arrowhead
7.500 slw
n 15587 5295 m 15467 5325 l 15587 5355 l col0 s
% arrowhead
n 15688 5355 m 15808 5325 l 15688 5295 l col0 s
% Polyline
[60] 0 sd
n 14475 5025 m
15825 5025 l gs col0 s gr [] 0 sd
% Polyline
[60] 0 sd
n 14475 5325 m
15825 5325 l gs col0 s gr [] 0 sd
% Polyline
[60] 0 sd
n 14475 5550 m
15825 5550 l gs col0 s gr [] 0 sd
/Times-Bold-iso ff 200.00 scf sf
12825 4575 m
gs 1 -1 sc (epoch=13) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 4830 m
gs 1 -1 sc (files:) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 5085 m
gs 1 -1 sc ( "foo.seq_a.006") col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 5340 m
gs 1 -1 sc ( "foo.seq_b.007") col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 5595 m
gs 1 -1 sc ( "foo.seq_b.008") col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 4275 m
gs 1 -1 sc (FLU \(proc\)) col0 sh gr
% Polyline
15.000 slw
n 12750 4050 m 15975 4050 l 15975 5775 l 12750 5775 l
cp gs col0 s gr
% Polyline
n 12750 2775 m 15150 2775 l 15150 3900 l 12750 3900 l
cp gs col0 s gr
/Times-Bold-iso ff 200.00 scf sf
12825 3000 m
gs 1 -1 sc (Sequencer \(proc\)) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 3300 m
gs 1 -1 sc (epoch=13) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
12825 3555 m
gs 1 -1 sc (map=[{"foo", next_file=8,) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
13500 3750 m
gs 1 -1 sc (next_offset=0}...]) col0 sh gr
% Polyline
n 5700 3975 m 5700 4275 l 8250 4275 l 8250 3075 l 7950 3075 l 7950 3975 l
5700 3975 l cp gs col0 s gr
/Times-Bold-iso ff 200.00 scf sf
5775 4200 m
gs 1 -1 sc (server logic) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5775 3060 m
gs 1 -1 sc (Append <<123 bytes>>) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5775 3315 m
gs 1 -1 sc (to a file with prefix) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5775 3570 m
gs 1 -1 sc ("foo".) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
5775 2700 m
gs 1 -1 sc (CLIENT \(proc\)) col0 sh gr
% Polyline
gs clippath
5970 3763 m 5970 3915 l 6030 3915 l 6030 3763 l 6030 3763 l 6000 3883 l 5970 3763 l cp
eoclip
n 6000 3600 m
6000 3900 l gs col0 s gr gr
% arrowhead
7.500 slw
n 5970 3763 m 6000 3883 l 6030 3763 l col0 s
% Polyline
15.000 slw
gs clippath
6630 3737 m 6630 3585 l 6570 3585 l 6570 3737 l 6570 3737 l 6600 3617 l 6630 3737 l cp
eoclip
n 6600 3900 m 6600 3825 l 6600 3750 l 6600 3675 l
6600 3600 l gs col0 s gr gr
% arrowhead
7.500 slw
n 6630 3737 m 6600 3617 l 6570 3737 l col0 s
/Times-Bold-iso ff 200.00 scf sf
6675 3900 m
gs 1 -1 sc (ok) col0 sh gr
% Polyline
15.000 slw
n 5550 4350 m 8325 4350 l 8325 2475 l 5550 2475 l
cp gs col0 s gr
% Polyline
gs clippath
8143 4500 m 8035 4393 l 7993 4435 l 8100 4543 l 8100 4543 l 8037 4437 l 8143 4500 l cp
eoclip
n 12525 5175 m 8775 5175 l
8025 4425 l gs col0 s gr gr
% arrowhead
7.500 slw
n 8143 4500 m 8037 4437 l 8100 4543 l col0 s
/Times-Bold-iso ff 200.00 scf sf
11625 5100 m
gs 1 -1 sc (ok) col0 sh gr
% Polyline
15.000 slw
gs clippath
5970 4663 m 5970 4815 l 6030 4815 l 6030 4663 l 6030 4663 l 6000 4783 l 5970 4663 l cp
eoclip
n 6000 4425 m
6000 4800 l gs col0 s gr gr
% arrowhead
7.500 slw
n 5970 4663 m 6000 4783 l 6030 4663 l col0 s
% Polyline
15.000 slw
gs clippath
6630 4562 m 6630 4410 l 6570 4410 l 6570 4562 l 6570 4562 l 6600 4442 l 6630 4562 l cp
eoclip
n 6600 4800 m 6600 4650 l 6600 4575 l 6600 4500 l
6600 4425 l gs col0 s gr gr
% arrowhead
7.500 slw
n 6630 4562 m 6600 4442 l 6570 4562 l col0 s
% Polyline
15.000 slw
gs clippath
12388 2730 m 12540 2730 l 12540 2670 l 12388 2670 l 12388 2670 l 12508 2700 l 12388 2730 l cp
eoclip
n 8475 2700 m
12525 2700 l gs col0 s gr gr
% arrowhead
7.500 slw
n 12388 2730 m 12508 2700 l 12388 2670 l col0 s
% Polyline
15.000 slw
gs clippath
8612 2970 m 8460 2970 l 8460 3030 l 8612 3030 l 8612 3030 l 8492 3000 l 8612 2970 l cp
eoclip
n 12525 3000 m
8475 3000 l gs col0 s gr gr
% arrowhead
7.500 slw
n 8612 2970 m 8492 3000 l 8612 3030 l col0 s
% Polyline
15.000 slw
gs clippath
8612 3645 m 8460 3645 l 8460 3705 l 8612 3705 l 8612 3705 l 8492 3675 l 8612 3645 l cp
eoclip
n 12525 6900 m 12000 6900 l 12000 3675 l
8475 3675 l gs col0 s gr gr
% arrowhead
7.500 slw
n 8612 3645 m 8492 3675 l 8612 3705 l col0 s
% Polyline
15.000 slw
gs clippath
12388 3330 m 12540 3330 l 12540 3270 l 12388 3270 l 12388 3270 l 12508 3300 l 12388 3330 l cp
eoclip
n 8475 3975 m 12300 3975 l 12300 3300 l
12525 3300 l gs col0 s gr gr
% arrowhead
7.500 slw
n 12388 3330 m 12508 3300 l 12388 3270 l col0 s
% Polyline
15.000 slw
gs clippath
12388 4905 m 12540 4905 l 12540 4845 l 12388 4845 l 12388 4845 l 12508 4875 l 12388 4905 l cp
eoclip
n 8250 4425 m 8700 4875 l
12525 4875 l gs col0 s gr gr
% arrowhead
7.500 slw
n 12388 4905 m 12508 4875 l 12388 4845 l col0 s
% Polyline
15.000 slw
n 12675 2400 m 16050 2400 l 16050 7875 l 12675 7875 l
cp gs col0 s gr
% Polyline
gs clippath
8612 4245 m 8460 4245 l 8460 4305 l 8612 4305 l 8612 4305 l 8492 4275 l 8612 4245 l cp
eoclip
n 12525 3600 m 12375 3600 l 12375 4275 l
8475 4275 l gs col0 s gr gr
% arrowhead
7.500 slw
n 8612 4245 m 8492 4275 l 8612 4305 l col0 s
/Times-Bold-iso ff 200.00 scf sf
8850 5625 m
gs 1 -1 sc (Write to FLU B -> ok) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
8850 6135 m
gs 1 -1 sc (Write to FLU C -> ok) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
8550 2625 m
gs 1 -1 sc (Request 123 bytes, prefix="foo", epoch=12) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
11100 2925 m
gs 1 -1 sc ({bad_epoch,13}) col4 sh gr
/Times-Bold-iso ff 200.00 scf sf
10875 3600 m
gs 1 -1 sc ({ok, proj=...}) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
8550 4500 m
gs 1 -1 sc (Write <<123 bytes>> to) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
8550 4755 m
gs 1 -1 sc (file="foo.seq_a.008", offset=0) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
13575 2625 m
gs 1 -1 sc (Server A) col0 sh gr
/Times-Bold-iso ff 200.00 scf sf
8550 3900 m
gs 1 -1 sc (Req. 123 bytes, prefix="foo", epoch=13) col0 sh gr
/Times-Roman-iso ff 166.67 scf sf
6075 3825 m
gs 1 -1 sc (1) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
6075 4650 m
gs 1 -1 sc (2) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
6675 4650 m
gs 1 -1 sc (3) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
10950 2850 m
gs 1 -1 sc (5) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
10725 3525 m
gs 1 -1 sc (7) col16 sh gr
/Times-Bold-iso ff 200.00 scf sf
9375 4200 m
gs 1 -1 sc (file="foo.seq_a.008", offset=0) col0 sh gr
/Times-Roman-iso ff 166.67 scf sf
8400 3225 m
gs 1 -1 sc (6) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
8400 2625 m
gs 1 -1 sc (4) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
6675 3750 m
gs 1 -1 sc (16) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
8400 3900 m
gs 1 -1 sc (8) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
9225 4200 m
gs 1 -1 sc (9) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
8400 4500 m
gs 1 -1 sc (10) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
8475 5625 m
gs 1 -1 sc (12,13) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
8475 6075 m
gs 1 -1 sc (14,15) col16 sh gr
/Times-Roman-iso ff 166.67 scf sf
11400 5100 m
gs 1 -1 sc (11) col16 sh gr
% Polyline
15.000 slw
gs clippath
12388 6630 m 12540 6630 l 12540 6570 l 12388 6570 l 12388 6570 l 12508 6600 l 12388 6630 l cp
eoclip
n 8475 3300 m 12150 3300 l 12150 6600 l
12525 6600 l gs col0 s gr gr
% arrowhead
7.500 slw
n 12388 6630 m 12508 6600 l 12388 6570 l col0 s
% here ends figure;
pagefooter
showpage
%%Trailer
%EOF

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,145 @@
%!PS-Adobe-3.0 EPSF-2.0
%%BoundingBox: 0 0 420.000000 166.599991
%%Creator: mscgen 0.18
%%EndComments
0.700000 0.700000 scale
0 0 moveto
0 238 lineto
600 238 lineto
600 0 lineto
closepath
clip
%PageTrailer
%Page: 1 1
/Helvetica findfont
10 scalefont
setfont
/Helvetica findfont
12 scalefont
setfont
0 238 translate
/mtrx matrix def
/ellipse
{ /endangle exch def
/startangle exch def
/ydia exch def
/xdia exch def
/y exch def
/x exch def
/savematrix mtrx currentmatrix def
x y translate
xdia 2 div ydia 2 div scale
1 -1 scale
0 0 1 startangle endangle arc
savematrix setmatrix
} def
(client) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 75 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
75 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(Projection) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 225 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
225 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(ProjStore_C) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 375 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
375 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
(FLU_C) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup dup newpath 525 -17 moveto 2 div neg 0 rmoveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
525 -15 moveto dup stringwidth pop 2 div neg 0 rmoveto show
newpath 75 -22 moveto 75 -49 lineto stroke
newpath 225 -22 moveto 225 -49 lineto stroke
newpath 375 -22 moveto 375 -49 lineto stroke
newpath 525 -22 moveto 525 -49 lineto stroke
newpath 75 -35 moveto 225 -35 lineto stroke
newpath 225 -35 moveto 215 -41 lineto stroke
(get current) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 122 -33 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
122 -33 moveto show
newpath 75 -49 moveto 75 -76 lineto stroke
newpath 225 -49 moveto 225 -76 lineto stroke
newpath 375 -49 moveto 375 -76 lineto stroke
newpath 525 -49 moveto 525 -76 lineto stroke
newpath 225 -62 moveto 75 -62 lineto stroke
newpath 75 -62 moveto 85 -68 lineto stroke
(ok, #12...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 126 -60 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
126 -60 moveto show
newpath 75 -76 moveto 75 -103 lineto stroke
newpath 225 -76 moveto 225 -103 lineto stroke
newpath 375 -76 moveto 375 -103 lineto stroke
newpath 525 -76 moveto 525 -103 lineto stroke
newpath 75 -89 moveto 525 -89 lineto stroke
newpath 525 -89 moveto 515 -95 lineto stroke
(read "foo.seq_a.009" offset=447 bytes=123 epoch=12) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 157 -87 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
157 -87 moveto show
newpath 75 -103 moveto 75 -130 lineto stroke
newpath 225 -103 moveto 225 -130 lineto stroke
newpath 375 -103 moveto 375 -130 lineto stroke
newpath 525 -103 moveto 525 -130 lineto stroke
newpath 525 -116 moveto 75 -116 lineto stroke
newpath 75 -116 moveto 85 -122 lineto stroke
1.000000 0.000000 0.000000 setrgbcolor
(bad_epoch, 13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 261 -114 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
1.000000 0.000000 0.000000 setrgbcolor
261 -114 moveto show
0.000000 0.000000 0.000000 setrgbcolor
newpath 75 -130 moveto 75 -157 lineto stroke
newpath 225 -130 moveto 225 -157 lineto stroke
newpath 375 -130 moveto 375 -157 lineto stroke
newpath 525 -130 moveto 525 -157 lineto stroke
newpath 75 -143 moveto 375 -143 lineto stroke
newpath 375 -143 moveto 365 -149 lineto stroke
(get epoch #13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 187 -141 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
187 -141 moveto show
newpath 75 -157 moveto 75 -184 lineto stroke
newpath 225 -157 moveto 225 -184 lineto stroke
newpath 375 -157 moveto 375 -184 lineto stroke
newpath 525 -157 moveto 525 -184 lineto stroke
newpath 375 -170 moveto 75 -170 lineto stroke
newpath 75 -170 moveto 85 -176 lineto stroke
(ok, #13...) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 201 -168 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
201 -168 moveto show
newpath 75 -184 moveto 75 -211 lineto stroke
newpath 225 -184 moveto 225 -211 lineto stroke
newpath 375 -184 moveto 375 -211 lineto stroke
newpath 525 -184 moveto 525 -211 lineto stroke
newpath 75 -197 moveto 525 -197 lineto stroke
newpath 525 -197 moveto 515 -203 lineto stroke
(read "foo.seq_a.009" offset=447 bytes=123 epoch=13) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 157 -195 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
157 -195 moveto show
newpath 75 -211 moveto 75 -238 lineto stroke
newpath 225 -211 moveto 225 -238 lineto stroke
newpath 375 -211 moveto 375 -238 lineto stroke
newpath 525 -211 moveto 525 -238 lineto stroke
newpath 525 -224 moveto 75 -224 lineto stroke
newpath 75 -224 moveto 85 -230 lineto stroke
(ok, <<...123...>>) dup stringwidth
1.000000 1.000000 1.000000 setrgbcolor
pop dup newpath 257 -222 moveto 0 rlineto 0 11 rlineto neg 0 rlineto closepath fill
0.000000 0.000000 0.000000 setrgbcolor
257 -222 moveto show

File diff suppressed because it is too large Load diff