# Invalidations findings (from a GMT case)

**URL:** <https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420>\
**Category:** General Usage\
**Tags:** performance\
**Created:** [January 2, 2023, 2:55pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420 "2023-01-02T14:55:54Z")\
**Posts on this page:** 20\
**Page:** 3

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 5, 2023, 9:17pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/41 "2023-01-05T21:17:23Z")

</div>

I’m left with only one for this workload but it’s not a `mt_backedges`. it a _simple_ `backedges` and `ascend` errors with it

The code run

```julia
using SnoopCompileCore
invs = @snoopr using GMT, FFTW
tinf = @snoopi_deep GMT.plot(rand(5,2));
using SnoopCompile
trees = invalidation_trees(invs);
taletrees = precompile_blockers(trees, tinf)

```

results (in my master version)

```julia
1-element Vector{SnoopCompile.StaleTree}:
 inserting eltype(::Type{ChainRulesCore.ZeroTangent}) @ ChainRulesCore C:\Users\joaqu\.julia\packages\ChainRulesCore\C73ay\src\tangent_types\abstract_zero.jl:55 invalidated:
   backedges: 1: MethodInstance for eltype(::Type) at depth 0 with 26 children blocked 1.4864543999999997 inclusive time for 2 nodes

julia> tree = taletrees[1];

julia> sig, roots = tree.backedges[1];

julia> ascend(roots)
ERROR: MethodError: no method matching method(::Vector{SnoopCompileCore.InferenceTimingNode})

Closest candidates are:
  method(::Core.MethodInstance)
   @ Cthulhu C:\Users\joaqu\.julia\packages\Cthulhu\eS0ye\src\backedges.jl:84
  method(::Vector{Base.StackTraces.StackFrame})
   @ Cthulhu C:\Users\joaqu\.julia\packages\Cthulhu\eS0ye\src\backedges.jl:90
  method(::SnoopCompile.InstanceNode)
   @ SnoopCompile C:\Users\joaqu\.julia\packages\SnoopCompile\Q8zUg\src\invalidations.jl:771
  ...

```

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 5, 2023, 10:15pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/42 "2023-01-05T22:15:13Z")

</div>

With `backedges`, use `root = tree.backedges[idx]` and `ascend(root)`. It’s described in the docs 🙂 [Snooping on and fixing invalidations: @snoopr · SnoopCompile](https://timholy.github.io/SnoopCompile.jl/stable/snoopr/#A-first-example)

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 5, 2023, 10:54pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/43 "2023-01-05T22:54:50Z")

</div>

What is that `tree`? One from `trees` or from `taletrees`? (The names in my example 2 posts above). Because, in latter case it still errors.

```julia
root = tree.backedges[1]
MethodInstance for firstindex(::AbstractString) at depth 0 with 1 children

julia> ascend(roots)
ERROR: MethodError: no method matching method(::Tuple{SnoopCompile.InstanceNode, Vector{SnoopCompileCore.InferenceTimingNode}})

```

The example from [SnoopCompile docs](https://timholy.github.io/SnoopCompile.jl/stable/snoopr/#A-first-example) makes think it should be from `trees` but than in my case there are lots of entries and is hard to find this particular invalidation shown in `taletrees`

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 5, 2023, 11:01pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/44 "2023-01-05T23:01:25Z")

</div>

Can you post explicit instructions I can use to reproduce this? Including GMT branch info etc.

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 5, 2023, 11:02pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/45 "2023-01-05T23:02:14Z")

</div>

Oh, you typed `ascend(roots)` but you assigned the result to `root`. Drop the `s` maybe?

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 5, 2023, 11:38pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/46 "2023-01-05T23:38:43Z")

</div>

Yes, some confusions with the `root` vs `roots` but I must had both vars and that made no difference.

This is with the master version (just committed all my local changes)

```julia
  | | |_| | | | (_| | | Version 1.10.0-DEV.221 (2022-12-29)
 _/ |\ __'_|_|_|\__'_| | Commit 6740224b94 (7 days old master)
|__/ |

using SnoopCompileCore
invs = @snoopr using GMT, FFTW;
tinf = @snoopi_deep GMT.plot(rand(5,2));
using SnoopCompile
trees = invalidation_trees(invs);

taletrees = precompile_blockers(trees, tinf)
1-element Vector{SnoopCompile.StaleTree}:
 inserting eltype(::Type{ChainRulesCore.ZeroTangent}) @ ChainRulesCore C:\Users\joaqu\.julia\packages\ChainRulesCore\C73ay\src\tangent_types\abstract_zero.jl:55 invalidated:
   backedges: 1: MethodInstance for eltype(::Type) at depth 0 with 26 children blocked 1.5386513 inclusive time for 2 nodes

tree = taletrees[1];
roots = tree.backedges[1];

ascend(roots)
ERROR: MethodError: no method matching method(::Tuple{SnoopCompile.InstanceNode, Vector{SnoopCompileCore.InferenceTimingNode}})

Closest candidates are:
  method(::Core.MethodInstance)
   @ Cthulhu C:\Users\joaqu\.julia\packages\Cthulhu\eS0ye\src\backedges.jl:84
  method(::Vector{Base.StackTraces.StackFrame})
   @ Cthulhu C:\Users\joaqu\.julia\packages\Cthulhu\eS0ye\src\backedges.jl:90
  method(::SnoopCompile.InstanceNode)
   @ SnoopCompile C:\Users\joaqu\.julia\packages\SnoopCompile\Q8zUg\src\invalidations.jl:771
  ...

```

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 6, 2023, 2:28am UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/47 "2023-01-06T02:28:38Z")

</div>

Sorry, I forgot that the format of entries for `precompile_blockers` is different from `invalidations`: it also includes the things that got recompiled (from `tinf`). You want

```julia
julia> root, recompiles = tree.backedges[end]
(MethodInstance for eltype(::Type{P} where P<:(Matrix{<:Real})) at depth 0 with 10 children, SnoopCompileCore.InferenceTimingNode[InferenceTimingNode: 0.000192/1.074739 on GMT.plot(::Matrix{Float64}) with 2 direct children])

julia> ascend(root)
Choose a call for analysis (q to quit):
 > eltype(::Type{P} where P<:(Matrix{<:Real}))
       SubArray(::IndexLinear, ::Matrix{<:Real}, ::Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, ::Tuple{Bool})
         SubArray(::Matrix{<:Real}, ::Tuple{Base.Slice{Base.OneTo{Int64}}, Int64})
...

```

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 6, 2023, 2:09pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/48 "2023-01-06T14:09:55Z")

</div>

That leads to a very odd case. The invalidation is produced by this

```julia
extrema(view(M, :, color_col)

```

[here](https://github.com/GenericMappingTools/GMT.jl/blob/master/src/utils_types.jl#L464) where `M` is `M::Matrix{<:Real}`. What is the problem in using a `view`?

 ![image](https://global.discourse-cdn.com/julialang/original/3X/d/2/d2d0d894016b3f1e06c12db25782852a774d2aad.png)

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 6, 2023, 2:21pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/49 "2023-01-06T14:21:05Z")

</div>

It can’t infer the eltype as anything more concrete than `<:Real`. Any time you have abstract parameters you will get inference failures.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 6, 2023, 2:33pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/50 "2023-01-06T14:33:15Z")

</div>

😥

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 7, 2023, 10:48am UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/51 "2023-01-07T10:48:12Z")

</div>

Well, if your caller can pass something that is well-inferred to `line2multiseg` then you’re in better shape. Your snippet doesn’t include enough of the arguments to some of its callers (`_helper_psx_line`, `common_plot_xyz`, etc.) for me to see if they have abstract arguments, but generally speaking I try to fix the problem in the first caller that has concrete (non-red) argument types; you know inference worked up to that call, so perhaps the origin of the inference failure is in there.

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 7, 2023, 11:08am UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/52 "2023-01-07T11:08:17Z")

</div>

Here’s an example:

 ![image](https://global.discourse-cdn.com/julialang/original/3X/5/0/50a4ee285239c5b0fd62844b1e85221509830b74.png)

The `set_dsBB!` call is the last one where the arguments were judged to be concrete. However:

```julia
julia> isconcretetype(GMTdataset)
false

julia> Base.unwrap_unionall(GMTdataset)
GMTdataset{T, N}

```

so a `Vector{GMTdataset}` has elements which themselves are not concrete (`Vector{Any}` is concrete, but `Any` is not). So as soon as you extract an element from that array, you have inference failures.

To diagnose where that happens, you have to go much farther back up the call chain, to `common_plot_xyz(::String, ::Matrix{Float64}, ::String, ::Bool, ::Bool)`. There, if you descend into it, the suggested line to inspect

```julia
Choose possible caller of MethodInstance for GMT.with_xyvar(::Dict{Symbol, Any}, ::GMTdataset) or proceed to typed code:
 > "/home/tim/.julia/dev/GMT/src/psxy.jl", common_plot_xyz: lines [109]
   Browse typed code

```

has contents

```julia
(cmd0 != "" && isa(arg1, GMTdataset)) && (arg1 = with_xyvar(d::Dict, arg1)) # If we read a file, see if requested cols

```

This allows inference to know that `arg1` is a `GMTdataset` but it has no idea what its type parameters are.

The good news is that you can fix this. Just change `with_xyvar(d::Dict, arg1)` to `Base.invokelatest(with_xyvar, d, arg1)`. This forces it to use runtime dispatch, in which case `with_xyvar` will receive all-concrete arguments. This alone might be enough to fix the whole call chain. And if not, at least `common_plot_xyz(::String, ::Matrix{Float64}, ::String, ::Bool, ::Bool)` and its callers are protected against invalidation. (`invokelatest` “breaks the chain” and prevents invalidations from cascading.)

---

<div class="post-metadata">

**Author:** ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)\
**Post date:** [January 7, 2023, 11:32am UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/53 "2023-01-07T11:32:22Z")

</div>

Is the preferred approach to use `invokelatest` or `Base.inferencebarrier`? Some people seemed to prefer the latter on GitHub issues (for Julia’s own repo).

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [January 7, 2023, 12:08pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/54 "2023-01-07T12:08:41Z")

</div>

As you surely know, they do slightly different things, though they could result in the same practical outcome:

- `inferencebarrier` causes infer-as-`Any`, and _sometimes_ this triggers runtime dispatch (but not for, e.g., `@nospecialize` args)
- `invokelatest` forces runtime dispatch, but also effectively updates the world age.

What I actually think we want is a callsite annotation `@concrete f(args...)` to block abstract inference: indicate that we should invoke `f` directly if all the `args` can be inferred concretely, and otherwise use runtime-dispatch. But we don’t have `@concrete` (yet).

---

<div class="post-metadata">

**Author:** ![liuyxpp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/liuyxpp/32/9870_2.png) [@liuyxpp](https://discourse.julialang.org/u/liuyxpp)\
**Post date:** [January 7, 2023, 1:24pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/55 "2023-01-07T13:24:24Z")

</div>

I like the idea of `@concrete`. Both `inferencebarrier` and `invokelatest` are hard to understand its meaning thus to remember.

---

<div class="post-metadata">

**Author:** ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)\
**Post date:** [January 7, 2023, 3:32pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/56 "2023-01-07T15:32:22Z")

</div>

Thanks! I also like the idea of `@concrete`

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 7, 2023, 4:24pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/57 "2023-01-07T16:24:01Z")

</div>

Thanks for this one more learning lesson. The case that triggered this analysis is not that important to me as I’ve replaced the `extrema(view(...))` call by a little internal function that has the further advantage of **not** ignoring NaNs, but I have a couple more of this type and I’ll try to apply this logic to fix them.

However, I think this is a useful example to others because

```julia
julia> isconcretetype(GMTdataset)
false

```

is so (if I’m understanding this matters) because a [GMTdataset](https://github.com/GenericMappingTools/GMT.jl/blob/master/src/gmt_main.jl#L105) is an abstract array, so all other types that implement the abstract array interface are candidates to suffer from these inference issues.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 7, 2023, 7:43pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/58 "2023-01-07T19:43:44Z")

</div>

> [@kristoffer.carlsson](#):
>
> I mixed it up with some other things I was looking at. [improve inference in Pkg by KristofferC · Pull Request #3293 · JuliaLang/Pkg.jl · GitHub](https://github.com/JuliaLang/Pkg.jl/pull/3293) should hopefully deal with those.

Unfortunately not yet.

```julia
  | | |_| | | | (_| | | Version 1.10.0-DEV.293 (2023-01-07)
 _/ |\ __'_|_|_|\__'_| | Commit 8dbf7a1517 (0 days old master)
|__/ |

julia> include("c:/v/test_gmt1.jl");

julia> trees
6-element Vector{SnoopCompile.MethodInvalidations}:
 inserting firstindex(s::LaTeXStrings.LaTeXString) @ LaTeXStrings C:\Users\joaqu\.julia\packages\LaTeXStrings\pJ7vn\src\LaTeXStrings.jl:108 invalidated:
   backedges: 1: superseding firstindex(s::AbstractString) @ Base strings\basic.jl:180 with MethodInstance for firstindex(::AbstractString) (1 children)

 inserting codeunits(s::LaTeXStrings.LaTeXString) @ LaTeXStrings C:\Users\joaqu\.julia\packages\LaTeXStrings\pJ7vn\src\LaTeXStrings.jl:124 invalidated:
   mt_backedges: 1: signature Tuple{typeof(codeunits), Any} triggered MethodInstance for Base.cwstring(::AbstractString) (3 children)
   backedges: 1: superseding codeunits(s::AbstractString) @ Base strings\basic.jl:785 with MethodInstance for codeunits(::AbstractString) (1 children)

 inserting Base.IteratorSize(::Type{R}) where R<:Union{AbstractColumns, AbstractRow} @ Tables C:\Users\joaqu\.julia\packages\Tables\T7rHm\src\Tables.jl:179 invalidated:
   backedges: 1: superseding Base.IteratorSize(::Type) @ Base generator.jl:94 with MethodInstance for Base.IteratorSize(::Type{<:AbstractString}) (5 children)
   75 mt_cache

 inserting lastindex(s::LaTeXStrings.LaTeXString) @ LaTeXStrings C:\Users\joaqu\.julia\packages\LaTeXStrings\pJ7vn\src\LaTeXStrings.jl:109 invalidated:
   backedges: 1: superseding lastindex(s::AbstractString) @ Base strings\basic.jl:181 with MethodInstance for lastindex(::AbstractString) (5 children)

 inserting sizeof(s::LaTeXStrings.LaTeXString) @ LaTeXStrings C:\Users\joaqu\.julia\packages\LaTeXStrings\pJ7vn\src\LaTeXStrings.jl:125 invalidated:
   backedges: 1: superseding sizeof(s::AbstractString) @ Base strings\basic.jl:179 with MethodInstance for sizeof(::AbstractString) (15 children)
   6 mt_cache

 inserting convert(::Type{String}, d::StringManipulation.Decoration) @ StringManipulation C:\Users\joaqu\.julia\packages\StringManipulation\wxRU4\src\decorations.jl:193 invalidated:
   mt_backedges: 1: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Base.UUID}, ::Any, ::Any) (0 children)
                  2: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Union{Bool, String}}, ::Any, ::Any) (0 children)
                  3: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Union{Nothing, String}}, ::Any, ::Any) (0 children)
                  4: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Nothing}, ::Nothing, ::Any) (0 children)
                  5: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Vector{String}, ::Any, ::Int64) (0 children)
                  6: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for push!(::Vector{String}, ::Any) (0 children)
                  7: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Union{Base.SHA1, String}}, ::Any, ::Any) (0 children)
                  8: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Function}, ::Any, ::Any) (0 children)
                  9: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Fail(::Symbol, ::Any, ::Any, ::Bool, ::Nothing, ::LineNumberNode, ::Bool) (0 children)
                 10: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Fail(::Symbol, ::Any, ::Any, ::Any, ::Any, ::LineNumberNode, ::Bool) (0 children)
                 11: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Fail(::Symbol, ::Any, ::Any, ::Any, ::Nothing, ::LineNumberNode, ::Bool) (0 children)
                 12: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Fail(::Symbol, ::Any, ::Any, ::Nothing, ::Nothing, ::LineNumberNode, ::Bool) (0 children)
                 13: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Any}, ::Any, ::Any) (0 children)
                 14: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Union{String, Vector{String}}}, ::Any, ::Any) (0 children)
                 15: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Vector{Pkg.Types.Stage1}}, ::Vector{Pkg.Types.Stage1}, ::Any) (0 children)
                 16: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Base.UUID}, ::Base.UUID, ::Any) (0 children)
                 17: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Vector{String}}, ::Vector{String}, ::Any) (0 children)
                 18: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, Pkg.Types.Compat}, ::Any, ::Any) (0 children)
                 19: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, String}, ::Any, ::Any) (0 children)
                 20: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{String, String, Base.UUID}})(::Int64) (0 children)
                 21: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{String, Union{Nothing, VersionNumber}}})(::Int64) (0 children)
                 22: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{Base.UUID, String, String, VersionNumber}})(::Int64) (0 children)
                 23: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{Revise.PkgData, String}})(::Int64) (0 children)
                 24: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::IdDict{Any, String}, ::Any, ::Any) (1 children)
                 25: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Error(::Symbol, ::Any, ::Any, ::Vector{Any}, ::LineNumberNode) (1 children)
                 26: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Error(::Symbol, ::Any, ::Bool, ::Nothing, ::LineNumberNode) (1 children)
                 27: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for REPL.LineEditREPL(::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (1 children)
                 28: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for REPL.LineEdit.PrefixSearchState(::Any, ::Any, ::Any, ::Any) (1 children)
                 29: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Logging.var"#handle_message#3"(::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::typeof(Base.CoreLogging.handle_message), ::Logging.ConsoleLogger, ::Base.CoreLogging.LogLevel, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (1 children)
                 30: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Logging.var"#handle_message#3"(::Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}}, ::typeof(Base.CoreLogging.handle_message), ::Logging.ConsoleLogger, ::Base.CoreLogging.LogLevel, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (1 children)
                 31: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for convert(::Type{Pair{String, String}}, ::Pair{String}) (1 children)
                 32: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for setindex!(::Dict{String, String}, ::Any, ::String) (1 children)
                 33: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Error(::Symbol, ::Any, ::Any, ::Nothing, ::LineNumberNode) (2 children)
                 34: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Test.Error(::Symbol, ::Any, ::Any, ::Any, ::LineNumberNode) (2 children)
                 35: signature Tuple{typeof(convert), Union{Type{Base.UUID}, Type{String}}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{String, String, Base.UUID}})(::Int64) (3 children)
                 36: signature Tuple{typeof(convert), Union{Type{Base.UUID}, Type{VersionNumber}, Type{String}}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{Base.UUID, String, String, VersionNumber}})(::Int64) (3 children)
                 37: signature Tuple{typeof(convert), Union{Type{String}, Type{Revise.PkgData}}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{Revise.PkgData, String}})(::Int64) (3 children)
                 38: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Base.CoreLogging.var"#handle_message#2"(::Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}}, ::typeof(Base.CoreLogging.handle_message), ::Base.CoreLogging.SimpleLogger, ::Base.CoreLogging.LogLevel, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (4 children)
                 39: signature Tuple{typeof(convert), Union{Type{String}, Type{Union{Nothing, VersionNumber}}}, Any} triggered MethodInstance for (::Base.var"#cvt1#1"{Tuple{String, Union{Nothing, VersionNumber}}})(::Int64) (4 children)
                 40: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for REPL.REPLHistoryProvider(::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (17 children)
                 41: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Pkg.Registry.verify_compressed_registry_toml(::String) (47 children)
                 42: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for convert(::Type{Union{Nothing, String}}, ::Any) (48 children)
                 43: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Pkg.Types.Compat(::Pkg.Versions.VersionSpec, ::Any) (230 children)

```

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [January 7, 2023, 7:45pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/59 "2023-01-07T19:45:03Z")

</div>

> [@joa-quim](#):
>
> Unfortunately not yet.

Pkg has not been updated on master yet.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [January 7, 2023, 7:47pm UTC](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420/60 "2023-01-07T19:47:44Z")

</div>

Ah, good (only looked at the merge status of that PR).

[Previous page](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420.md?page=2)

[Next page](https://discourse.julialang.org/t/invalidations-findings-from-a-gmt-case/92420.md?page=4)
