[June]: robust fetch negotiations and gix corpus with tracing integration
#943
Byron
announced in
Progress Update
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
And another seemingly productive month even though it was wrapped up by the first bout with COVID (that I am still recovering from). Maybe that's also why I keep it more brief than usual.
Integration of
gix-negotiateintogixLow-level negotiation algorithms are now driven by the
giximplementation of the fetch negotiation loop, right after implementing yet another surprise calledmark_complete_and_common_ref(), a function that is the part of the negotiation algorithm that is shared among all implementations.During testing, I found more opportunities to further protocol support with combinations of V1 and stateful/stateless transports which made V1 support much better than before to the point where it seems to be working just fine (and I am looking at you,
NAKline from hell that needs intrinsic knowledge to get right).64 bit date support
From a level of importance point of view, this improvement has to be mentioned early on as
gitoxidecan now easily represent dates further ahead than 2038, and is hereby future proof in the literal sense :). The trigger for this was further commit-graph work (read on) which led me to realize thatgithas learned 64 bit dates in the course of the past 2 years - time flies!Nicer in-memory configuration overrides
When writing tests I noticed that it was a bit clumsy to use configuration keys, which are the default way of accessing configuration values and validating them.
Now they can be used for setting values, too, even though setting the value itself still looks a bit clumsy unless on happens to have a
&BStraround.Deep commit-graph integration
With negotiation improvements came graph primitives, and with these came commit-graph integration not only in the
gix_revision::Graph, but also in the venerablegix_traverse::commit::Ancestors()iterator which now optionally makes use of a commit-graph. This is facilitated by providing more information about commits during traversal, like their parents, their commit-time and possibly their generation, as this information was obtained during traversal anyway and can be leveraged by the caller.Thanks to integration all the way down the stack the commit-graph is now used automatically during any traversal, while respecting git configuration related to the commit-graph which could prevent that. Typical traversals are now easily 6.5 times faster with it, it really makes a difference.
gix revision listandgix commit-graph listgix revision listnow shows all information that is easily available from an iteration, adding the commit-time as well as the amount of parents for brevity, whilegix commit-graph listsub-command was added to show all data that is present in the commit-graph if one is available.SVG-Graphs of Revisions
When working with negotiation algorithms I always wished there was a way to visualise these to understand them better. And thanks to the
layout-rscrate that's now (mostly) possible, as long as the graph doesn't span more than 1000 revisions or so.What's quite revealing is
gix fetch --open-negotiation-graph=path.svgwhich will show visualise the negotiation graph as it was after the negotiation was finished along with all flags that were set per commit.And for good measure, one can enable simple graph visualization for
gix revision list --svgas well.gix corpusand--traceI recently became aware of the power of the
tracingecosystem and wanted it badly. Thus far,gitoxideonly hadprogressreporting which could also emit messages, but it's a limited system that lacks finesse outside of what it is good at. For a while I thought about addingloggingintegration to be able to add details about how certain portions of the code are running, but it seemed too simple. Then withtracingit became clear thatspansis what I wanted, along with structured logging facilities.gitoxidenow integrates withtracing-coreusing thegix-tracecrate which by default compiles to nothing at all. Only whentracingfeature is enabled by the application will it actually incur a cost, and then only the bare minimal one asgix-traceis quite minimal compared to itstracingcounterpart.With that it's possible to see how fast certain parts of the code are running, and thanks to
tracing-forestthese visualize beautifully. All this can be activated withgix --trace.gix corpusis a runner over a set of repositories which stores information about each run in a sqlite database for later analysis. What's neat about it is that it collects the tracing spans and serializes them into a database as well. With that, it should be possible to compare details of each computation with each other while only really taking care of tracing.Now I just have to find a way to more regularly perform
gix corpusruns and to finally figure out an easy way to analyse the information contained in it.Community
Rust Foundation sponsorship
The negotiation upgrade was promptly merged mostly by upgrading
gixto the latest version, socargoshould now work correctly with certain crates.io proxies which are particularly necessary in China. Next up is a filtering system to be able to perform correct worktree checkouts.Cheers,
Sebastian
PS: The latest timesheets can be found here.
Beta Was this translation helpful? Give feedback.
All reactions