Ted Blackman
da591a4078
ames: invert busted conditional in recork timer
2022-08-05 02:37:03 +03:00
Ted Blackman
56d4906a13
ames: try next recork on cork ack
...
Without this, a ship would send a cork on a max of one flow per
recork timer, which could take years to clear for some ships.
This starts a hot loop of trying the next cork once one gets
positively acked.
2022-08-05 01:35:34 +03:00
Ted Blackman
54cd1a5eca
ames: simplify recork timer
...
The previous recork timer queued up %cork messages without sending them.
It also relied on making sure pump timers didn't get set for recork bones.
This was fragile.
The new design enqueues up to one new %cork message per ship during each
recork timer, based on the state of the flow. If the flow is closing but
there are no outstanding messages in it, then it needs to be recorked.
Flows will be recorked in ascending numerical order by bone.
2022-08-05 01:13:21 +03:00
fang
9433d3354d
ames: unsent-fragments is a list, not a tree
...
Measure accordingly.
2022-08-03 21:03:49 +02:00
fang
7af527e605
ames: correctly measure queue size
2022-08-03 20:52:03 +02:00
fang
e6453bae3c
ames: more detailed "future msg" trace
...
This additional information may come in handy when debugging this crash
we shouldn't be seeing.
2022-08-03 20:46:54 +02:00
fang
e16c499724
ames: make recork timer faster
...
This will aid visibility and debugging. We'll probably want to make this
slower again later.
2022-08-03 20:33:04 +02:00
fang
7c01ee9b35
ames: account for corked flows during %stir
...
Also patches the behn scry in %stir handling to be correct for latest behn.
2022-08-03 19:37:53 +02:00
fang
b860bef066
ames: correctly avoid setting pump timer
...
The condition got butchered during refactor: instead of avoiding the creation
of pump timers during recork wake, it was setting them _exclusively_ during
recork wake.
2022-08-02 23:23:48 +02:00
Ted Blackman
e5e4c8602d
ames: properly set recork flag in +on-wake
2022-08-02 23:15:43 +03:00
Ted Blackman
67efb2ad7c
ames: don't start pump timers on recork
2022-08-02 23:03:34 +03:00
yosoyubik
a5aedaccc5
ames: delete naxplanation flows if bone is corked
2022-07-18 10:27:36 +02:00
yosoyubik
35c6ac416e
ames: fix predicate for detecting %cork acks
2022-07-16 07:40:05 +02:00
yosoyubik
c599e60c5b
ames: add recork set
2022-07-15 16:45:32 +02:00
yosoyubik
a3518ef4d6
ames: add trace for %cork plea
2022-07-13 09:17:42 +02:00
yosoyubik
34a7496720
ames: clean up nack flows after a cork
2022-07-08 07:29:04 +02:00
yosoyubik
ca1b586a46
ames: init cork timer on larval +take
2022-07-07 11:35:28 +02:00
yosoyubik
d4d443db13
ames: remove cork wire from state
2022-07-07 09:20:57 +02:00
yosoyubik
e366e55dbc
ames: add global daily timer for pending corks
...
WIP compiles and upgrades, and the timer gets properly reset
but untested for actual re-subscriptions with old publishers
2022-07-06 17:00:35 +02:00
yosoyubik
76919ce07c
ames: resend %cork after a naxplanation in one day
2022-07-06 10:52:19 +02:00
yosoyubik
ea4a31558f
ames: ack last fragment from closing bone
2022-07-01 09:59:24 +02:00
yosoyubik
a967b42c30
ames: print bone if "hear last in-progress"
2022-06-30 17:12:07 +02:00
yosoyubik
b0766c2f53
ames: remove misleading trace printf
2022-06-30 10:46:02 +02:00
yosoyubik
27ac0b601e
ames: use %$ as recipient vane for %corks
2022-06-30 10:18:37 +02:00
yosoyubik
17d52b8535
ames: handle bounce %cork from old publisher
...
Because the publisher will send the cork plea back to the subscriber on
the next bone, we are not able to know the bone for the original cork.
To handle it, we add the cork bone to the plea path
still wip: it keeps resending the cork plea faster than its ~h1 timer
2022-06-28 12:48:07 +02:00
yosoyubik
7de9c72f36
ames: add rift when inserting new peer state
2022-06-27 13:55:07 +02:00
yosoyubik
2e92331a0b
Merge branch 'next/arvo' into yu/gall-rq-wire-ames-flow-kill
2022-06-16 08:54:24 +02:00
Ted Blackman
0190a477f5
ames: adjust comments
2022-06-15 15:35:41 -06:00
Ted Blackman
1380e83b55
ames: clog on 5 messages and 100kB
2022-06-15 15:28:34 -06:00
Ted Blackman
d2ea33ddfe
ames: condense message size calculation
...
Co-authored-by: fang <git@fang.io>
2022-06-05 08:49:47 -05:00
Ted Blackman
953273004a
ames: clog at 100kB instead of 5 messages
2022-06-04 17:18:21 -05:00
fang
43dff9c279
ames: do not use old lanes during stateful forward
...
As 999f0e8
, but for the stateful code path in +send-blob.
2022-06-01 21:47:15 +02:00
fang
999f0e84e9
ames: do not produce stale forward lanes
...
Stale lanes may cause forwarding loops. Imagine the following:
1) Planet A is live. Galaxy B, its indirect sponsor, learns of its route.
2) A goes offline. Another ship, C, is started in its place, at the same route.
3) B receives a packet for A, forwards it to the known route.
4) C received the packet, forwards it to B.
5) Repeat from 3.
Here, we update the forward lane(s) scry used by the runtime to not produce a
peer's lane if they haven't communicated with us in the last hour. Everyone's
supposed to ping their sponsorship chain every 30 seconds. If those aren't
going through, you shouldn't expect to be reachable anyway.
We may or may not want to update +send-blob to match.
2022-06-01 17:17:37 +02:00
Philip Monk
5b773723b3
Merge remote-tracking branch 'origin/yu/ames-fixes' into next/arvo
2022-05-20 22:52:00 -07:00
Philip Monk
ac64f44538
clay: update tests
2022-05-20 20:03:34 -07:00
Philip Monk
f16abbd992
ames: fix comet communication with breached ship
2022-05-19 20:20:00 -07:00
yosoyubik
16920a894e
Merge branch 'yu/ames-fixes' into yu/gall-rq-wire-ames-flow-kill
2022-05-18 17:37:24 +02:00
yosoyubik
c2576cdc46
ames: handle +call moves if re-evolving from larva
2022-05-18 17:36:40 +02:00
yosoyubik
fe412b1ca7
gall: remove $watches from egg/yoke
...
Also renames $beat to $boar so it signifies more its closeness to $boat
2022-05-18 15:27:17 +02:00
Philip Monk
7e4ad62a51
Merge remote-tracking branch 'origin/yu/ames-fixes' into philip/tomb
2022-05-17 14:07:05 -07:00
yosoyubik
4dae3ae3e2
ames: indent
2022-05-17 07:49:15 +02:00
yosoyubik
f81061fe40
Merge branch 'yu/ames-fixes' into yu/gall-cork-wip
2022-05-17 07:47:58 +02:00
yosoyubik
2553573be0
ames: start drainage timer if regressed from adult
...
This accounts for a possible race condition where ames expects a
response, but regresses into the larval state. Upon receiving the
$sign on +take, we would remain stuck as a larva. Now we check
that we have enough information to re-evolve and then start a
/larval timer to begin draining the queue.
2022-05-17 07:11:09 +02:00
Philip Monk
d25194c7a3
arvo: reduce priority of lifecycle printfs
2022-05-14 23:59:21 -07:00
Philip Monk
8a2eac7c70
Merge remote-tracking branch 'origin/ted/ames-prod-2' into philip/tomb
2022-05-14 21:17:10 -07:00
Philip Monk
2e31f87068
Merge branch 'pr' into philip/tomb
2022-05-14 20:59:01 -07:00
yosoyubik
350636fe2a
ames: don't relay acks for naxplanations of %corks
...
This avoids closing a subscription prematurely, before the
server ames has had time to process the innitial %cork.
2022-05-14 10:52:45 +02:00
yosoyubik
76ddc359f5
ames: fixt 6-to-7 state update
2022-05-09 14:17:27 +02:00
yosoyubik
a2b771f704
Merge branch 'yu/ames-fixes' into yu/gall-cork-wip
2022-05-09 14:16:07 +02:00
yosoyubik
5d6b2d8997
ames: fix 4-to-5 state migration
2022-05-09 14:13:51 +02:00
yosoyubik
a278b63c66
ames: add tracing printf
2022-05-06 09:47:19 +02:00
yosoyubik
6318aa283b
ames: retry sending a %cork if publisher is behind
2022-05-05 14:04:18 +02:00
yosoyubik
06883b617e
ames: add new state version in +stay
2022-05-05 13:00:23 +02:00
yosoyubik
53e1c86833
Merge remote-tracking branch 'origin/yu/ames-fixes' into yu/gall-rq-wire-ames-flow-kill
2022-05-03 13:57:39 +02:00
yosoyubik
ec60399cdf
ames: restore previous +decode-shut-packet
2022-05-03 12:49:10 +02:00
yosoyubik
3f7f4dbd5a
gall: handle %kicks for nonexistent subscriptions
2022-05-03 12:49:10 +02:00
yosoyubik
a288d455c3
ames: remove %cork from |ack-meat
2022-05-03 12:49:10 +02:00
yosoyubik
8be9257164
ames: style indentation
2022-05-03 12:49:09 +02:00
yosoyubik
52ef6ba08e
ames: handles decoding old-format shut-packets
2022-05-03 12:49:09 +02:00
h5gq3
c95cce4404
style fixes
2022-05-03 12:49:09 +02:00
h5gq3
5583fc1320
ames-flow-kill
2022-05-03 12:49:09 +02:00
yosoyubik
02806f63a1
ames: hardcode rift for comets in state upgrade
2022-04-27 06:24:55 +02:00
yosoyubik
9cb425e0ef
ames: remove unused ames-to-ames %plea logic
...
This seems to have been used in the past for pinging the ship's
sponsor, but was later removed when the :ping app was introduced
2022-04-22 15:49:15 +02:00
yosoyubik
087f24e931
ames: use +trace to print logs
2022-04-22 12:29:16 +02:00
yosoyubik
e2f8e21529
ames: remove sigwut
2022-04-22 12:26:53 +02:00
yosoyubik
471b9be22d
ames: fix emit of parsing old wire log
2022-04-22 12:26:24 +02:00
yosoyubik
91435a92ca
ames: don't drop events with old wires
...
Previously we were dropping events that used old
wires that lacked a rift in them. This seems a
bad behavior because we don't want to destroy a
flow that has not been processed by both ends.
Note: pending a fix to test-old-ames-wire
2022-04-22 12:26:14 +02:00
yosoyubik
6cdebea1af
ames: address review
2022-04-22 12:26:08 +02:00
yosoyubik
60cc44e961
ames: fix cached state in larval upgrade
2022-04-22 12:26:02 +02:00
yosoyubik
1b01455fe5
ames: fix dangling-bone error
2022-04-22 12:25:55 +02:00
lukechampine
8399b7b96c
ames: add resend timer for attestation requests
2022-04-04 00:19:55 -04:00
lukechampine
53a0c87cdb
ames: add sendkeys-packet
2022-03-02 00:56:57 -05:00
lukechampine
df6318acd0
ames: fix comet self-attestation handling
2022-03-02 00:52:48 -05:00
lukechampine
1044d42a15
ames: don't enqueue blobs sent to unknown comets
2022-03-02 00:46:18 -05:00
yosoyubik
3d943ec201
ames: ignore missing peer-state on-publ-sponsor
2022-01-18 20:34:32 +01:00
Ted Blackman
bbc80f9d45
zuse,ames: ^^sein:title
2021-09-25 16:52:53 -04:00
Ted Blackman
bce8dfd477
ames: pop the next packet, not the first packet again
2021-08-28 23:01:15 +03:00
Ted Blackman
e2fd0b61e4
ames: |ames-prod to reset congestion control
2021-08-28 22:48:23 +03:00
Philip Monk
e2e4d28548
Merge pull request #4788 from urbit/la/sys-fast-orm
...
zuse: add +all, +any, +got, +has, +run, and +tab to ++ordered-map, jet hints, and reorganize alphabetically
2021-05-18 10:24:31 -07:00
Ted Blackman
4c94c7edd4
ames: expire direct lanes faster after inactivity
2021-05-03 17:33:56 -04:00
Logan Allen
dd6eeccdae
zuse: update names of +subset to +lot, +peek to +pry, remove unnecessary comments
2021-04-28 16:12:46 -05:00
Logan Allen
6b0dc98952
ames: reflect update of name +traverse -> +dip
2021-04-20 15:04:28 -05:00
Joe Bryan
19d5bd0de4
ames: gate "fragment crashed" printf on msg.veb
2021-03-18 17:04:08 -07:00
Philip Monk
6215137ed5
Merge remote-tracking branch 'origin/ted/ordered-map-fix' into release/next-sys
2021-03-03 18:20:33 -08:00
Philip Monk
6e3d1680a7
Merge remote-tracking branch 'origin/master' into release/next-sys
2021-03-03 17:54:57 -08:00
Philip Monk
413413b70c
zuse: traverse always delete
2021-02-26 21:03:20 -08:00
Philip Monk
5ac70ec974
ames: reset num-live to actual number of live packets
2021-02-26 20:53:27 -08:00
Ted Blackman
04ea4c78b2
ames: +on-hear-shut remove dead code
2021-02-26 16:55:26 +10:00
Ted Blackman
ccea39f865
ames: fix comet handshake
2021-02-26 16:55:24 +10:00
Ted Blackman
eb56fbd3f4
ames: shorten error printing; update pill
2021-02-19 11:54:34 -05:00
Ted Blackman
473a520b27
ames: more informative printing
2021-02-18 21:47:02 -05:00
Ted Blackman
6234b56ac1
ames: cache message +jam in +on-memo
2021-01-20 15:29:45 -05:00
Philip Monk
e5d4230f6b
ames: print on crashing %done
...
This is guaranteed to produce a stuck flow if the error isn't transient,
so this will be good info to get.
2020-12-11 16:49:55 -08:00
Philip Monk
175ce28bb7
ames: tag verb printfs
2020-12-11 16:45:13 -08:00
Philip Monk
595efabf6c
ames: recover from %strange-current
2020-12-11 16:43:13 -08:00
Joe Bryan
2b8d83e255
ames: remove "larva: drain" printf (too noisy)
2020-12-08 03:32:29 -08:00
Joe Bryan
aaf506ce8a
Merge branch 'jb/motion' into jb/motion-merge
...
* jb/motion:
pill: solid
zuse: remove %crud from vane-task
arvo: full vane names in $sign
aqua: build again (still broken)
arvo: reform of the scry reform
2020-12-07 18:52:51 -08:00
Joe Bryan
5dd3e148b8
zuse: remove %crud from vane-task
2020-12-07 18:01:48 -08:00
fang
d98c59e73a
zuse: lift moves out of +able
2020-12-08 01:47:06 +01:00
Joe Bryan
17736990ed
arvo: full vane names in $sign
2020-12-07 16:30:22 -08:00
Joe Bryan
98f2b8c6b3
arvo: reform of the scry reform
2020-12-07 13:52:12 -08:00
Joe Bryan
5a82f1d4c0
Merge branch 'na-release/candidate' into jb/motion
...
* na-release/candidate: (36 commits)
ames: don't crash on forward-lane scry
jael: cleanup per review
jael: don't signal breach if first hearing of ship
pill: update
vere: compile
lens: don't de-base64
vere: make import flow not use base64 encoding
version: strip trailing newline
pill: mainnet
Revert "zuse: change to ropsten"
chat-hook: fix another poke-import issue
chat-hook: fix poke-import issue
apps: reorder maps, sets, and jugs
apps: reorder maps, sets, and jugs
kiln: add base-hash and our scries
lens: fix change lost in merge
graph-store: leave try-rejoin wire when subscription succeeds
graphs: import-export
chat: import/export
invites: import/export
...
2020-12-07 00:27:58 -08:00
Joe Bryan
ff06ccd2b9
arvo: completes scry reform
2020-12-06 03:33:43 -08:00
Joe Bryan
5bc6d38437
arvo: updates vane interface
2020-12-06 03:33:43 -08:00
Philip Monk
4b8be294b2
ames: don't crash on forward-lane scry
2020-12-05 20:02:31 -08:00
Joe Bryan
958bb5acf7
arvo: removes +is and all references to it
2020-12-05 00:51:49 -08:00
Joe Bryan
5111831a03
ames: use +rep to assemble message fragments
2020-12-03 14:26:55 -08:00
Joe Bryan
9bb790e3e9
ames: updates +end, +lsh, and +rsh call sites
2020-12-03 14:25:31 -08:00
Ted Blackman
c7b8ffbf4e
ames: flat packet format
2020-12-01 09:51:14 -05:00
Joe Bryan
072e2c8101
Merge branch 'm/vane-unversion' into m/modern-hoon
...
* m/vane-unversion:
ames: remove old state versions & conversions
gall: rename fading styles
vanes: remove old load types and logic
gall: refresh clay subscription on fade
gall: add nonce to agent wires
gall: add %doze-style fade
gall: fade initial commit
2020-11-30 21:04:16 -08:00
fang
122123c11a
ames: remove old state versions & conversions
2020-11-27 13:55:21 +01:00
Joe Bryan
f95e1f48c2
arvo: scry reform
2020-11-25 16:02:10 -08:00
fang
7956adedee
vanes: remove old load types and logic
...
Maintains state version numbers to avoid tripping up migration tools.
2020-11-25 16:24:16 +01:00
Ted Blackman
56db7cdcda
ames/zuse: require >64-bit comet addresses
2020-10-27 17:28:07 -04:00
Ted Blackman
fcf9cfbcdb
ames/zuse: require >64-bit comet addresses
2020-10-27 17:20:25 -04:00
Joe Bryan
da928bed10
ames: updates forward-lane scry-handling to match +send-blob
2020-10-22 17:37:46 -07:00
Ted Blackman
f2be97d315
ames: print failed scrys
2020-09-18 16:06:13 -04:00
Philip Monk
1d0409c4c4
ames: fix lane discovery during some lane changes
...
We used to not accept new indirect lanes if we already have a direct
lane. This means that if Bob, with a publicly-accessible lane, changes
lanes (eg by restarting the process and getting a new port or changing
ip addresses), tries to talk to Alice, who is behind a NAT, then Bob
will try directly but fail (because Alice is behind a NAT), so he will
route the message through her galaxy. This is good -- the message gets
to Alice. However, Alice had a direct route to Bob's old lane, so she
will try to ack on that lane, which fails. She will not time out this
lane because she doesn't know that Bob isn't getting the acks (acks
don't have their own acks).
The solution is that if Alice receives an indirect lane for Bob when she
already has a direct lane, she shouldn't ignore it. If the lane is the
same as what she has, she shouldn't change anything (in particular, she
shouldn't mark it as indirect). But if it's a new lane, she should
discard her old direct lane and use the new indirect lane.
2020-07-24 20:41:48 -07:00
Fang
3955d1092b
ames: add scry endpoint for forward lanes
...
Finds the lane for that peer, or their galaxy. Intended for use in the
runtime, to enable stateless forwarding.
2020-07-22 16:33:34 +02:00
Fang
4ea98e569f
ames: improve scry interface
...
No longer abuse the desk field, instead making use of the path. Reject
any scries outside of the local ship, empty desk and current time as
invalid.
2020-07-22 16:30:47 +02:00
Ted Blackman
ef138bb007
ames: use +cut in +encrypt
2020-06-25 22:54:37 -04:00
Philip Monk
05f0e47f68
ames: fix larval +load for fusion
2020-06-11 22:55:08 -07:00
Philip Monk
8b78f04dd3
Merge remote-tracking branch 'origin/master' into ford-fusion
2020-06-02 21:50:20 -07:00
Philip Monk
818d2231f6
ames: remove jumbo packets
2020-06-02 14:13:28 -07:00
Philip Monk
18e396cf53
release: urbit-os-v1.0.20
...
Previous urbit-os-v1.0.20 was not released
2020-05-28 18:43:20 -07:00
Philip Monk
c20cd29932
jael: look for correct wire
...
We inspect the wire of our subscriber to see if we need to produce the
result as a %public-keys or a %boon. This is bad -- we should proxy the
subscription to avoid this need, but this doesn't make that change yet.
%pubs is an old name that doesn't exist anymore (last existed around
September 2019). The new version is /public-keys, but it's worked so
far because /public-keys has only one item in the path, so it missed the
conditional. This commit makes the intent more clear.
The [%a @ @ *] could be just [%a @ *], but I leave it to reduce the
chance of breaking stuff.
2020-05-28 14:27:08 -07:00
Philip Monk
0642cc5861
ames: add |ames-wake
...
Somehow we ended up with flows which expected to awaken but did not wake
up. This was likely caused by the error in r920j OTA, urbit-os-v1.0.18.
This adds a command which ensures that every flow has an active timer.
I expect this to be needed only once, but it's a pretty general tool, so
it's worth keeping.
I've included an unused @t parameter to more easily add simple debug
commands to ames without having to add a new task
2020-05-28 10:28:31 -07:00
Philip Monk
ff01a1ea04
ames: don't set new timer if we woke up too early
...
Otherwise if we end up having multple outstanding timers, they never
coalesce to a single timer.
2020-05-27 17:38:18 -07:00
Fang
58e85fa661
Merge branch 'release/next-sys' into m/debug-dashboard
2020-05-23 01:00:45 +02:00
Philip Monk
a4a44f1e21
kiln: cleanup
2020-05-22 14:32:32 -07:00
Philip Monk
4fcd9f23c0
Merge branch 'release/behn-fast' ( #2915 )
...
* release/behn-fast:
zuse: add +ordered-map
behn: switch to ordered-map
chat: virtualize message-to-json conversion
2020-05-21 22:43:53 -07:00
Philip Monk
274215ec6b
zuse: add +ordered-map
...
At some point this should be more properly styled similar to +by, +in,
and +to, but for now this reduces duplication and makes the ordered map
available to everyone.
2020-05-21 22:28:16 -07:00
Fang
4c9d18e5c0
Merge branch 'release/next-sys' into m/debug-dashboard
2020-05-21 20:09:58 +02:00
Philip Monk
8c4c0f31fc
Merge pull request #2920 from urbit/ted/ames-mass-alien
...
ames: fix %alien |mass over-reporting
2020-05-21 01:40:30 -07:00
Ted Blackman
a0eafa8aa3
zuse,ames: handle %trim task
2020-05-21 03:45:08 -04:00
Ted Blackman
0f7b213f38
ames: fix %alien |mass over-reporting
2020-05-21 03:19:20 -04:00
Ted Blackman
7e69e66280
ames/zuse: handle %trim event
2020-05-20 03:29:54 -04:00
Fang
be087a8c92
Merge branch 'release/next-sys' of https://github.com/urbit/urbit into m/debug-dashboard
2020-05-11 20:39:00 +02:00
Fang
14831f4864
ames: expose state through scries
...
Support /=peers= and /=peer=/~ship scries for getting at all peers and
a specific peer's connection state, respectively.
Moves some internal types into zuse for easier external use.
2020-05-08 01:37:07 +02:00
Ted Blackman
a064afbd89
/sys: |mass works again
2020-05-07 04:51:08 -04:00
Philip Monk
4cc3fea534
clay: don't send peers to message pump
2020-05-05 16:39:50 -07:00
Philip Monk
490b615b6a
ames: only dedupe long messages
2020-05-04 21:39:59 -07:00
Philip Monk
081c8a864d
ames: don't split messages until ready to send
...
Trying to reduce the size of ames queues. This deduplicates incoming
message-blobs by comparing with existing message-blobs in other queues.
It also stops splitting into fragments in +feed-packets. Instead, it
splits into fragments at the last moment, in +encrypt. This means we
don't have to store a large number of packets in our home road.
2020-05-02 03:35:44 -07:00
Philip Monk
c50c34d8be
ames: dedup new messages and fragments
2020-05-01 22:55:14 -07:00
Philip Monk
3b9f7249d3
ames: print num-fragments in packet verbage
...
Gives you a poor man's progress bar. For example, to determine how much
of an OTA you've downloaded from your sponsor, run:
|ames-sift (sein:title our now our)
|ames-verb %rcv
and then to turn it off:
|ames-verb
2020-03-17 14:03:48 -07:00
Joe Bryan
6322639436
vane: jet-hints all vanes for profiling
2020-03-03 14:17:42 -08:00
Joe Bryan
53d9798cda
vane: prints error notifications where not handled
2020-02-26 16:56:17 -08:00
Joe Bryan
93eaff7401
ames: downcast %hear error notification to %hole
2020-02-26 16:56:17 -08:00
Joe Bryan
4cae84d9ac
vane: downcast all error notifications to %crud
2020-02-26 16:56:17 -08:00
Joe Bryan
df970ed417
arvo: passes errors to all vanes
2020-02-26 16:56:17 -08:00