fastward resume worker pool deadlock

Issue #292 (support concurrent traversal), implemented workload acceleration using the worker pool. However, the fastward resume scenario is the only one that causes a deadlock and wait ing on on the waitgroup always blocks indefinitely.
One thing that should also be noted, which may be related is the fact that at no point within an accelerated navigation session do we call Done() on the waitgroup for all the other scenarios that do appear to work. This seems counter-intuitive, the wait should only ever get unblocked, when the correct number of Done()'s have been invoked, so this is fishy and may be the hidden cause of the deadlock in a fastward resume scenario. We need to rationalise this and fix so that we can safely invoke Done() in the normal manner.
The ensync method is invoked as part of walk. This is probably unwise and should be delegated to the session. Invoking from walk means that there a complication because what happens during fasward is different to what happens in spawn. We should get rid of these types of differences wherever possible.
For the fastward scenario, note this code (commit: f69db56):
func (s *fastwardStrategy) resume(info *strategyResumeInfo) (*TraverseResult, error) {
	resumeAt := info.ps.Active.NodePath
	s.nc.logger().Info("fastward resume",
		log.String("root-path", info.ps.Active.Root),
		log.String("resume-at-path", resumeAt),
	)

	if info.ai != nil {
		s.ensync(info.ai)
	}

	// fast-forward doesn't need to restore the entire state, eg, the
	// Depth can begin as per usual, without being restored.
	//
	return info.nc.walk(info.ps.Active.Root)
}

This looks wrong because we are invoking ensync inside resume, but walk also does this, which means we get an extra and invalid decoration. This is the reason why we should delegate to the session as by doing this we can be sure that the logic is correct and consistent between fastward and spawn.

Output that shows a fastward resume that timesout the unit test due to deadlock ...
 ✘ plastikfan@Janus  ~/dev/github/go/snivilised/extendio λ   feat/concurrent-traversal ±  task t
ok      github.com/snivilised/extendio/collections      (cached)
ok      github.com/snivilised/extendio/i18n     (cached)
?       github.com/snivilised/extendio/internal/helpers [no test files]
?       github.com/snivilised/extendio/internal/log     [no test files]
Running Suite: Nav Suite - /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav
=====================================================================================
Random Seed:<PHONE_NUMBER>

Will run 1 of 98 specs
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics'
===> 🧊 WorkerPool.run ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
===> 🧊 (#workers: '0') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:6bac9462-fa72-441d-98b9-2778f4d720ad) [Seq: -999]
===> 🧊 (#workers: '1') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:0463facf-d98b-4d4f-a08d-c9e7738a7837) [Seq: -999]
        ---> 🚀worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(input:'{0xc0002e6000 0x7ccae0}')
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(input:'{0xc0002e6070 0x7ccae0}')
        ---> 🚀worker.run((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/A1 - The Telephone Call.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/A2 - Night Drive.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/cover.night-drive.jpg'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/vinyl-info.night-drive.txt'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council'
===> 🧊 (#workers: '2') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:ed3e66c8-c006-4f28-8597-bd8c4d00376f) [Seq: -999]
===> 🧊 (#workers: '3') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:93cfd64f-ed67-42bc-8eca-89493b3ab97a) [Seq: -999]
===> 🧊 (#workers: '4') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:ab040551-6027-48f7-901d-413818813e74) [Seq: -999]
===> 🧊 (#workers: '5') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:9c4189f3-d37f-410b-aa2b-0ceceee74537) [Seq: -999]
===> 🧊 (#workers: '6') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:fbae96d6-9e19-499f-a8b9-b08b1f9d4ca1) [Seq: -999]
===> 🧊 (#workers: '7') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:5a39ce40-0fa4-458a-bf97-bc52b6e4bb38) [Seq: -999]
        ---> 🚀worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e61c0 0x7ccae0}')
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e6230 0x7ccae0}')
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e62a0 0x7ccae0}')
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e6310 0x7ccae0}')
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(input:'{0xc0002e6150 0x7ccae0}')
        ---> 🚀worker.run((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
        ---> 🚀 worker.run((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59)(input:'{0xc00016c000 0x7ccae0}')
        ---> 🚀worker.run((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
        ---> 🚀worker.run((🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
        ---> 🚀worker.run((💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/A1 - Incident.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/A2 - The Zemlya Expedition.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/cover.northern-council.jpg'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/vinyl-info.northern-council.txt'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/A1 - Can You Kiss Me First.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/A2 - Teenage Color.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/vinyl-info.teenage-color.txt'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth'
        ---> 🚀worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val <not Stringer>) ProgressReporterManager:0xc0004f06f0 cancel:0x50a1e0 suite:0xc000128000})
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:b80e2789-5deb-4f37-83b4-a6291cbd959b) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:9b1863c3-e1f8-4474-adbb-3c32bf898ac0) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:5b15e62d-c281-4c4e-b96f-11362eb3505f) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:e7649f1c-0817-4d8b-afce-3d6b5a7efd0c) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:620ae82c-a5d2-48e0-bf8d-8f2f00584f7b) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:f1d9c959-4491-4435-8a37-15eda17690ae) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:6584932a-8101-4f3b-b525-4cd26da7f520) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:759b3442-d3db-45fa-97e0-ec9b97b1a83a) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:83e787cf-d452-4307-aa37-064e74bcef43) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:3cf68fc0-c969-46b5-b4f0-ef5bd8161fd7) [Seq: -999]
        ---> 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c)(input:'{0xc0002e6690 0x7ccae0}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c)(input:'{0xc0002e6770 0x7ccae0}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c)(input:'{0xc0002e67e0 0x7ccae0}')
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e6380 0x7ccae0}')
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(input:'{0xc00016c070 0x7ccae0}')
        ---> 🚀 worker.run((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29)(input:'{0xc0002e63f0 0x7ccae0}')
        ---> 🚀 worker.run((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2)(input:'{0xc0002e64d0 0x7ccae0}')
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/A1 - Before Life.flac'
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:1c577465-634a-4854-8ac6-4dc856839681) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:bb269287-1291-4087-9374-fdcdbb0d1d44) [Seq: -999]
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(input:'{0xc0002e68c0 0x7ccae0}')
        ---> 🚀 worker.run((🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0)(input:'{0xc0002e6540 0x7ccae0}')
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color'
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:c350c233-b049-4e89-b86b-355cd5410ceb) [Seq: -999]
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(input:'{0xc0002e6540 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color'
        ---> 🚀 worker.run((💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f)(input:'{0xc0002e65b0 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/A1 - Can You Kiss Me First.flac'
        ---> 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c)(input:'{0xc0002e6850 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld'
        ---> 🚀 worker.run((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59)(input:'{0xc0002e6460 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/cover.northern-council.jpg'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/A2 - Runaway.flac'
---> 🐬 ASYNC-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/vinyl-info.innerworld.txt'
---> 😈😈😈 defer session.finish
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:409b8f55-ebac-4f8f-8bdc-cf2e01f02b4b) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:36d47b02-5899-4ab9-858f-4a7828bac5fd) [Seq: -999]
===> 🚀 WorkerPool.run(source jobs chan closed) 🟥🟥🟥
!!!! 🧊 WorkerPool.drain - waiting for remaining workers: 8 (#GRs: 15); 🧊🧊🧊
        ---> 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💚)WORKER-ID-3:7950ebde-d144-4bb9-a077-17cb20d79a55) finished, remaining: '7' 🟥
        ---> 🚀 worker.run((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29)(input:'{0xc0002e6930 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/A2 - Runaway.flac'
        ---> 🚀 worker.run((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2)(input:'{0xc0002e69a0 0x7ccae0}')
---> ⏩ ON-ASYNC-CALLBACK(Fastward Resume WithCPUPool(universal: listen pending(logged)/run with context) '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/vinyl-info.innerworld.txt'
        ---> 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💗)WORKER-ID-8:18b78bba-51ed-401f-a39d-b32934bcdb5c) finished, remaining: '6' 🟥
        ---> 🚀 worker.run((💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💖)WORKER-ID-7:a171f1d9-fe78-4cad-8a77-78399ea7f58f) finished, remaining: '5' 🟥
        ---> 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💙)WORKER-ID-2:d97fc59d-5810-4b67-910e-0ecb9eddad93) finished, remaining: '4' 🟥
        ---> 🚀 worker.run((🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((🤍)WORKER-ID-6:465cfe4e-eb2c-4559-8a4e-166de5c30cc0) finished, remaining: '3' 🟥
        ---> 🚀 worker.invoke((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59)(cancel) - done received 💥💥💥
        ---> 🚀 worker.run((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((❤)WORKER-ID-1:6c39bc8c-28a3-46cf-a214-07d93fd59e59) finished, remaining: '2' 🟥
        ---> 🚀 worker.invoke((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29)(cancel) - done received 💥💥💥
        ---> 🚀 worker.invoke((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2)(cancel) - done received 💥💥💥
        ---> 🚀 worker.run((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2)(finished) - done received 🔶🔶🔶
        <--- 🚀 worker.run((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💛)WORKER-ID-5:d73f5eaa-408c-4013-8ef0-6de55a5022f2) finished, remaining: '1' 🟥
        ---> 🚀 worker.run((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💜)WORKER-ID-4:ce8d574c-8217-49cc-af87-7933a219be29) finished, remaining: '0' 🟥
===> 🧊 WorkerPool.run - drain complete (workers count: '0'). 🎃🎃🎃
<--- WorkerPool.run (QUIT). 🧊🧊🧊

------------------------------
• [TIMEDOUT] [2.003 seconds]
navigation async [It] 🧪 ===> given: 'Fastward Resume WithCPUPool(universal: listen pending(logged)', should: 'run with context'
/home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:158

  [TIMEDOUT] A spec timeout occurred
  In [It] at: /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:158 @ 08/23/23 10:52:52.287

  This is the Progress Report generated when the spec timeout occurred:
    navigation async 🧪 ===> given: 'Fastward Resume WithCPUPool(universal: listen pending(logged)', should: 'run with context' (Spec Runtime: 2.001s)
      /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:158
      In [It] (Node Runtime: 2s)
        /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:158

      Spec Goroutine
      goroutine 11 [sleep]
        time.Sleep(0x2faf080)
          /usr/local/go/src/runtime/time.go:195
        github.com/fortytw2/leaktest.CheckContext.func1()
          /home/plastikfan/go/pkg/mod/github.com/fortytw2/leaktest@v1.3.0/leaktest.go:144
        github.com/fortytw2/leaktest.CheckTimeout.func1()
          /home/plastikfan/go/pkg/mod/github.com/fortytw2/leaktest@v1.3.0/leaktest.go:113
      > github.com/snivilised/extendio/xfs/nav_test.glob..func6.3({0xaf9320?, 0xc000542300}, 0xc000110ed0)
          /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:137
            |   wg.Wait()
            |   Expect(err).To(BeNil())
            > },
            | func(entry *asyncTE) string {
            |   return fmt.Sprintf("🧪 ===> given: '%v', should: '%v'", entry.given, entry.should)
        reflect.Value.call({0x94c160?, 0xc000110e40?, 0x13?}, {0x9fdf17, 0x4}, {0xc000542390, 0x2, 0x2?})
          /usr/local/go/src/reflect/value.go:584
        reflect.Value.Call({0x94c160?, 0xc000110e40?, 0xafe2a8?}, {0xc000542390?, 0x0?, 0xc0000c2c80?})
          /usr/local/go/src/reflect/value.go:368
      > github.com/onsi/ginkgo/v2.invokeFunction({0x94c160?, 0xc000110e40}, {0xc000077aa0, 0x2, 0x1?})
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/table_dsl.go:262
            |   }
            |
            >   return reflect.ValueOf(function).Call(inValues)
            | }
            |
      > github.com/onsi/ginkgo/v2.generateTable.func2.1({0xaf9320?, 0xc000542300?})
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/table_dsl.go:224
            |                   panic(err)
            |           }
            >           invokeFunction(itBody, append([]interface{}{c}, entry.parameters...))
            |   })
            | } else {
      > github.com/onsi/ginkgo/v2/internal.(*Suite).runNode.func3()
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/suite.go:865
            |   }()
            |
            >   node.Body(sc)
            |   finished = true
            | }()
      > github.com/onsi/ginkgo/v2/internal.(*Suite).runNode
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/suite.go:852
            | failureC := make(chan types.Failure)
            |
            > go func() {
            |   finished := false
            |   defer func() {

      Goroutines of Interest
      goroutine 7 [select]
      > github.com/onsi/ginkgo/v2/internal/interrupt_handler.(*InterruptHandler).registerForInterrupts.func2(0x0?)
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/interrupt_handler/interrupt_handler.go:131
            | var interruptCause InterruptCause
            | for {
            >   select {
            |   case <-signalChannel:
            |           interruptCause = InterruptCauseSignal
      > github.com/onsi/ginkgo/v2/internal/interrupt_handler.(*InterruptHandler).registerForInterrupts
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/interrupt_handler/interrupt_handler.go:128
            | }
            |
            > go func(abortChannel chan interface{}) {
            |   var interruptCause InterruptCause
            |   for {

      goroutine 8 [select]
      > github.com/onsi/ginkgo/v2/internal.RegisterForProgressSignal.func1()
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/progress_report.go:32
            | go func() {
            |   for {
            >           select {
            |           case <-signalChannel:
            |                   handler()
      > github.com/onsi/ginkgo/v2/internal.RegisterForProgressSignal
          /home/plastikfan/go/pkg/mod/github.com/onsi/ginkgo/v2@v2.11.0/internal/progress_report.go:30
            | }
            | ctx, cancel := context.WithCancel(context.Background())
            > go func() {
            |   for {
            |           select {

      goroutine 37 [chan receive]
        github.com/snivilised/lorax/async.(*WorkerPool[...]).drain(0xc00030e000?, 0xa25436)
          /home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.4/async/worker-pool.go:236
        github.com/snivilised/lorax/async.(*WorkerPool[...]).run(0xc00030e000, {0x7fca5d9e8160, 0xc000542300?}, 0xc00010e120, 0xc00053fce0)
          /home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.4/async/worker-pool.go:159
        github.com/snivilised/lorax/async.(*WorkerPool[...]).Start(0x0?, {0x7fca5d9e8160?, 0xc000542300?}, 0x0?)
          /home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.4/async/worker-pool.go:100
      > github.com/snivilised/extendio/xfs/nav.(*navigationAccelerator).start
          /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/navigation-accelerator.go:23
            | // more data will be written to it and will close when complete.
            | //
            > go a.pool.Start(ai.Ctx, ai.OutputsChOut)
            |
            | ai.Wg.Add(1)
------------------------------
SSSSSSSSSSSSSSSSSSS

Summarizing 1 Failure:
  [TIMEDOUT] navigation async [It] 🧪 ===> given: 'Fastward Resume WithCPUPool(universal: listen pending(logged)', should: 'run with context'
  /home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/traverse-navigator-async_test.go:158

Ran 1 of 98 Specs in 2.006 seconds
FAIL! -- 0 Passed | 1 Failed | 0 Pending | 97 Skipped

<\details>

We need another object that wraps the wait group to help debug wat group issues.

The deadlock is proving t be intermittent.

This is an example of fastward resume working ok
foo

... and here is an example of the fastward failing due to panic caused by sending on closed channel:

panic: send on closed channel
```
               ➕➕➕ [[ WaitGroupAssister(🍂 traversal).Add ]] - gr-name: '✨ observable-navigator' (count: '1') (running: '✨ observable-navigator')
                ➕➕➕ [[ WaitGroupAssister(🍂 traversal).Add ]] - gr-name: '🧊 worker pool' (count: '2') (running: '✨ observable-navigator/🧊 worker pool')
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE'
===> 🧊 WorkerPool.run ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
===> 🧊 (#workers: '0') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:9989fa94-2966-4d4e-a1a3-c1a252a2422c) [Seq: -999]
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics'
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a)(input:'{0xc0000f2230 0x7cd700}')
===> 🧊 (#workers: '1') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:5338845a-0caa-45f2-bfc6-e4cfd8fbaa71) [Seq: -999]
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a)(input:'{0xc0000f22a0 0x7cd700}')
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/A1 - The Telephone Call.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/A2 - Night Drive.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/cover.night-drive.jpg'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Chromatics/Night Drive/vinyl-info.night-drive.txt'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/A1 - Incident.flac'
        ---> 🚀 worker.run((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/A2 - The Zemlya Expedition.flac'
===> 🧊 (#workers: '2') WorkerPool.run - new job received
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/cover.northern-council.jpg'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Northern Council/vinyl-info.northern-council.txt'
===> 🧊 WorkerPool.spawned new worker: '(💚)WORKER-ID-3:42429057-7a3b-4171-88aa-be7dc2ffccb0' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:75e752f8-c2d7-404e-a2ee-1f0090ea1f35) [Seq: -999]
===> 🧊 (#workers: '3') WorkerPool.run - new job received
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/A1 - Can You Kiss Me First.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/A2 - Teenage Color.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color/vinyl-info.teenage-color.txt'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth'
===> 🧊 WorkerPool.spawned new worker: '(💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:9d87bd12-7c17-4136-8e79-c2a9b867a540) [Seq: -999]
===> 🧊 (#workers: '4') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💛)WORKER-ID-5:191fb876-f70b-4c7e-86ef-a9dda4734e1c' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:498bc3e3-ed04-4f95-b2c0-603415b80e83) [Seq: -999]
===> 🧊 (#workers: '5') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(🤍)WORKER-ID-6:05fcf3ef-f941-42a9-915a-c436e4db7f8b' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:805da2d5-9688-48eb-bec2-10877201240a) [Seq: -999]
===> 🧊 (#workers: '6') WorkerPool.run - new job received
===> 🧊 WorkerPool.spawned new worker: '(💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af' 🎀🎀🎀
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48)(input:'{0xc00016a0e0 0x7cd700}')
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48)(input:'{0xc00016a150 0x7cd700}')
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48)(input:'{0xc00016a1c0 0x7cd700}')
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld'
        ---> 🚀 worker.run((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a)(input:'{0xc00016a070 0x7cd700}')
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a)(input:'{0xc00016a000 0x7cd700}')
        ---> 🚀 worker.run((💚)WORKER-ID-3:42429057-7a3b-4171-88aa-be7dc2ffccb0) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
        ---> 🚀 worker.run((🤍)WORKER-ID-6:05fcf3ef-f941-42a9-915a-c436e4db7f8b) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:c509418a-0231-44d4-af4c-611f9f9bb54a) [Seq: -999]
        ---> 🚀 worker.run((💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
        ---> 🚀 worker.run((💛)WORKER-ID-5:191fb876-f70b-4c7e-86ef-a9dda4734e1c) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
===> 🧊 (#workers: '7') WorkerPool.run - new job received
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/A1 - Before Life.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/A2 - Runaway.flac'
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/Electric Youth/Innerworld/vinyl-info.innerworld.txt'
---> observable navigator 😈😈😈 defer session.finish (CLOSE(JobsChanOut)/QUIT)
                🚩🚩🚩 [[ WaitGroupAssister(🍂 traversal).Done ]] - gr-name: '✨ observable-navigator' (count: '1') (running: '🧊 worker pool')
                🧭🧭🧭 [[ WaitGroupAssister(🍂 traversal).Wait ]] - gr-name: '👾 test-main' (count: '1') (running: '🧊 worker pool')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf) ...(ctx:&{Context:context.Background.WithCancel.WithValue(type string, val ) ProgressReporterManager:0xc0000132c0 cancel:0x50a1e0 suite:0xc00012a000})
===> 🧊 WorkerPool.spawned new worker: '(💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf' 🎀🎀🎀
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:4cf07519-38f6-4a30-a998-af029f1dc7c7) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:436027e4-2fb2-4fa2-a7a8-db9825c3bec9) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:6c1235d9-5818-4fb4-bbb0-a33c27452bef) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:ea220be5-8a25-4d33-93b2-d8e059b3df29) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:c2673c61-4525-4d36-b18c-dff1d2241d2f) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:d01892bb-ef24-4f2d-baa1-791229874c66) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:1ade1416-27a8-417c-8599-12eb2f1865a1) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:53e8ae1b-cadc-4793-bd80-eeb668e5c3ee) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:8ccf140e-4716-405d-b030-21d329c90c89) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:25d63e27-85fb-4bc2-ba88-2be845aac194) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:a6d0ccd2-cc97-4099-8965-2fe12bcb3bd3) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:0ad5c028-2eda-4bb1-8f22-03529fbf17d7) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:453a2eb8-3729-4c5f-824d-fe1c64905841) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:cb6be59b-fb86-436d-86e6-a5f1e899dc65) [Seq: -999]
===> 🧊 (#workers: '8') WorkerPool.run - new job received
===> 🧊 WorkerPool.run - forwarded job 🧿🧿🧿(JOB-ID:c8ca053e-67cd-4757-a8ec-746c1639f316) [Seq: -999]
===> 🚀 WorkerPool.run(source jobs chan closed) 🟥🟥🟥
!!!! 🧊 WorkerPool.drain - waiting for remaining workers: 8 (#GRs: 15); 🧊🧊🧊
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc00016a5b0 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc00016a620 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc00016a690 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc00016a700 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc00016a770 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc0000f2310 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc0000f2380 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(input:'{0xc0000f23f0 0x7cd700}')
        ---> 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💗)WORKER-ID-8:8f346dd2-2d02-4f6e-9414-ea4fd5bc58cf) finished, remaining: '7' 🟥
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48)(input:'{0xc00016a230 0x7cd700}')
        ---> 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💜)WORKER-ID-4:dc8f8db4-f77f-4b09-b120-81f8f97e7f48) finished, remaining: '6' 🟥
        ---> 🚀 worker.run((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a)(input:'{0xc00016a2a0 0x7cd700}')
        ---> 🚀 worker.run((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💙)WORKER-ID-2:a125907b-6d77-4360-a442-c7337c59324a) finished, remaining: '5' 🟥
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a)(input:'{0xc00016a310 0x7cd700}')
        ---> 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((❤)WORKER-ID-1:269794d1-34a4-41e8-9ee8-8895a7871c3a) finished, remaining: '4' 🟥
        ---> 🚀 worker.run((💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af)(input:'{0xc00016a4d0 0x7cd700}')
        ---> 🚀 worker.run((💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af)(jobs chan closed) 🟥🟥🟥
        <--- 🚀 worker.run((💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af) (SENT FINISHED). 🚀🚀🚀
!!!! 🧊 WorkerPool.drain - worker((💖)WORKER-ID-7:807cd49e-1a64-4bf5-8883-684c489932af) finished, remaining: '3' 🟥
        ---> 🚀 worker.run((💛)WORKER-ID-5:191fb876-f70b-4c7e-86ef-a9dda4734e1c)(input:'{0xc00016a540 0x7cd700}')
---> 🐬 ENSYNC-NAV-CALLBACK: '/home/plastikfan/dev/github/go/snivilised/extendio/Test/data/MUSICO/RETRO-WAVE/College/Teenage Color'
        <--- 🚀 worker.run((💛)WORKER-ID-5:191fb876-f70b-4c7e-86ef-a9dda4734e1c) (SENT FINISHED). 🚀🚀🚀
panic: send on closed channel
goroutine 38 [running]:
github.com/snivilised/extendio/xfs/nav.(*navigator).ensync.func1(0xc00016a540)
/home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/navigator-abstract.go:44 +0x1ef
github.com/snivilised/extendio/xfs/nav.(*navigationListener).makeStates.func1(0xc00016a540)
/home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/navigation-listener.go:91 +0x7d
github.com/snivilised/extendio/xfs/nav.(*navigationListener).decorate.func1(0xc0000820c0?)
/home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/navigation-listener.go:164 +0x22
github.com/snivilised/extendio/xfs/nav.traverseExecutive({{0xc000032810, 0x2b}, {0xc00016a540, 0xc000114730}, 0xfffffffffffffc19})
/home/plastikfan/dev/github/go/snivilised/extendio/xfs/nav/navigation-accelerator.go:31 +0x38
github.com/snivilised/lorax/async.(*worker[...]).invoke(0xc0002040c0?, {0x7f826c5dc438, 0xc0001935c0}, {{0xc000032810, 0x2b}, {0xc00016a540, 0xc000114730}, 0xfffffffffffffc19})
/home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.5/async/worker.go:47 +0xb0
github.com/snivilised/lorax/async.(*worker[...]).run(0xc0002040c0, {0x7f826c5dc438, 0xc0001935c0?})
/home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.5/async/worker.go:36 +0x316
created by github.com/snivilised/lorax/async.(*WorkerPool[...]).spawn
/home/plastikfan/go/pkg/mod/github.com/snivilised/lorax@v0.2.5/async/worker-pool.go:188 +0x271
FAIL    github.com/snivilised/extendio/xfs/nav  0.017s
ok      github.com/snivilised/extendio/xfs/utils        (cached)
FAIL
</details>

The intermittency means we have a race condition.

It looks like the wrong go routine is closing the jobs channel. The workers send to the jobs channel, but none of them can close the channel as there are multiple writers. Therefore, the workers send their own finished notification to the worker pool. Whilst the pool is in its drain phase, it will countdown until there are no workers left (determined by the number of entries in the worker collection). When the worker collection is empty, it will close the jobs channel on behalf of the workers. However, this seems to create a race condition that only manifests in the fastward scenario.


Failed to install app longhorn. Error: UPGRADE FAILED: transport is closing

Longhorn rollback from 0.6.0 to 0.5.0 not work:
Failed to install app longhorn. Error: UPGRADE FAILED: transport is closing

It's a Rancher Bug. See:
https://github.com/rancher/rancher/issues/23017

Is there any way to recover from this without waiting for the second next stable Rancher release?

After upgrade 0.5.0 to 0.6.1 - work good, but error not clear

If you delete, then everything is fine

@aleksey005 Delete what exactly, the catalog-installed app or the resources it provisions? Does that disconnect/corrupt mounted volumes? Will it pick up the existing volumes after reinstalling?

@tbq I made backups in the S3 volumes of the Longhorn, then deleted the failed application from the Apps - Longhorn, then restored the volumes through the backup Longhorn procedure.

@rbq Deleting the app will remove all the data, make sure you have backups before doing it.
We're investigating possible ways to work around the Rancher issue, stay tuned.

I have the same problem.

Steps to reproduce this issue:

Setup environment before reproducing: Rancher version v2.2.7; Kubernetes version v1.13.9; One Kubernetes Cluster with 3 nodes;

Set Chart repo URL to https://github.com/shuo-wu/charts.git with branch test as the test chart. Please refresh the chart before reproducing it.

Use kubectl apply -f https://raw.githubusercontent.com/shuo-wu/longhorn/test/deploy/pv-test.yaml to create the environment for triggering the bug later.

Launch Longhorn v0.5.0 from the catalog and wait for it to become active.

Upgrade to v0.6.0(which is the faulted version in this chart). Wait until error message Failed to install app longhorn-system. Error: UPGRADE FAILED: timed out waiting for the condition occurs on the app detail page(typically 5~10 minutes).

Try to roll back to the previous revision (v0.5.0). The error message Failed to install app longhorn-system. Error: UPGRADE FAILED: transport is closing shows and we cannot upgrade or rollback in this step.

@rbq @jocarren We've found a workaround to the rollback or upgrade failure. See https://github.com/longhorn/longhorn/wiki/Longhorn-v0.6.0-Upgrade:-Workaround-for-recovering-from-a-rollback-failure-in-Rancher for details.

@yasker Thank you!
I experimented with the workaround and managed to revert to 0.5. My Helm ConfigMaps seem to be called longhorn.v${n} though, without the -system part.
Then I tried to upgrade to 0.6.1 and it failed with:

Failed to install app longhorn.  What's wrong with your deployment?

This error message Failed to install app longhorn. Error: UPGRADE FAILED: no ConfigMap with the name "longhorn-default-setting" found is actually a Helm bug: If the new resources introduced by the new version already exist in your cluster, this kind of error will be triggered when you try to upgrade to that new version.
For Longhorn system, this new version means v0.6.0 or v0.6.1. The failed v0.6.0 upgrading will introduce 2 new resources: a ConfigMap named longhorn-default-setting and a CRD named instancemanagers.longhorn.rancher.io. In order to upgrade to v0.6.1, you also need to force deleting these resource besides removing the Helm ConfigMaps and Longhorn workloads:
kubectl -n longhorn-system delete cm longhorn-default-setting
kubectl patch -p '{"metadata":{"finalizers": null}}' crd instancemanagers.longhorn.rancher.io
kubectl delete crd instancemanagers.longhorn.rancher.io

@yasker The UI couldn't connect to the nodes and provisioning volumes didn't work. I then saw that there were still some workloads with version 0.6.1 running and removed those. That seemed to trigger Longhorn going on a killing spree, setting all volumes to “Deleting …” without any way to abort. I ended up uninstalling Longhorn, manually removing the rest, patching away a bunch of finalizers, deleting resources, moving the leftover data on the nodes aside and re-installing 0.6.1.

Thanks @rbq . How did you triggered the uninstaller? It shouldn't be triggered during either upgrade or rollback process, unless there is something we don't aware of.

Also, a quick update: we're still working on the workaround. The previous steps have some issues and gaps, we're validating the updated version currently. We should able to release it next week.

On a single-node cluster, Longhorn is installed and updated without failures.

Validation: PASSED
Steps to test:

https://github.com/longhorn/longhorn/wiki/Longhorn-v0.6.0-Upgrade:-Workaround-for-recovering-from-a-rollback-failure-in-Rancher

We will release the fix with v0.6.2 soon.

We will keep the issue open until Rancher fixes https://github.com/rancher/rancher/issues/21070

The workaround is now available at https://github.com/longhorn/longhorn/wiki/Longhorn-v0.6.0-Upgrade:-Workaround-for-recovering-from-a-rollback-failure-in-Rancher , along with Longhorn v0.6.2 release.

Rancher v2.3 has been fixed to mitigate the issue. See https://github.com/rancher/rancher/issues/21070 for details.

@yasker issue still exists 😢
Longhorn: 1.0.0
Rancher: 2.4.4
kubernetes deployed onto Ubuntu 18.04 via rke 1.1.2

@yasker I just upgrade longhorn from 0.8.0 to 1.0.0 on the Rancher UI and stuck at state installing just like @TemaSM
I did upgrade on Rancher 2.2.12, now I already upgrade to Rancher 2.4.5 (2.2.12 -> 2.3.0 -> 2.3.8 -> 2.4.5), the longhorn state is still stuck at installing. While it still functioning which all of my volumes are working fine, I can't upgrade longhorn to 1.0.1.

@cwt @TemaSM is there any more specific failure information you can share? For example, @cwt, since you mentioned the Longhorn, stuck at state installing, can you check the workload page to see if any workload isn't in healthy state?

@yasker workloads are all green. on the app page -> longhorn-system I got this message:
Failed to install app longhorn-system. Error: UPGRADE FAILED: a release named longhorn-system is in use, cannot re-use a name that is still in use
as I said previously, everything seem working fine, I can create volume, snapshot, backup. all of my pods that mount longhorn volumes are working fine too. It's just that the status is installing and I can't upgrade to 1.0.1.

@cwt It would hard for us to figure out from Longhorn side since it seems related to some pre-exist conditions. I found a related bug at https://github.com/helm/helm/issues/4174 which you might find useful.

@yasker Thanks for your help anyway. Since I already have backup for all volumes, I already plan to remove longhorn and reinstall it again. I think my problem should be fixed.

... is there any more specific failure information you can share? ...

-> No any specific/detailed info. Everything is just like @cwt described:

... as I said previously, everything seem working fine, I can create volume, snapshot, backup. all of my pods that mount longhorn volumes are working fine too. It's just that the status is installing ...

@yasker Anyway, thanks for your time! I decided to look onto Longhorn later, when it became more stable.

@TemaSM ))) Longhorn is stable, I have been using it for a long time and very rarely there were any hallucinations. The only thing that I would like to improve is to increase performance and make it a complete analog of the file system, that is, so that applications can delete data.

@aleksey005 I mean, stable for my needs. For example, currently I need to automate somehow auto-mount of all Longhorn's block devices to FS of nodes. If you have any tips doing this, will appreciate any tips from you.

@TemaSM why are you asking this question in a closed ish.  Open a new one or make a request for such functionality.  Culture comes first.

@TemaSM We don't support automatically mount the block device needed for Longhorn now. Feel free to create an issue for the enhancement so we can track it.


Use ACL for S3 Bucket Upload and Copy Operation

Fix D2IQ-70676 - AWS S3 Copy with (AccessDenied) when calling the Copy Object operation
Use ACL for S3 Bucket Upload and Copy Operation
This ACL is useful if the give permissions to S3 operations via ACL. The
x-amz- header is sent by adding this ACL to boto3 library.
There are two separate calls, upload and copy, both need to send the
ACL as indicated in the AWS Documentation.
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#object

When copying an object, you can preserve all metadata (default) or
specify new metadata. However, the ACL is not preserved and is set to
private for the user making the request. To override the default ACL
setting, specify a new ACL when generating a copy request. For more
information, see Using ACLs .

Corresponding DC/OS tickets (required)

D2IQ-70676 - AWS S3 Copy with (AccessDenied) when calling the Copy Object operation

@mesosphere-mergebot label ready for review

@mesosphere-mergebot changelog-not-required internal change.


Checking responders signatures

I propose adding check if responder arguments match the template fields. Now it's easy to introduce error by renaming
arguments while refactoring.
Since this feature is likely to use the heavy inspect module, it may be implemented in inspect_app, which
imports it anyway. Then inspect_app will additionally emit warnings if arguments mismatch.
Also for type-annotated arguments it may be useful to check if type matches the field converter type.
fields = get_route_fields()
responder = get_route_responder()

req, resp, *args  = inspect.signature(responder).values()

for field, arg in zip(fields, args):
    check_arg(field, arg)
    check_anno(field, arg.annotation)

Hi,
I think this feature makes sense.
I think it may be done while adding the routes by the router (or the app), since that's is an "offline" phase where it's likely fine to execute a few more operations to check that everything works correctly.
This could probably be a configuration in the router config (or the app config?) where we have something like off | warn | error (maybe log too??)

For the annotations part, see also #2408 that I've just filed.


Cannot display colors with watch

Description
dysk never outputs color with watch -c.
I'd expect this usage to be possible with --color yes (or force?).
steps to reproduce

use watch -c dysk --color yes

expected the output is colored
actual output is not colored.
additional info
Some tools behaves this way. Ex the crate dua  does output colors  when executing watch -c dua.

This is weird. It looks like watch removes the color, I have no idea why.
Try this:
dysk --color yes > colored

Then you can check the output is colored with
cat colored

But if you do
 watch -c cat colored

then there's no color.

I also checked there's no problem with neowatch.

watch + dua do work though. No idea what's going on 😆
Thanks for neowatch! I didnt know this one.


Update ManagedZone Docs

The ManagedZone docs at docs/how-to/managedZone.md (website link) do not currently provide information on the dnsProviderSecretRef block.

This issue is stale because it has been open for 60 days with no activity.


Updated tests, switch submodule to current master

new test to ensure pr https://github.com/duckdb/duckdb/pull/5433 works properly.
Also switch the submodule to duckdb master

Merged before the build even passed? :/

@Mause the tests pass on the feature branch. The arrow extension is currently not really in a working state due to disabling the replacement scan feature before the 0.6.0 release. I will open a PR on main duckdb repo with the updated git from this merge. To merge that we will first wait on the ci of this merge to pass.

That cyclical dependency is not fun

Nope its not, we are working on that


Update DeveloperGuide formatting

Codecov Report
Base: 70.77% // Head: 70.77% // No change to project coverage :thumbsup:

Coverage data is based on head (4752890) compared to base (ed5cd5c).
Patch has no changes to coverable lines.

Additional details and impacted files
@@            Coverage Diff            @@
##             master     #106   +/-   ##
=========================================
  Coverage     70.77%   70.77%
  Complexity      391      391
=========================================
  Files            71       71
  Lines          1249     1249
  Branches        123      123
=========================================
  Hits            884      884
  Misses          324      324
  Partials         41       41

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


Unable to install packages inside container using apt

Hello,
I am using repo to some development around RISCV, and thank you so much for this.
However when i am running container and using apt to install any package inside container am getting this :
Get:194 http://deb.debian.org/debian-ports unstable/main riscv64 libidn12 riscv64 1.38-4 [81.7 kB]
Get:195 http://deb.debian.org/debian-ports unstable/main riscv64 libijs-0.35 riscv64 0.35-15 [15.1 kB]
Get:196 http://deb.debian.org/debian-ports unstable/main riscv64 libjbig2dec0 riscv64 0.19-3 [61.9 kB]
Get:197 http://deb.debian.org/debian-ports unstable/main riscv64 liblcms2-2 riscv64 2.12~rc1-2 [136 kB]
Err:198 http://deb.debian.org/debian-ports unstable/main riscv64 libopenjp2-7 riscv64 2.4.0-3
  404  Not Found [IP: <IP_ADDRESS> 80]
Err:199 http://deb.debian.org/debian-ports unstable/main riscv64 libgs9 riscv64 9.54.0~dfsg-5
  404  Not Found [IP: <IP_ADDRESS> 80]
Get:200 http://deb.debian.org/debian-ports unstable/main riscv64 libwoff1 riscv64 1.0.2-1 [42.7 kB]
Err:201 http://deb.debian.org/debian-ports unstable/main riscv64 dvisvgm riscv64 2.12-3

I am assuming this is because container is unable to reach the debian repo but my other containers are working fine and have access to internet. It will be great help if you could give some inputs.
Thank you

2 guesses:

you haven't run apt update first to get the latest package list?
Installing packages that just aren't available on RISC-V architecture yet.

Trying to install other packages that have been ported to RISC-V do install fine. I just created a new instance from DockerHub and ran the following.
root@debian:~# apt update
root@debian:~# apt install screenfetch
...
Get:1 http://deb.debian.org/debian-ports unstable/main riscv64 libc6 riscv64 2.33-7 [2491 kB]
Get:2 http://deb.debian.org/debian-ports unstable/main riscv64 libc-bin riscv64 2.33-7 [749 kB]
Get:3 http://deb.debian.org/debian-ports unstable/main riscv64 pci.ids all 0.0~2022.01.22-1 [232 kB]
Get:4 http://deb.debian.org/debian-ports unstable/main riscv64 libpci3 riscv64 1:3.7.0-6 [58.5 kB]
Get:5 http://deb.debian.org/debian-ports unstable/main riscv64 pciutils riscv64 1:3.7.0-6 [94.5 kB]
...
Setting up screenfetch (3.9.1+20210523-1) ...
Processing triggers for libc-bin (2.33-7) ...

root@debian:~# screenfetch
         _,met$$$$$gg.           root@debian
      ,g$$$$$$$$$$$$$$$P.        OS: Debian
    ,g$$P""       """Y$$.".      Kernel: riscv64 Linux 5.15.0-2-riscv64
   ,$$P'              `$$$.      Uptime: 7m
  ',$$P       ,ggs.     `$$b:    Packages: 202
  `d$$'     ,$P"'   .    $$$     Shell: bash 5.1.12
   $$P      d$'     ,    $$P     Disk: 1.3G / 11G (13%)
   $$:      $$.   -    ,d$$'     CPU: 2x Unknown
   $$\;      Y$b._   _,d$P'      RAM: 146MiB / 1961MiB
...

I am not sure what was the issue, actually there was no internet inside container I fixed it, when i rebuilt my qemu.
Thanks anyway :) closing this.


Implement LocalStorage Wrapper with versioning to prevent outdated data

For some reason the apps "change view" button in the menu shows up in the development environment but not when hosted on github.io (weird stuff)

Stefan: Ooh, figured it out why it's not showing up on my browser:
page-mode was changed at some point, but the localStorage of the browser still has the outdated one. Deleting your localStorage would work.
 export const PageMode = useStorage<PageModes>("page-mode", "participant");

(And if we absolutely want to prevent that issue in the future, we could write our own localStorage wrapper with versions and migrations. Up to you to decide if that's worth it.)


Native Federation: routing inside a remote MFE

I am trying to setup a micro frontends application with Native Federation and Angular 17 without SSR, with standalone components.
I could create the main architecture with the shell and different MFEs. I would like to know how to manage properly routing inside a MFE, as I cannot find a lot of documentation about it.
Here my repository so far:
https://github.com/alaindeurveilher/ng-mfe-app-starter/tree/starter-routing
In this starter project, the mfe2 project needs to navigate between ‘page1’ and ‘page2’, as defined in its own app.routes.ts:
export const routes: Routes = [
  { path: 'page1', component: Page1Component },
  { path: 'page2', component: Page2Component },
];

When I am in development mode of mfe2, ie serving mfe2 only, the routing works fine, I can navigate between the different pages.
But when I am navigating in mfe2 from the shell, the shell routing falls back to not-found route:
export const routes: Routes = [
  { path: '', component: HomeComponent, pathMatch: 'full' },
  { path: 'mfe1', loadComponent: () => loadRemoteModule('mfe1', './Component').then((m) => m.AppComponent) },
  { path: 'mfe2', loadComponent: () => loadRemoteModule('mfe2', './Component').then((m) => m.AppComponent) },
  { path: '**', component: NotFoundComponent },
  // DO NOT insert routes after this one.
  // { path:'**', ...} needs to be the LAST one.
];

My question is how to handle routing in a mfe so that it is both working in development (i.e. mfe only) and in production (i.e. in the shell).
Thank you.

Hello,
So I managed to make routing work in both the remote and the shell by using a @NgModule in the mfe project and exposing it to the shell.
Everything I did is documented here:
https://github.com/alaindeurveilher/ng-mfe-app-starter/tree/with-routing-2?tab=readme-ov-file#add-routing-navigation-inside-a-remote
In short, I first created a module, and declared the routing like so in the main-routing.module.ts:
const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    title: 'MFE2',
    children: [
      { path: 'page1', component: Page1Component, title: 'MFE2 | Page 1' },
      { path: 'page2', component: Page2Component, title: 'MFE2 | Page 2' },
    ],
  },
];

In my MFE, I use relative navigation. Doing so allows the app to be running in isolation and also inside the shell.
In the nav component of the mfe:

  Page 1
  Page 2

Then, I expose the module in federation:
// ... beginning of the file untouched
module.exports = withNativeFederation({
  name: 'mfe2',
  exposes: {
    './Component': './projects/mfe2/src/app/app.component.ts',
    // Add the following line to expose the module:
    './Module': './projects/mfe2/src/app/main.module.ts',
  },

  // ... rest of the file untouched
});

Then, in the shell routing configuration, I load the module instead of a component:
export const routes: Routes = [
  { path: '', component: HomeComponent, pathMatch: 'full', title: 'Shell' },
  { path: 'mfe1', loadComponent: () => loadRemoteModule('mfe1', './Component').then((m) => m.AppComponent), title: 'MFE 1' },
  // Update for mfe2: use loadChildren instead of loadComponent, and load the './Module' and m.MainModule instead of the ./Component:
  { path: 'mfe2', loadChildren: () => loadRemoteModule('mfe2', './Module').then((m) => m.MainModule), title: 'MFE 2' },
  { path: '**', component: NotFoundComponent, title: 'Page Not Found' },
  // DO NOT insert routes after this one.
  // { path:'**', ...} needs to be the LAST one.
];

I have the same question.Version 17.2 of angular.

Thanks for your document.
https://github.com/alaindeurveilher/ng-mfe-app-starter/tree/with-routing-2?tab=readme-ov-file#add-routing-navigation-inside-a-remote

Another way is to expose your Routes. Doing so enforces use of standalone API. Therefore no NgModule is required.
Perhaps for the purists among us 😉

Do you have like a small demo about it maybe for me to fully grasp the principle?
Thank you ☺

Hi @alaindeurveilher
I uploaded an example at https://github.com/R4ZuL/native-federation-poc. Maybe it's helpful.

Hi @alaindeurveilher
I uploaded an example at https://github.com/R4ZuL/native-federation-poc. Maybe it's helpful.

That worked perfectly! Thank you! 👌

I close this issue since it is now answered.


Discussion: Anchor is valid rule used in Create React App

From a discussion I had with @gaearon.
Currently this rule is activated in Create React App. Which does a lot of good. However, due to the reach of the CLI tool it can sometimes cause confusion for developers who want to upgrade to newer versions. Developers lacking the a11y knowledge who suddenly get confronted by new errors on the console.
For example: https://github.com/facebook/create-react-app/issues/4141
I want to make a PR proposal to update the docs and, possibly, the error message of this rule to assist these developers to easily find the information in question.
But first I want to know how you feel about such a change.
Consider the situation where a developer HAS to have a clickable thing look like an anchor due to design forced upon them, would it be OK to add a paragraph in the docs on how to style a button to look like a link? I know that ideally we would not want that but what is happening now is that developers facing this situation just suppress the rule. Where instead a button element styled as a link would be a large improvement already instead of an anchor without an href.
Also the PR would suggested to change the error message of the noHref aspect to something along the lines of:
"The href attribute requires a valid value for the link to be keyboard accessible. Provide a valid, navigable address as the href value. Alternatively, change it to a  with appropriate styles. Learn more: "
Please let me know what you think. As I said this rule is activated in every react app started with Create React App and could go a long way to help with education.

I think better documentation is always better, and as long as they stress very heavily that such designs are subpar (giving devs ample ability to push back on design with an authoritative reference), providing instructions of how to have proper semantic elements with the aesthetics they’re required to impose seems like a much better outcome than having them disable the rule.

Awesome, I will come up with a PR asap.

PR in at #486

Fixed in #486

v6.1.2 published


[Bug] [Module Name] Bug title "Request error Rex Test connect Failure!No module named 'pymssql'"

Search before asking

[X] I had searched in the issues and found no similar issues.

Operating system information
Windows
Python version information
3.10
DB-GPT version
main
Related scenes

[ ] Chat Data
[ ] Chat Excel
[X] Chat DB
[ ] Chat Knowledge
[ ] Model Management
[ ] Dashboard
[ ] Plugins

Installation Information

[X] Installation From Source

[ ] Docker Installation

[ ] Docker Compose Installation

[ ] Cluster Installation

[ ] AutoDL Image

[ ] Other

Device information
CPU
Models information
DB-GPT\models\Qwen-14B-Chat-Int4

What happened
I configured the DB source as MS Sqlserver and save it got these errors.
Request error
Rex Test connect Failure!No module named 'pymssql'
What you expected to happen
How to fix it
How to reproduce
Just try to add MS SQL as data source
Additional context
No response
Are you willing to submit PR?

[ ] Yes I am willing to submit a PR!

Here are the error alert


Refactor app and model

This MR reconsiders model status in the constance application.
In current state model Constance does not belong to application constance - it belongs to application database.
This have several issues:

Impossible to support content type and permission management via Django build-in functions.
ConstanceConfig contains code to create them manually. Django does it automatically.
Build-in cleaner of stale content types ./manage.py remove_stale_contenttypes --include-stale-apps removes manually created permissions and content types

https://github.com/jazzband/django-constance/issues/454
My PR fixes it

Different import errors which some users get.
https://github.com/jazzband/django-constance/issues/452
Such issues would go away.

Enables Django build-in database routing to work by default
https://github.com/jazzband/django-constance/issues/414
https://github.com/jazzband/django-constance/issues/376

What changes?
Database table would always be created. It would be empty if DatabaseBackend is not used.
Migration on new table would be automatic for new and old installations.
Django is carp enough for model to be attached to application. django-constance is rather old application and earlier it was not so strict.
This PR is draft. It is working example with code refactoring tested on 2 projects and postgres database.
If my refactoring can be accepted I would add documentation, release notes about migration and will test on sqlite, mysql and postgres carefully.
I am open to discuss MR

Hello @Mogost !
Review please =)

Hello @Mogost !
Sorry for so long review fixes. Now everything is saved: table, permissions, content types.

@jazzband/django-constance Please help to review

Does this mean there's no meow database backend for constance?
I upgraded from 2.9.1 and I'm unable to get it to work.
When I try to install django-constance[database] I get:
WARNING: django-constance 3.1.0 does not provide the extra 'database'
When I try to run, I get:
    from constance.backends.database.models import Constance ModuleNotFoundError: No module named 'constance.backends.database.models'; 'constance.backends.database' is not a package

@SpecialK118 Hello) install just via pip install django-constance.
'constance.backends.database' should be removed from INSTALLED_APPS
Changes are described in changelog


Add Health field to Slab

Slabs returned through the API now contain their latest computed health. That way the UI doesn't need to compute the health on the client-side anymore and instead it is consistent with the health the autopilot uses for migrations.

🥳


message about python-dateutil<2.7.0 appearing

the message:
(python-dateutil 2.8.1 (c:\users\user\kimonix\kimonix-be-venv\lib\site-packages), Requirement.parse('python-dateutil<2.7.0'), {'zappa'})
appears in several accations
I use python-dateutil==2.8.1 and everything works fine and I use a lot of zappa functionality.
can the requirement be upgraded to newer version of python-dateutil?
tnx

Looks like master already depends on 2.8: https://github.com/Miserlou/Zappa/blob/0c8d99ddbc297124d93c166652013abba50ee86e/requirements.txt#L23
Maybe it just needs to be released?

0.51, the most recent release has this:
https://github.com/Miserlou/Zappa/blob/80a6881f0ec0be525a8fd7835b5a1157f9e66100/requirements.txt#L24


Fix typescript compile error with strictNullChecks enabled

Fixes error compile error with 'strictNullChecks' enabled in typescript by declaring the [x: string] accessor as being possibly undefined (see #3599).

Dupe #3591. Sorry about that.


Flutter Windows app - .lock and .hive file location

Hi,
We are using Hive in our Flutter application for Windows.
The .lock and .hive files are stored in the /Documents folder on the Windows machine.
Is there a possibility to store it in another location? E.g. appdata or somewhere else?
Thanks!
Kind regards,
Timo

This is what I came up with.
  if (GetPlatform.isWindows) {
    await Hive.initFlutter("someSubfolder");
  } else {
    await Hive.initFlutter();
  }


fix(menububble): Don't crash on missing extensions

:tada: This PR is included in version 1.5.0 :tada:
The release is available on:

GitHub release
npm package (@latest dist-tag)

Your semantic-release bot :package::rocket:


SaveChangesAsync() sometimes throws erros if in a method that is not awaited

Hi team,
I have:

VS2015U2
MVC 6 website
that targets DNX 1.0.0-rc1-update2
reference to EF 1.0.0-rc1-final

I've implemented 2 classes similar to these below:
public class MyService
  {
    private readonly ApplicationDbContext _dbContext;

    public MyService(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task SaveAsync(int myInt)
    {
        _dbContext.ObjectDataSet.Add(myInt);
        await _dbContext.SaveChangesAsync(); //<< THIS IS THE FAULTY LINE
    }
}

and
public class MyService2
{
  private readonly ApplicationDbContext _dbContext;

  public MyService2(ApplicationDbContext dbContext)
  {
     _dbContext = dbContext;
  }

  public async Task<string> GetAsync()
  {
     MyService s1= new MyService(_dbContext);
     s1.SaveAsync(123); // Intentionally not await-ed
     return "123";
  }
}

and a MVC controller:
public class MyController : Controller
{
  [FromServices]
  public MyService2 s2{ get; set; }

  [HttpGet()]
  public async Task<IActionResult> Get() {
     return
        Json(
           await s2.GetAsync());
  }
}

When I load the page in the browser I get behavior that varies:

Sometimes it runs without errors
Sometimes I get InvalidOperation exception: The requested operation cannot be completed because the connection has been broken.
Sometimes I get TaskCancelledException: A task was canceled.

When I write "await" in front of the line
s1.SaveAcync(123);  // Intentionally not await-ed
I get no errors.
P.S. Sorry for the long example but I couldn't isolate it more.

Async... without awaiting, your async methods will not hold up your threads, meaning the next portions of your code will execute without pausing... when your code is executing portions that depend on other portions  that that haven't finished executing yet, you get a Race Condition. Race Conditions are one of the reasons people not used to async should be wary.

@f0rt TL;DR: You will have to await.
You may need to change your expectations on what async support on EF Core (or EF6 for that matter)is about: for applications executing on a server is actually about improving scalability by freeing up threads when they would otherwise have to wait idle for database operations to complete. It doesn't mean that you can "fire and forget" async operations so that they can complete in any order independent of the lifetime of the DbContext and the underlying database connection. In general you have to await for any individual task that you initiate on a DbContext so that all operations occur in the same sequence that they would normally occur if you were not using async.
In the particular case of this code:
  public async Task<string> GetAsync()
  {
     MyService s1= new MyService(_dbContext);
     s1.SaveAsync(123); // Intentionally not await-ed
     return "123";
  }

What I would expect is that SaveAsync() would initiate and maintain control of the thread until the first I/O operation occurs that returns a Task that is not already completed. When the latter happens control will be yield to the next line return "123" (you made the GetAsync()async but didn't put any await in it. Next the controller operation will finish and the controller instance be freed up and the DI scope of the request will get disposed, at which point anyIDisposablescoped services you used in the controller, including theDbContextwill get disposed. The latter will cause the underlyingDbConnectionto be disposed as well, very likely before the async operations originally initiated bySaveChangesAsync()` can be completed.
You are getting different results because you have introduced a race condition. I.e. depending on how fast the async operations get completed you may be in different stages of finishing the request.

Thank you very much for the fast response. I suspected something like this but wanted to check that with you. It sound very clear now when you explain but I couldn't find anything in the net for that. Maybe it will be a good idea to mention that "Always await for awaitable DB operations" in the documentation. I've actually spent a a couple of hours debugging this on a azure website. You know debugging experience on azure website is not very fun (yet). :)

Or better yet, you can learn how to properly utilize Async
https://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx

Triage: I agree with @f0rt that thus is a topic we should add in the documentation if we don't have it already.

Added note to https://github.com/aspnet/EntityFramework.Docs/issues/158 to ensure we doc this when we do query docs


Fix error message when team doesn't exist

@zapu good catch, and thanks for the bisect which made it easy to figure out! This brings those errors back to how to they were before.
The behavior changed because that commit introduced this forgotten error check, so the not found error occurred higher up.
https://github.com/keybase/client/commit/3d20ae30c0f5c710898368a9f9ca40e5ca7b40c5#diff-4f4e4469548562dee434def94bc09a41R249

that was quick! works perfectly on my test accounts now, thanks


Cannot download pretrained model checkpoints

Cannot connect to download.cs.stanford.edu/orion/humor/checkpoints.zip

@xymsh Looks like Stanford will be without power for several days. The files are on their servers, so it's unlikely they will be able to transfer to 3rd party cloud storage. Let's hope they get things under control in Edgewood.

@xymsh @VisionaryMind the servers are back up and download should be working again.


Failed to init on windows 11 23H2

Error from log:
12:35:43.3464+02:00 - ERROR - PluginManager.InitializePluginsAsync - Fail to Init plugin: Window Walker
EXCEPTION OCCURS: System.Runtime.InteropServices.COMException (0x8002802B): Element not found. (0x8002802B (TYPE_E_ELEMENTNOTFOUND))
   at IVirtualDesktop Flow.Plugin.WindowWalker.Components.COM.IVirtualDesktopManagerInternal.FindDesktop(ref Guid desktopid)
   at VDesktop Flow.Plugin.WindowWalker.Components.VirtualDesktopHelper.CreateVDesktopInstance(Guid desktop, IntPtr hWindow) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/VirtualDesktopHelper.cs:line 596
   at VDesktop Flow.Plugin.WindowWalker.Components.VirtualDesktopHelper.GetWindowDesktop(IntPtr hWindow) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/VirtualDesktopHelper.cs:line 353
   at new Flow.Plugin.WindowWalker.Components.Window(IntPtr hwnd) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/Window.cs:line 137
   at bool Flow.Plugin.WindowWalker.Components.OpenWindows.WindowEnumerationCallBack(IntPtr hwnd, IntPtr lParam) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/OpenWindows.cs:line 103
   at int Flow.Plugin.WindowWalker.Components.NativeMethods.EnumWindows(EnumWindowsProc callPtr, int lPar)
   at void Flow.Plugin.WindowWalker.Components.OpenWindows.UpdateOpenWindowsList() in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/OpenWindows.cs:line 68
   at void Flow.Plugin.WindowWalker.Main.Init(PluginInitContext context) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Main.cs:line 133
   at Task Flow.Launcher.Plugin.IPlugin.Flow.Launcher.Plugin.IAsyncPlugin.InitAsync(PluginInitContext context)+() => { } in /_/Flow.Launcher.Plugin/Interfaces/IPlugin.cs:line 33
   at async Task<long> Flow.Launcher.Infrastructure.Stopwatch.DebugAsync(string message, Func<Task> action) in C:/projects/flow-launcher/Flow.Launcher.Infrastructure/Stopwatch.cs:line 34
   at async Task Flow.Launcher.Core.Plugin.PluginManager.InitializePluginsAsync(IPublicAPI api)+(?) => { } in C:/projects/flow-launcher/Flow.Launcher.Core/Plugin/PluginManager.cs:line 127

I get the same error message with a slightly different log entry:
15:21:48.7528+01:00 - ERROR - PluginManager.InitializePluginsAsync - Fail to Init plugin: Window Walker
EXCEPTION OCCURS: System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type 'Flow.Plugin.WindowWalker.Components.COM.IVirtualDesktop'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{536D3495-B208-4CC9-AE26-DE8111275BF8}' failed due to the following error: Schnittstelle nicht unterstützt (0x80004002 (E_NOINTERFACE)).
   at object System.StubHelpers.InterfaceMarshaler.ConvertToManaged(ref IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, int flags)
   at IVirtualDesktop Flow.Plugin.WindowWalker.Components.COM.IVirtualDesktopManagerInternal.FindDesktop(ref Guid desktopid)
   at VDesktop Flow.Plugin.WindowWalker.Components.VirtualDesktopHelper.CreateVDesktopInstance(Guid desktop, IntPtr hWindow) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/VirtualDesktopHelper.cs:line 596
   at VDesktop Flow.Plugin.WindowWalker.Components.VirtualDesktopHelper.GetWindowDesktop(IntPtr hWindow) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/VirtualDesktopHelper.cs:line 353
   at new Flow.Plugin.WindowWalker.Components.Window(IntPtr hwnd) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/Window.cs:line 137
   at bool Flow.Plugin.WindowWalker.Components.OpenWindows.WindowEnumerationCallBack(IntPtr hwnd, IntPtr lParam) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/OpenWindows.cs:line 103
   at int Flow.Plugin.WindowWalker.Components.NativeMethods.EnumWindows(EnumWindowsProc callPtr, int lPar)
   at void Flow.Plugin.WindowWalker.Components.OpenWindows.UpdateOpenWindowsList() in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Components/OpenWindows.cs:line 68
   at void Flow.Plugin.WindowWalker.Main.Init(PluginInitContext context) in D:/a/Flow.Plugin.WindowWalker/Flow.Plugin.WindowWalker/Main.cs:line 133
   at Task Flow.Launcher.Plugin.IPlugin.Flow.Launcher.Plugin.IAsyncPlugin.InitAsync(PluginInitContext context)+() => { } in /_/Flow.Launcher.Plugin/Interfaces/IPlugin.cs:line 33
   at async Task<long> Flow.Launcher.Infrastructure.Stopwatch.DebugAsync(string message, Func<Task> action) in C:/projects/flow-launcher/Flow.Launcher.Infrastructure/Stopwatch.cs:line 34
   at async Task Flow.Launcher.Core.Plugin.PluginManager.InitializePluginsAsync(IPublicAPI api)+(?) => { } in C:/projects/flow-launcher/Flow.Launcher.Core/Plugin/PluginManager.cs:line 127

This might be two different errors. I will disable the virtual desktop internal for 23h2.

Could you guys paste the windows version number?

for me its 23H2 (Build 22631.3007)

same for me, 10.0.22631.3007

I am curious is that insider? or just 23H2

This should not be insider.

Not insider, just regular 23H2

Let's disable that part of feature for now. I don't have much time recently to reliable figure out how to reliable create instance as different windows number seems to have different COM object.

What part of the feature would we be missing then? Just to have the right expectations and avoid opening the next issues.

Moving app around desktop

well it's new feature anyway


update gh actions

Why? Is there an advantage?

Why? Is there an advantage?

Speed improvements in the upload-artifact based on their changelog, node20 used instead of 16 in setup-python. Up 2 you if you want to merge


Save successfully used tokens & allow tokens to be passed in as an env var

Would be great if successfully using a token caused it to be saved locally. Currently, tokens are only saved locally when subo compute create token is used.
Also having an option of passing in the token as an env var (maybe expecting it as a base64 encoded secret) for infra-as-code, playbook and debugging purposes would be great as well.

@denopink Kindly shared more feedback on this with us at the docs meeting this morning! Here's a summary:

If you need to request a new token there’s a cascading effect/loop
Discord discussion about this

This is related to docs Issue #103.
Also @cohix can we edit the email sent to a user when their token in generated to remind them to store it in a password manager?


test(query): validate more than 2 values for key

Code coverage:
Added test to cover following uncovered code block.
https://github.com/unjs/ufo/blob/aa6d406587eafab106fa2cbee7406605903b02a7/src/query.ts#L50-L52

can you please add a test to cover this? 🙏🏼


Global HTTP to HTTPS redirection port is not configurable and redirects to unwanted port

Enabling global HTTP to HTTPS (web to websecure) redirects to default port configured in chart for websecure which is 8443.
I see that there is Middleware option for Redirect port configuration.
Is it possible to have CLI flag too?
That will make configuration lightweight, working out of the box and prevent the creation of Middleware objects.
Something like: --entrypoints.web.http.redirections.port=32443

My setup:
traefik 2.2.0 on KubernetesCRD on bare-metal
Installed using official helm chart
config
image:
  tag: 2.2.0
service:
  type: NodePort
ports:
  web:
    nodePort: 32080
  websecure:
    nodePort: 32443
  # for lab purposes
  traefik:
    expose: true
    nodePort: 32666
additionalArguments:
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https

Hello,
https://docs.traefik.io/v2.2/routing/entrypoints/#entrypoint

my fault. didn't read docs carefully, though visited that page a hundred times.


silent failure in auto-promotion logic

Wish I'd logged this issue sooner...
Last week I encountered a silent failure in the auto-promotion logic. If I recall correctly, it was here: https://github.com/akuity/kargo/blob/main/internal/controller/environments/environments.go#L471
Again, iirc, there was a failure listing existing PromotionPolicies and the error was surfaced in neither Environment status nor the controller logs, which led me to incur extra effort in determining why an expected auto-promotion did not occur.
I'd label this as a good first issue, but since I'm a little fuzzy on the details here, I will take this issue myself.

I have not seen this issue recur in the last three months and all my attempts to identify where it might have been haven't yielded anything. Closing.


Responsive Mobile Calander

Calendar on mobile need scrolling around to view all the content. It will be better experience if it is redesigned to fit the page.

I tried this a bit while designing it, but I couldn't get anything that looked good without being too squashed (some phones are very small...). I guess we could make the font size smaller on the calendar but then it might be too small for some people, so it's a tricky one. Open to any ideas though


Update GitHub templates like Qiskit Terra

Summary
Update GitHub templates like Qiskit Terra.

In making the bug report and issue files common there is this line:
"Qiskit (Python SDK) version"
This used to say just version; and all the code in Aqua is Python. People may end up reporting the qiskit-terra version (ie the current qiskit pkg) and not the Aqua version which was the intent

@woodsp-ibm we can (and must) adapt the template to the Aqua project.
What do you think about replace:
- **Qiskit (Python SDK) version**:
To:
- **Qiskit Aqua version**:

Qiskit Aqua version is fine. Something more generic would have allowed the template to be propagated around the qiskit repos without change. When they are tailored to each repo then its evidently more work should they need updating.

Updated!


Fix implicit priority issues with UnaryTCConstraint, allowing better inference of type constructor

I noticed this issue when writing isequence here: https://gist.github.com/mpilquist/ba9a9fc522a2ed0a0a7b#file-inv-scala-L26-L32
In order for F param to be inferred, I had to define the implicit constraint after the the InvariantMonoidal[F] parameter. With this change, the order should be irrelevant (though I haven't tested that).

Many thanks ... merging :-)


attr type "File" cant see/delete uploaded files

i created module with entity type flat
and created field with type File
file uploads, and is stored in media dir, list works,
but i can't see uploaded files anywere while editing i can upload new file and that's all

@marcin-derlukiewicz  When editing you entity you should see a filename and a link below the upload input.
If you don't see it, you either did not upload any file or for some reason the file was not uploaded (too big maybe). Also check in your table to see if the column that corresponds to the file input has a value.

I'm closing this as cannot reproduce it and there was not response from the OP in more than 1 month.


Remove equal sign on verifychanbackup cmd argument

This is specifically on multi_file argument description

@grunch can you rebase on latest master? i think two of the three lines were already fixed by #2888


Keyboard Layouts that rely on deadkeys are not working properly

If you try to use any Layout that does:
' ` ' + ' a ' = ' à '
or
' ' ' + ' c ' = ' ç '
Lapce doesn't register the deadkey press.
I tried this on Linux (Manjaro KDE) and Windows 10 both show the same behavior.
A workaround for is to add a Layout with does not rely on deadkeys. In my case I switched from US International alt.  to  US International.

It seems the issue is not for all Layouts with deadkeys rather it seems to be related to the layout available to my language (Brazilian Portuguese)

I have the same issue running a qwerty-lafayette on OSX  Monterey (not m1)
I can’t really work with anything else as it’s really outside of what other layouts can bring.


Internal error classes.

Output internal error classes that was not caused by the user's valid inputs onto API calls. This will help with tracking issues.

Can you give an example of what this would look like. I don't understand the description

Like are you saying to catch any errors not raised directly by the API? If so, that should be done explicitly by the user when using qcpy -- or that error will need to be prevented from being raised in the first place. Idk if that is what you are trying to describe though. Just my thoughts

Apologies meant to say valid inputs. As the project gets bigger and more components will be at play, if something breaks that is not supposed to happen unit tests might not cover it. It would be wise to have it alert the user it is not their fault and they can report it if they wish.


[Flink-7871] [flip6] SlotPool should release unused slots to RM

What is the purpose of the change

This pull request makes SlotPool release unused slots back to RM if the slots is idle for some time

Brief change log

Add a TimerService in SlotPool
Each available slot will register a timer in TimerService, and will unregister when the slot is removed or becomes allocated
If timeout happened, the slot will be released by notifying TM
Add notifySlotUnused method in TaskExecutorGateway
Make some fixed params configurable in SlotPool

Verifying this change
This change added tests in AvailableSlotsTest
Does this pull request potentially affect one of the following parts:

Dependencies (does it add or upgrade a dependency): (no)
The public API, i.e., is any changed class annotated with @Public(Evolving): (no, but add a new @Public(Evolving) class SlotOptions)
The serializers: (no)
The runtime per-record code paths (performance sensitive): (no)
Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Yarn/Mesos, ZooKeeper: (no)
The S3 file system connector: (no)

Documentation

Does this pull request introduce a new feature? (no)
If yes, how is the feature documented? (not applicable)

Hi Till, thank you for reviewing.
I agree that it is much simpler to use scheduleRunAsync.
PR-5091 is not a small reworking. But it looks really great to me. Will rebase it and address comments in a few days.

Thanks a lot @ifndef-SleePy.

Hi @tillrohrmann , I just updated the PR, sorry for delaying so long.


Adding support for focus and blur

In reading through the docs i see you have the usual problem with blur and focus event's not bubbling.
These events are useful, especially in keyboard accessibility for drawing a clear focus indicator (though perhaps CSS support is better now). Also they are often required for keyboard access in custom controls.
We can't use the bubbling focusin focusout until Firefox supports them, see https://bugzilla.mozilla.org/show_bug.cgi?id=687787
A common approach is to use a capturing handler to get the event earlier - eg http://yuiblog.com/blog/2008/10/07/onfocus-onblur/

You can use focusin and focusout everywhere thanks to jQuery. We recommend using those instead of focus and blur.
We aren't going to add support for any non-bubbling events as we don't want to start hacking in custom events flows.

OK.
Thanks for the tip. You should update the docs to suggest this.
That gives a dependency on jQuery but I see you already have that.
I don't use jQuery much but agree it is good for browser abstraction. Is bulky so might try Zepto.

Yup, we have #32 to update the docs. You should be able to use Zepto without any issues.


check for empty strings and avoid downloading them as well

this stops downloading non existent images
earlier was only checking null. should check empty strings too.
please check and merge @aayusharora
Signed-off-by: Arnav Gupta<EMAIL_ADDRESS>

Current coverage is 51.74% (diff: 100%)

Merging #561 into development will not change coverage

@@           development       #561   diff @@
=============================================
  Files                5          5
  Lines              516        516
  Methods             48         48
  Messages             0          0
  Branches            73         73
=============================================
  Hits               267        267
  Misses             249        249
  Partials             0          0

Powered by Codecov. Last update f1d70b4...e03b9a0


Include mention of Microsoft.AspNetCore.ApiAuthorization.IdentityServer nuget package.

Despite being titled "Authentication and authorization for SPAs" the information seems generally relevant to API authorization whether using an SPA or not. In either case, a reference to the templates' reliance on Microsoft.AspNetCore.ApiAuthorization.IdentityServer for the important extension methods (AddApiAuthorization, AddIdentityServerJwt) outlined in the Startup class would be useful knowledge for someone not relying on templates, or attempting to integrate simple api authorization into an existing application.
I'd propose something similar to pr #18685 for issue #18538, or something similar to the wording here for the nuget reference used in the Worker service template.  If you'd accept a pr on this, I'd be happy to contribute it.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 21cb7455-3305-9316-5440-bdc22947a82d
Version Independent ID: 137d4b94-7b26-3911-b22d-42c754a95fc1
Content: Introduction to authentication for Single Page Apps on ASP.NET Core
Content Source: aspnetcore/security/authentication/identity-api-authorization.md
Product: aspnet-core
Technology: aspnetcore-security
GitHub Login: @javiercn
Microsoft Alias: scaddie

@stevebelskie  a PR would be appreciated.


Can we have the support even for grazie_graziella_grazieastocazzo?

...and graziealcazzo as well!
Thank you

Hello!
I have sent a Pull Request for this!
https://github.com/dottorblaster/stocazzo/pull/40
Enjoy!


hub browse opens fork url instead of main repo

Scenario:
I'm on a custom branch (pushed to my fork) in a repo with two remotes: origin pointing to the authoritative repo, and fork, pointing to my fork.
Actual behavior:
When entering hub browse it opens the forked repo page in the browser.
Expected:
In 99 out of 100 cases I am not interested in my fork, but expect to see the main repo.
I understand this may be the current "expected" default behavior, however it would be much more logical to do something along the lines:
hub browse -> Open main repo
hub browse -f or hub browse --fork -> Open forked repo
Since all my remote names for the respective authoritative repository are called origin, it would also be okay to have something like hub browse origin as a predictable and guaranteed way to open the "main" repo GitHub page in the browser.
Related: #1671

I second this, can this please be taken into consideration?

Hi thank you for writing in.
Usually hub browse will open the repository indicated by the origin remote; it would only use fork if you are currently on the branch that is pushed to fork. This was the designed behavior for a long while now: https://github.com/github/hub/blob/08004b921836a3fa8ae6054ab273cdbf6da39f8c/features/browse.feature#L73-L79
I understand that this is inconvenient if you wanted to open origin instead, ignoring the current branch or where it's pushed. Right now, there is no way of achieving this with browse, and extending its functionality is not planned. browse suffers from a number of design flaws and instead of "fixing" it (and breaking backwards compatibility for whoever is using it right now), it's on our roadmap to replace it with a new command called hub open that will make it easier to navigate to branches, commits, and other objects will less magic behavior and in a more predictable manner.
But for now, I'm going to close this out for the sake of cleaning out the bug backlog, since I'm not sure what actionable item I can draw from this that would also keep backwards compatibility for current users of browse. If anyone has ideas, I welcome PRs!

Thanks for the explanation @mislav Looking forward to a more flexible and useful new command!


can't recover after deleting /var/lib/webmesh while running

If I delete /var/lib/webmesh by mistake while webmesh-node is running, I can't kill the node unless I use -9.
And if I start webmesh-node again, I get Error: failed to open mesh connection: join: fatal join error starting network manager: new wireguard: new interface: new tun: create tun: invalid argument.
I can start the node again if I run sudo ip link delete webmesh0.

So the second issue is a byproduct of the first issue. With a clean shutdown - it will attempt to remove the interface for you. There is the --wireguard.force-interface-name flag/config that will delete it on startup if it sees it. You can also customize the name of the interface. The Join error was it not caring what the kernel error was and trying to fall back to TUN, which I guess was not available wherever this was running.
I don't know exactly what that first issue was - but I'd be curious for logs. It feels pretty unavoidable, but maybe can at least make a clean exit happen. You took its data directory out from under it. On nodes where you don't care about persisting data locally you can use the --raft.in-memory flag.

Just tidying things up. Gonna close this issue for now. If you happen to think of any ways disappearing storage can be dealt with, feel free to open a new issue.
Worth noting, that I hope to revamp a lot of how the storage works in favor of a distributed implementation.