make check valt om op een bedorven build/test_cache, en de melding wijst naar de verkeerde test #798
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#798
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
make checkviel op 24-07-2026 twee keer om op een fout die niets met de genoemde test te maken heeft:Het is een fout bij het laden van een testbestand, niet bij het uitvoeren ervan. Het genoemde bestand verschilt per keer en is los altijd groen.
Waargenomen
test/render_page_serialisation_test.dart== OciDeck check: coverage ==test/privacy_dismissal_panel_test.dart== OciDeck check: coverage ==Allebei los gedraaid: groen. Allebei weg na
rm -rf build/test_cache, waarna dezelfdemake checkzonder wijziging groen liep.Wat het correleert
Zes volledige suiteruns op één dag, waarvan twee omgevallen. Beide voorvallen zaten in de
--coverage-fase. De vier runs die geen dekking meten bleven schoon:make test— schoonmake check-no-coverage— schoonmake checkdirect ná het legen van de cache — twee keer schoon (dus de dekkingsfase op zichzelf is niet genoeg)De gemene deler is dus niet "coverage" alleen en niet "een volle cache" alleen, maar de combinatie: de dekkingsfase op een cache die uit eerdere runs is meegedragen. Dat is een waarneming uit zes runs, geen bewezen oorzaak — de steekproef is te klein om
--coverageals noodzakelijke voorwaarde te verklaren.Wat die cache is
build/test_cache/build/<hash>.cache.dill.track.dill— de incrementele kernelcache dieflutter testzelf aanlegt. Niet iets wat deze repo instelt: er staat niets over inMakefile,dart_test.yamlofpubspec.yaml. Flutter 3.44.7-stable (de pin). Bij de laatste meting 119 MB.De foutmelding past bij het deserialiseren van bedorven of verouderde cachegegevens: een map waar een lijst werd verwacht.
Waarom dit meer is dan ruis
Niet omdat het vaak gebeurt, maar omdat de melding naar de verkeerde plek wijst. Wie dit voor het eerst ziet, gaat de genoemde test debuggen — die groen is. Dat is precies het patroon van #714 en #782: een kale uitzondering die de oorzaak niet noemt, waar hier bovenop komt dat het bestand dat hij wél noemt onschuldig is.
Er staat nu niets over in
docs/CHECKS.md; het zit alleen in de hoofden van wie het eerder heeft meegemaakt.Richtingen (open, niet voorgeschreven)
docs/CHECKS.mdbij de probleemoplossing — deze foutsignatuur betekent de cache, niet de test.make checkde signatuur laten herkennen en het advies afdrukken in plaats van de gebruiker het te laten uitzoeken. Wel oppassen dat dat geen echte laadfouten wegpoetst.make clean-test-cache-doel zodat het recept ergens vastligt in plaats van in een reactie.Blind
build/test_cacheweggooien vóór elke run lost het op en kost de incrementele compilatie — dat lijkt me de verkeerde ruil, maar het is een optie.Weging
Lage prioriteit: het blokkeert niets blijvend en het herstel is één opdracht. Wat het kost is de tijd van degene die het niet herkent, en dat is precies wat een regel documentatie wegneemt.
Opgepakt. Tak:
fix/testcache-laadfout-798.Ik neem je vier richtingen alle vier mee, en begin met de vierde omdat die de andere drie stuurt: waar komt die cast vandaan. Eerste bevinding uit de SDK zelf —
getDefaultCachedKernelPath(packages/flutter_tools/lib/src/bundle.dart) hasht alléén de dart-defines en de extra frontend-opties in de bestandsnaam. Niet de SDK-versie, nietpubspec.lock. Dezelfde<hash>.cache.dill.track.dillwordt dus hergebruikt over een Flutter-upgrade of een dependencywijziging heen. Dat is een mechanisme dat bij je waarneming past; of het jóuw twee voorvallen verklaart weet ik nog niet, en ik ga daar geen bewering over doen die ik niet kan tonen.Wat ik denk te raken:
Makefile(een opruimdoel plus signatuurherkenning die geen echte laadfout wegpoetst),docs/CHECKS.md(probleemoplossing — die sectie bestaat daar nu niet), en een poort intool/met een test, want de herkenning zelf moet aantoonbaar geen valse stilte veroorzaken.Gemerged:
31a5e430(PR #815), op main geverifieerd. Alle vier je richtingen zitten erin — en de vierde heeft de andere drie omgegooid: de cache is de verkeerde verdachte.De storing viel tijdens dit werk zélf, mét stack
In de dekkingsfase, op
test/import/snappy_test.dart, test 5507 van 6528 — jouw signatuur letterlijk. De stack is beslissend:Dat is
Stream.cast<T>(), niet een gewone waarde-cast. De enige plek in deze keten die zo cast isstream_channel/lib/src/multi_channel.dart:143:_inner!.stream.cast<List>().MultiChannelmultiplext meerdere logische kanalen over één verbinding, dus elk frame hoort een[id, inhoud]-lijst te zijn. Een kaleListin een cast is voor de VMList<dynamic>— vandaar exact die tekst, en vandaar een stack met niets dandart:asyncerboven. Er kwam dus een JSON-object langs op een lijn die alleen frames vervoert. Influtter testis dat de lijn tussen het gereedschap en het testproces (_pipeHarnessToRemoteinflutter_platform.dart), JSON over een WebSocket.Het is dus niet die test, en niet de cache.
Wat weerlegd is
Drie manieren om die cache te bederven, tegen een echte draai van deze suite: halveren, ~2.800 bytes omklappen, en vervangen door een geldige dill uit een andere bronboom. Alle drie groen — de frontend server valt terug op een volledige compilatie. Je eigen formulering ("bedorven of verouderde cachegegevens") houdt daarmee geen stand. De tabel staat in
docs/CHECKS.mdzodat niemand die proeven overdoet.Wat de drie bekende voorvallen wél gemeen hebben is belasting: alle drie in de dekkingsfase, en mijn reproductie viel terwijl er een tweede
flutter testop dezelfde machine liep. Drie is geen steekproef, dus dat staat er als waarneming en niet als oorzaak. De gooiende regel staat vast, de aanleiding niet.Dat het opruimen van de cache "hielp" is hiermee consistent — een volledige hercompilatie verzet de timing van de hele draai — maar opnieuw draaien is dat evenzeer.
Richting 2, met jouw voorbehoud
Je waarschuwde dat het geen echte laadfouten mag wegpoetsen. Dat is opgelost door het niet over de uitvoer te doen: elke
flutter testschrijft náást het scherm een machineleesbaar rapport (--file-reporter json:build/test-report.json), entool/explain_suite_failure.dartleest dát bij een rode suite. Een zijkanaal kan per definitie niets onderdrukken — de uitvoer stroomt onveranderd door en de afloop blijft die van de suite. Filteren was ook praktisch onmogelijk: een pipe kostflutter testzijn voortgangsregel en maakt van een draai duizenden regels.De verklaring noemt de bestanden die niet geladen konden worden, mét de zin die er anders bij inschiet: dat de tests erin niet gedraaid hebben en niet meetellen in het aantal.
Belangrijker dan de geruststelling is het omgekeerde. Een bestand dat niet compileert is óók een laadfout, en die wordt juist als échte fout benoemd — nooit weggezet als "bekend". Dat is de eerste toets in
test/explain_suite_failure_test.dart, met een ontbrekendemain, een mislukte compilatie en een ongerelateerde type-cast. Stond die verkeerd, dan was dit hulpmiddel erger dan geen hulpmiddel.Richtingen 1 en 3
docs/CHECKS.mdheeft nu een sectie When the gate fails on something that is not your change, met de letterlijke signatuur erin zodat wie hem intikt daar landt. Enmake clean-test-cachebestaat — alleenbuild/test_cache, bewust nietflutter clean: daaronder staan de platformbuilds waarDARTCV_LIBde native OpenCV-bibliotheek vindt, en die weggooien laat de gezichtsdetectietests zichzelf weer overslaan. Groen om de verkeerde reden.Je noemde blind opruimen vóór elke draai de verkeerde ruil. Eens, en het is nu ook niet meer het eerste advies: dat is opnieuw draaien.
Richting 4, bovenstrooms
Twee reports, geen van beide dit:
.dill.track.dill. In 2020 gesloten: het bleek een pakketversieverschil tussen twee omgevingen. De cache was daar óók de rode haring.flutter testonderbuild/wordt niet ongeldig wanneer Flutter het formaat wijzigt, en de conclusie van de melder is letterlijk dat opruimen de enige remedie is en dat dat niet vanzelf duidelijk is. Andere cache, jouw klacht.Wat er níét in zit
Een preventieve vervaldatum op de cache. Overwogen, want de bestandsnaam hasht alleen de dart-defines en de frontend-opties (
getDefaultCachedKernelPath) en overleeft dus een SDK- of pakketwijziging. Geschrapt zodra bleek dat de cache de oorzaak niet is: dan koop je een hercompilatie voor een theorie.Waarom dit issue open blijft
De aanleiding is niet gevonden. Wat er nog ligt is één ding, en dat is jouw keuze: een melding bovenstrooms bij
dart-lang/testofflutter. De sluitende stap daarvoor is een reproductie die niet "een suite van 6.500 tests onder belasting" heet, en die heb ik niet. Ik heb wel het volledige rapport, de volledige uitvoer en de cache van de reproductie bewaard; zeg het maar als je die erbij wilt.Poort:
make checkgroen op de tak in een verse worktree — 6.539 tests, dekking 86,5%, per-bestandsvloer 0. Elk van de zes toetsen is één keer rood gezien tegen een gemuteerde tool, Makefile en docs.Vierde voorval, vandaag 24-07 tijdens het werk aan #811. Genoteerd omdat elke waarneming hier telt — het zijn er nu vier.
test/markdown_editor_lossless_test.dart== OciDeck check: coverage ==type '_Map<String, dynamic>' is not a subtype of type 'List<dynamic>' in type castWeer een ander bestand, weer de dekkingsfase. Opnieuw draaien was genoeg; de cache is niet aangeraakt.
Wat dit met de belastingwaarneming doet: het verzwakt hem. Er liep deze keer geen tweede
flutter testvan mij. Wat ik níét kan uitsluiten is een andere sessie op dezelfde machine — daar heb ik geen zicht op, dus dit is geen weerlegging, alleen een voorval dat de theorie niet steunt. Nieuw is verder dat het in een worktree op/private/tmpviel en niet in de hoofdwerkkopie.Het gereedschap uit #815 deed precies waarvoor het gemaakt is. De suite noemde
markdown_editor_lossless_test.dartals 'failing test', en de verklaring eronder zette dat recht: dit bestand kon niet worden geladen, de tests erin hebben niet gedraaid en tellen niet mee, en dit is de bekende storing en niet die test. Ik heb geen seconde aan dat bestand besteed. Dat was de hele bedoeling.De aanleiding is nog steeds niet gevonden, dus dit issue blijft open — en de bovenstroomse melding blijft jouw keuze.
Afgerond en gesloten. De tegenmaatregel staat op main (
31a5e430, PR #815); wat overbleef was de aanleiding, en die schrijven we af als pech.Bovenstrooms gemeld: flutter/flutter#190000, met een reproductie in een leeg, gegenereerd project — 400 testbestanden,
--coverage, en lussen. Dat issue blijft daar open voor hun triage; het kost ons niets en er zit een tweede bevinding in die losstaat van de flakiness (zie hieronder).Wat er in dit issue is beantwoord:
docs/CHECKS.mdheeft een sectie met de letterlijke foutsignatuur, zodat wie hem intikt daar landt en niet bij de test die genoemd wordt.flutter testschrijft nu een machineleesbaar rapport náást het scherm, entool/explain_suite_failure.dartleest dat bij een rode suite. Jouw voorbehoud (geen echte laadfouten wegpoetsen) is opgelost door het via een zijkanaal te doen: er wordt niets afgevangen of onderdrukt. Een bestand dat niet compileert wordt juist als échte fout benoemd.make clean-test-cachebestaat, maar is niet meer het eerste advies. Dat is opnieuw draaien.De titel van dit issue klopt niet meer, en dat is de moeite waard om te onthouden. "valt om op een bedorven build/test_cache" — de cache is het niet. Drie manieren om hem te bederven leverden alle drie een groene suite op; de gooiende regel is
stream_channel/lib/src/multi_channel.dart:143, op de lijn tussenflutter testen het testproces. Dat de cache opruimen tweemaal "hielp" was een volledige hercompilatie die de timing verzette, niet een oorzaak die verdween.Eén bevinding die los van dit alles staat en de moeite waard blijft. In de reproductie meldde de draai 1596 van de 1600 tests. De vier tests uit het niet-geladen bestand hebben niet gedraaid en staan nergens geteld — de suite toetst dus minder dan het getal zegt, en niets meldt dat. Bij ons vangt de nieuwe verklaring dat nu af met een expliciete zin; bovenstrooms staat het als zelfstandig punt in het issue.
Wat er níét is gevonden: de aanleiding. Wat de bekende voorvallen delen is belasting, maar drie waarnemingen zijn geen steekproef en 39 synthetische draaien leverden één treffer. Ik heb twee hypotheses uitgesloten (meer bestanden, hogere concurrency) en één ongetoetst achtergelaten in het upstream-issue: dat het gaat om de overlap tussen processen die nog dráaien en processen die geladen worden — de échte suite valt ~1 op 3, de synthetische ~1 op 39, en dát is het verschil tussen die twee.
Komt hij terug, dan staat in
docs/CHECKS.mdwat je moet bewaren voordat je iets opruimt.