diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 73502d532..1a0b91a40 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -122,7 +122,7 @@ git push origin ## Releases -- [ ] Create a pull request from the relevant release branch to `master`. +- [ ] Create a pull request from the relevant release branch (with the format `release/urbit-os-vX.XX`) to `master`. - [ ] ssh into `~zod` - [ ] Check to ensure that nobody else is ssh'd into `~zod`, by running `screen -ls` and verifying no sessions are attached. - [ ] Attach to the screen session using `screen -x` @@ -134,7 +134,7 @@ git push origin ### Release Communications - [ ] Tag the commit that went onto the live network as a release, using GitHub's "Releases" interface. See the "Tagging" section of this document for details. -- [ ] Email the urbit-dev mailing list with an "[ANNOUNCE]" prefix in the email subject. See previous release emails for reference. +- [ ] Update (add a response) the mailing list post to include the base hash of the new release, and indicate that this has now been deployed to the network. - [ ] Tweet from the `@zodisok` Twitter account linking to the GitHub release. - [ ] Post links to the release in the Urbit Community Development channel and a channel in the UF public group. diff --git a/bin/solid.pill b/bin/solid.pill index a029847bf..5650539dc 100644 --- a/bin/solid.pill +++ b/bin/solid.pill @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:55f1bcccf861b3a2247aabb6ec3349829272ef8c36cfc8a16ff0930aac87a24d -size 5748196 +oid sha256:2035ef65290065edbd99a86f9f5a36978617bc1983131fa474a9a5c0e91dc15d +size 5998440 diff --git a/pkg/arvo/app/dojo.hoon b/pkg/arvo/app/dojo.hoon index dd2600d80..e9c6904aa 100644 --- a/pkg/arvo/app/dojo.hoon +++ b/pkg/arvo/app/dojo.hoon @@ -709,7 +709,7 @@ [%hint *] ?+ q.p.a $(a q.a) [%know *] ?@ p.q.p.a [(cat 3 '#' mark.p.q.p.a)]~ - [(rap 3 '#' auth.p.q.p.a (spat type.p.q.p.a) ~)]~ + [(rap 3 '#' auth.p.q.p.a '+' (spat type.p.q.p.a) ~)]~ :: [%help *] [summary.crib.p.q.p.a]~ diff --git a/pkg/arvo/gen/desk-requests.hoon b/pkg/arvo/gen/desk-requests.hoon new file mode 100644 index 000000000..6bc32102c --- /dev/null +++ b/pkg/arvo/gen/desk-requests.hoon @@ -0,0 +1,28 @@ +:: +desk-requests: count pending requests for a desk +:: +:- %say +|= $: [now=@da eny=@uvJ bec=beak] + [=desk ~] + ~ + == +:- %tang +^- tang +=/ cul=(list [@p rave:clay]) + %~ tap in + .^ (set [@p rave:clay]) + /cx/(scot %p p.bec)//(scot %da now)/cult/[desk] + == +:: +=/ [loc=_cul inc=_cul] + (skid cul |=([=@p rave:clay] =(p p.bec))) +=/ syc=_cul + =/ nex=@ud + +(ud:.^(cass:clay %cw /(scot %p p.bec)/[desk]/(scot %da now))) + (skim inc |=([@p =rave:clay] =([%sing %w ud+nex /] rave))) +:: +%- flop +:~ leaf+"total: {<(lent cul)>}" + leaf+"- local: {<(lent loc)>}" + leaf+"- incoming: {<(lent inc)>}" + leaf+" - for next: {<(lent syc)>}" +== diff --git a/pkg/arvo/gen/hood/close-flows.hoon b/pkg/arvo/gen/hood/close-flows.hoon new file mode 100644 index 000000000..53bfbb7cb --- /dev/null +++ b/pkg/arvo/gen/hood/close-flows.hoon @@ -0,0 +1,9 @@ +:: |close-flows: corks all stale ames flows +:: +:: It runs in dry mode by default, printing the flows that can be closed. +:: To actually close the flows, run with |close-flows, =dry | +:: +:- %say +|= [^ arg=~ dry=?] +:: +[%helm-kroc dry] diff --git a/pkg/arvo/gen/stale-flows.hoon b/pkg/arvo/gen/stale-flows.hoon new file mode 100644 index 000000000..d4d889313 --- /dev/null +++ b/pkg/arvo/gen/stale-flows.hoon @@ -0,0 +1,141 @@ +:: +stale-flows: prints number of ames flows that can be closed +:: +:: |stale-flows, =veb %1 :: flows from nacking initial subscriptions +:: |stale-flows, =veb %2 :: stale flows that keep (re)trying to connect +:: |stale-flows, =veb %21 :: ... per app (only forward) +:: |stale-flows, =veb %3 :: stale resubscriptions +:: +=> |% + +$ subs (jar path [ship bone @]) + +$ pags (jar app=term [dst=term =ship =path]) :: per-agent + +$ naks (set [ship bone]) + :: verbosity + :: + +$ veb ?(%0 %1 %2 %21 %3 %31) + :: + ++ resubs + |= [=subs =veb] + ^- @ + ::=/ sorted + :: %+ sort ~(tap by subs) + :: |=([a=(list *) b=(list *)] (lte (lent a) (lent b))) + %+ roll ~(tap by subs)::sorted + |= [[k=path v=(list [ship bone @])] num=@] + ~? &(=(%3 veb) (gth (lent v) 1)) + "#{<(dec (lent v))>} stale resubs on {}" + ?. (gth (lent v) 1) num + (add (lent v) num) + -- +:: +:- %say +|= $: [now=@da eny=@uvJ bec=beak] + [arg=~ dry=? =veb] + == +:: +=/ peers-map + .^((map ship ?(%alien %known)) %ax /(scot %p p.bec)//(scot %da now)/peers) +:: +=/ peers=(list ship) + %+ murn ~(tap by peers-map) + |= [=ship val=?(%alien %known)] + ?: =(ship p.bec) + ~ :: this is weird, but we saw it + ?- val + %alien ~ + %known (some ship) + == +:: +=; [[=subs =pags backward=@ forward=@] =naks] + :- %tang %- flop + %+ weld + :~ leaf+"#{<~(wyt in naks)>} flows from %nacking %watches" + leaf+"#{} backward flows with >10 retries" + leaf+"#{} forward flows with >10 retries" + leaf+"#{<(resubs subs veb)>} stale resubscriptions" + == + ?. =(%21 veb) ~ + :- leaf+"----------------------------------" + %+ turn %+ sort ~(tap by pags) + |= [[* v=(list)] [* w=(list)]] + (gth (lent v) (lent w)) + |= [app=term v=(list [dst=term =ship =path])] + :- %leaf + %+ weld "#{<(lent v)>} flows for {} with >10 retries" + ?. =(1 (lent v)) ~ + ?> ?=(^ v) + " on {} to {} at {}" +:: +%+ roll peers +|= [=ship [=subs p=pags b=@ f=@] n=naks] +=+ .^ =ship-state:ames + %ax /(scot %p p.bec)//(scot %da now)/peers/(scot %p ship) + == +=/ =peer-state:ames ?>(?=(%known -.ship-state) +.ship-state) +:: +|^ [stale nacks] +:: +++ stale + %+ roll ~(tap by snd.peer-state) + |= [[=bone message-pump-state:ames] subs=_subs pags=_p backward=_b forward=_f] + =, packet-pump-state + :- ?~ duct=(~(get by by-bone.ossuary.peer-state) bone) subs + ?. ?=([* [%gall %use sub=@ @ %out @ @ nonce=@ pub=@ *] *] u.duct) + subs + =/ =wire i.t.u.duct + =/ nonce=(unit @) (rush i.t.t.t.t.t.t.t.i.t.u.duct dem) + %- ~(add ja subs) + :_ [ship bone ?~(nonce 0 u.nonce)] :: 0, 1? + ?~ nonce wire + :: don't include the sub-nonce in the key + :: + (weld (scag 7 wire) (slag 8 wire)) + %+ roll ~(tap in live) + |= [[* [packet-state:ames *]] pags=_pags out=[b=_backward f=_forward]] + :: + :: only forward flows + :: + =? pags &(=(0 (end 0 bone)) (gth retries 10)) + ?~ duct=(~(get by by-bone.ossuary.peer-state) bone) + pags + ?. ?=([* [%gall %use sub=@ @ %out @ @ nonce=@ pub=@ *] *] u.duct) + pags + =/ =wire i.t.u.duct + (~(add ja pags) (snag 2 wire) (snag 8 wire) ship (slag 9 wire)) + :: + ~? &(=(%2 veb) (gth retries 10)) + =+ arrow=?:(=(0 (end 0 bone)) "<-" "->") + "{arrow} ({(cite:title ship)}) bone #{}, retries: #{}" + :- pags + =? out (gth retries 10) + ?: =(0 (end 0 bone)) + [b.out +(f.out)] + [+(b.out) f.out] + out +:: +++ nacks + %+ roll ~(tap by rcv.peer-state) + |= [[=bone *] nacks=_n] + ?. &(=(0 (end 0 bone)) =(1 (end 0 (rsh 0 bone)))) + :: not a naxplanation ack bone + :: + nacks + :: by only corking forward flows that have received + :: a nack we avoid corking the current subscription + :: + =+ target=(mix 0b10 bone) + :: make sure that the nack bone has a forward flow + :: + ?~ duct=(~(get by by-bone.ossuary.peer-state) target) + nacks + ?. ?=([* [%gall %use sub=@ @ %out @ @ nonce=@ pub=@ *] *] u.duct) + nacks + =/ =wire i.t.u.duct + ?> ?=([%gall %use sub=@ @ %out @ @ nonce=@ pub=@ *] wire) + =/ app=term i.t.t.wire + =/ nonce=@ + =- ?~(- 0 u.-) + (rush i.t.t.t.t.t.t.t.wire dem) + =/ =path t.t.t.t.t.t.t.t.wire + ~? =(%1 veb) "[bone={} nonce={} agent={}] {}" + (~(put in nacks) [ship target]) +-- diff --git a/pkg/arvo/lib/hood/helm.hoon b/pkg/arvo/lib/hood/helm.hoon index 0c812cbe8..34b68bad8 100644 --- a/pkg/arvo/lib/hood/helm.hoon +++ b/pkg/arvo/lib/hood/helm.hoon @@ -245,6 +245,10 @@ |= ~ =< abet (emit %pass /helm %arvo %a %stir '') :: +++ poke-kroc + |= dry=? =< abet + (emit [%pass /helm/kroc %arvo %a %kroc dry]) +:: ++ poke-knob |= [error-tag=@tas level=?(%hush %soft %loud)] =< abet (emit %pass /helm %arvo %d %knob error-tag level) @@ -280,6 +284,7 @@ %helm-ames-sift =;(f (f !<(_+<.f vase)) poke-ames-sift) %helm-ames-verb =;(f (f !<(_+<.f vase)) poke-ames-verb) %helm-ames-wake =;(f (f !<(_+<.f vase)) poke-ames-wake) + %helm-kroc =;(f (f !<(_+<.f vase)) poke-kroc) %helm-atom =;(f (f !<(_+<.f vase)) poke-atom) %helm-automass =;(f (f !<(_+<.f vase)) poke-automass) %helm-cancel-automass =;(f (f !<(_+<.f vase)) poke-cancel-automass) diff --git a/pkg/arvo/sys/lull.hoon b/pkg/arvo/sys/lull.hoon index a0159b021..e05500f74 100644 --- a/pkg/arvo/sys/lull.hoon +++ b/pkg/arvo/sys/lull.hoon @@ -352,6 +352,7 @@ :: %heed: track peer's responsiveness; gives %clog if slow :: %jilt: stop tracking peer's responsiveness :: %cork: request to delete message flow + :: %kroc: request to delete stale message flows :: %plea: request to send message :: :: System and Lifecycle Tasks @@ -370,6 +371,7 @@ [%heed =ship] [%jilt =ship] [%cork =ship] + [%kroc dry=?] $>(%plea vane-task) :: $>(%born vane-task) diff --git a/pkg/arvo/sys/vane/ames.hoon b/pkg/arvo/sys/vane/ames.hoon index 7404aaa18..02be753f5 100644 --- a/pkg/arvo/sys/vane/ames.hoon +++ b/pkg/arvo/sys/vane/ames.hoon @@ -1183,6 +1183,7 @@ %vega on-vega:event-core %plea (on-plea:event-core [ship plea]:task) %cork (on-cork:event-core ship.task) + %kroc (on-kroc:event-core dry.task) == :: [moves ames-gate] @@ -1448,6 +1449,7 @@ ~% %event-gate ..per-event ~ |= [[now=@da eny=@ rof=roof] =duct =ames-state] =* veb veb.bug.ames-state + =| cork-bone=(unit bone) :: modified by +on-kroc ~% %event-core ..$ ~ |% ++ event-core . @@ -1899,7 +1901,15 @@ =/ =peer-state +.u.ship-state =/ =channel [[our ship] now channel-state -.peer-state] :: - =^ =bone ossuary.peer-state (bind-duct ossuary.peer-state duct) + =/ [=bone ossuary=_ossuary.peer-state] + ?^ cork-bone [u.cork-bone ossuary.peer-state] + (bind-duct ossuary.peer-state duct) + =. ossuary.peer-state ossuary + :: + ?. (~(has by by-bone.ossuary.peer-state) bone) + %. event-core + %^ trace odd.veb ship + |.("trying to cork {}, not in the ossuary, ignoring") :: =. closing.peer-state (~(put in closing.peer-state) bone) %- %^ trace msg.veb ship @@ -1908,6 +1918,68 @@ =/ rcvr [ship her-life.channel] "cork plea {}" abet:(on-memo:(make-peer-core peer-state channel) bone plea %plea) + :: +on-kroc: cork all flows from failed subscriptions + :: + ++ on-kroc + |= dry=? + ^+ event-core + :: + =; [corks=@ core=_event-core] + ?. dry core + %.(core (slog leaf/"ames: #{} flows can be corked" ~)) + :: + %+ roll ~(tap by peers.ames-state) + |= [[=ship =ship-state] corks=@ core=_event-core] + ?. ?=(%known -.ship-state) + corks^core + =/ =peer-state:ames ?>(?=(%known -.ship-state) +.ship-state) + =/ subs=(jar path [bone sub-nonce=@]) + %+ roll ~(tap by snd.peer-state) + |= [[=forward=bone *] subs=(jar path [bone sub-nonce=@])] + ?: (~(has in closing.peer-state) forward-bone) + subs + ?~ duct=(~(get by by-bone.ossuary.peer-state) forward-bone) + subs + ?. ?=([* [%gall %use sub=@ @ %out @ @ nonce=@ pub=@ *] *] u.duct) + subs + =/ =wire i.t.u.duct + =/ nonce=(unit @) (rush (snag 7 wire) dem) + %- ~(add ja subs) + :: 0 for old pre-nonce subscriptions + :: + :_ [forward-bone ?~(nonce 0 u.nonce)] + ?~ nonce wire + :: don't include the sub-nonce in the key + :: + (weld (scag 7 wire) (slag 8 wire)) + %+ roll ~(tap by subs) + |= [[=wire flows=(list [bone sub-nonce=@])] corks=_corks core=_core] + :: + %- tail + %+ roll (sort flows |=([[@ n=@] [@ m=@]] (lte n m))) + |= [[=bone nonce=@] resubs=_(lent flows) corks=_corks core=_core] + =/ app=term ?>(?=([%gall %use sub=@ *] wire) i.t.t.wire) + =/ =path (slag 7 wire) + =/ log=tape "[bone={} agent={} nonce={}] {}" + =; corkable=? + =? corks corkable +(corks) + =? core &(corkable !dry) (%*(on-cork core cork-bone `bone) ship) + (dec resubs)^corks^core + :: checks if this is a stale re-subscription + :: + ?. =(resubs 1) + %. & + (trace &(dry odd.veb) ship |.((weld "stale %watch plea " log))) + :: the current subscription can be safely corked if there + :: is a flow with a naxplanation ack on a backward bone + :: + =+ backward-bone=(mix 0b10 bone) + ?. =(2 (mod backward-bone 4)) + | + ?~ (~(get by rcv.peer-state) backward-bone) + | + %. & + (trace &(dry odd.veb) ship |.((weld "failed %watch plea " log))) :: +on-take-wake: receive wakeup or error notification from behn :: ++ on-take-wake diff --git a/pkg/arvo/sys/vane/clay.hoon b/pkg/arvo/sys/vane/clay.hoon index 00e27e007..b9c677a53 100644 --- a/pkg/arvo/sys/vane/clay.hoon +++ b/pkg/arvo/sys/vane/clay.hoon @@ -5636,6 +5636,7 @@ %sweep ``[%sweep !>(sweep)] %rang ``[%rang !>(ran.ruf)] %tomb ``[%flag !>((tomb t.path))] + %cult ``[%cult !>((cult t.path))] %flow ``[%flow !>(fad.ruf)] %domes domes %tire ``[%tire !>(tore:(lu now rof *duct ruf))] @@ -5662,6 +5663,22 @@ [[ship desk] [[let hit lab] tom nor liv ren]:dom.rede] ``[%domes !>(`cone`domes)] :: + ++ cult + |= =path + ^- (set [@p rave]) + %- %~ run in + %~ key by + ?~ path *^cult + qyx:(~(gut by dos.rom.ruf) i.path *dojo) + |= wove + :- ship:(fall for [ship=our @ud]) + ?- -.rove + %sing rove + %next [%next mood.rove] + %mult [%mult mool.rove] + %many [%many [track moat]:rove] + == + :: :: True if file is accessible :: ++ tomb diff --git a/pkg/arvo/sys/vane/eyre.hoon b/pkg/arvo/sys/vane/eyre.hoon index 24354a128..f3ebe9583 100644 --- a/pkg/arvo/sys/vane/eyre.hoon +++ b/pkg/arvo/sys/vane/eyre.hoon @@ -2668,13 +2668,11 @@ =* domains domains.server-state.ax =* ports ports.server-state.ax =/ =host:eyre [%& ?^(domains n.domains /localhost)] - =/ secure=? &(?=(^ secure.ports) !?=(hoke:eyre host)) =/ port=(unit @ud) - ?. secure + ?. ?=(^ secure.ports) ?:(=(80 insecure.ports) ~ `insecure.ports) - ?> ?=(^ secure.ports) ?:(=(443 u.secure.ports) ~ secure.ports) - ``[secure port host] + ``[?=(^ secure.ports) port host] == == -- diff --git a/pkg/webterm/desk.docket-0 b/pkg/webterm/desk.docket-0 index 531bd1d58..3f3840fb4 100644 --- a/pkg/webterm/desk.docket-0 +++ b/pkg/webterm/desk.docket-0 @@ -1,9 +1,9 @@ :~ title+'Terminal' info+'A web interface to your Urbit\'s command line.' color+0x2e.4347 - glob-http+['https://bootstrap.urbit.org/glob-0v5.hvjci.n7c4h.1onl6.34g14.fut7c.glob' 0v5.hvjci.n7c4h.1onl6.34g14.fut7c] + glob-http+['https://bootstrap.urbit.org/glob-0vep1vb.e09fv.h88mg.endg6.3mip6.glob' 0vep1vb.e09fv.h88mg.endg6.3mip6] base+'webterm' - version+[1 1 0] + version+[1 1 1] website+'https://tlon.io' license+'MIT' ==