@@ -15,17 +15,27 @@
15 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Synchronization is simply the process of sharing artifacts between
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
servers so that all servers have copies of all artifacts. Because
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
artifacts are unordered, the order in which artifacts are received
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
at a server is inconsequential. It is assumed that the SHA1 hashes
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
of artifacts are unique - that every artifact has a different SHA1 hash.
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To first approximation, synchronization proceeds by sharing lists
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ To a first approximation, synchronization proceeds by sharing lists
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SHA1 hashes of available artifacts, then sharing those artifacts that
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
are not found on one side or the other of the connection. In practice,
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a repository might contain millions of artifacts. The list of
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SHA1 hashes for this many artifacts can be large. So optimizations are
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
employed that usually reduce the number of SHA1 hashes that need to be
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
shared to a few hundred.</p>
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <p>Each repository also has local state. The local state determines
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the web-page formatting preferences, authorized users, ticket formats,
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and similar information that varies from one repository to another.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The local state is not transfered by the <b>push</b>, <b>pull</b>,
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and <b>sync</b> command, though some local state is transfered during
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a <b>clone</b> in order to initialize the local state of the new
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository. The <b>configuration push</b> and <b>configuration pull</b>
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commands can be used to send or receive local state.</p>
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<h2>2.0 Transport</h2>
29 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<p>All communication between client and server is via HTTP requests.
31 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
The server is listening for incoming HTTP requests. The client
@@ -275,11 +285,19 @@
275 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cookie and the server must structure the cookie payload in such
276 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a way that it can tell if the cookie it sees is its own cookie or
277 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a cookie from another server. (Typically the server will embed
278 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
its servercode as part of the cookie.)</p>
279 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h3>3.9 Error Cards</h3>
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h3>3.9 Request-Configuration Cards</h3>
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <i>TBD...</i>
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h3>3.10 Configuration Cards</h3>
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <i>TBD...</i>
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h3>3.11 Error Cards</h3>
281 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
282 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<p>If the server discovers anything wrong with a request, it generates
283 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
an error card in its reply. When the client sees the error card,
284 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
it displays an error message to the user and aborts the sync
285 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
operation. An error card looks like this:</p>
@@ -295,11 +313,16 @@
295 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(ASCII 0x5C) is represented as two backslashes "\\". Apart from
296 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
space and newline, no other whitespace characters nor any
297 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unprintable characters are allowed in
298 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the error message.</p>
299 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h3>3.10 Unknown Cards</h3>
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h3>3.12 Comment Cards</h3>
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <p>Any card that begins with "#" (ASCII 0x23) is a comment card and
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is silently ignored.</p>
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h3>3.13 Unknown Cards</h3>
301 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
302 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<p>If either the client or the server sees a card that is not
303 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
described above, then it generates an error and aborts.</p>
304 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
305 328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<h2>4.0 Phantoms And Clusters</h2>
@@ -463,10 +486,13 @@
463 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>file</b> <i>artifact-id size</i> <b>\n</b> <i>content</i>
464 487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>file</b> <i>artifact-id delta-artifact-id size</i> <b>\n</b> <i>content</i>
465 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>igot</b> <i>artifact-id</i>
466 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>gimme</b> <i>artifact-id</i>
467 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>cookie</b> <i>cookie-text</i>
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li> <b>reqconfig</b> <i>parameter-name</i>
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li> <b>config</b> <i>parameter-name size</i> <b>\n</b> <i>content</i>
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li> <b>#</b> <i>arbitrary-text...</i>
468 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li> <b>error</b> <i>error-message</i>
469 495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</ul>
470 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li>Phantoms are artifacts that a repository knows exist but does not possess.
471 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li>Clusters are artifacts that contain IDs of other artifacts.
472 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<li>Clusters are created automatically on the server during a pull.
473 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!