Skip to content

bug: Error "loop in gettable" with too many child specs #2150

@xdom

Description

@xdom

Did you check docs and existing issues?

  • I have read all the lazy.nvim docs
  • I have updated the plugin to the latest version before submitting this issue
  • I have searched the existing issues of lazy.nvim
  • I have searched the existing issues of plugins related to this issue

Neovim version (nvim -v)

0.12.1

Operating system/version

Linux

Describe the bug

Due to combination of lazy.nvim resolution logic and LuaJIT __index nesting limit, lazy.nvim fails to start when more than 99 plugin definitions have child specs (or dependencies?) for the same plugin. In practice, this happens in AstroNvim with lots of astrocommunity packs loaded.

Stacktrace with max(i) > 100:

Error in /app/nvim/init.lua:
E5113: Lua chunk: ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:214: loop in gettable
stack traceback:
        ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:214: in function '_rebuild'
        ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:155: in function 'rebuild'
        ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:348: in function 'resolve'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:54: in function 'parse'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:335: in function 'load'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/loader.lua:37: in function 'setup'
        ...neovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/init.lua:102: in function 'setup'
        ...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:64: in function 'setup'
        ...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:103: in function 'repro'
        /app/nvim/init.lua:18: in main chunk

Stacktrace with max(i) == 100:

Error in /app/nvim/init.lua:
E5113: Lua chunk: ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:267: loop in gettable
stack traceback:
        ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:267: in function 'fix_cond'
        ...m/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/meta.lua:352: in function 'resolve'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:54: in function 'parse'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/plugin.lua:335: in function 'load'
        ....repro/data/nvim/lazy/lazy.nvim/lua/lazy/core/loader.lua:37: in function 'setup'
        ...neovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/init.lua:102: in function 'setup'
        ...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:64: in function 'setup'
        ...eovim/.repro/data/nvim/lazy/lazy.nvim/lua/lazy/minit.lua:103: in function 'repro'
        /app/nvim/init.lua:18: in main chunk

Issue is gone when Neovim is built with patched LuaJIT:

diff --git a/src/lj_def.h b/src/lj_def.h
index 9293e6fb..cb75b24f 100644
--- a/src/lj_def.h
+++ b/src/lj_def.h
@@ -68,7 +68,7 @@ typedef unsigned int uintptr_t;
 #define LJ_MAX_LOCVAR    200        /* Max. # of local variables. */
 #define LJ_MAX_UPVAL    120        /* Max. # of upvalues. */
 
-#define LJ_MAX_IDXCHAIN    100        /* __index/__newindex chain limit. */
+#define LJ_MAX_IDXCHAIN    300        /* __index/__newindex chain limit. */
 #define LJ_STACK_EXTRA    (5+3*LJ_FR2)    /* Extra stack space (metamethods). */
 
 #if defined(__powerpc64__) && _CALL_ELF != 2

Real use-case tree looks like this:
lazynvim_debug.txt

Steps To Reproduce

nvim -u repro.lua

Expected Behavior

Ideally, lazy.nvim should be able to handle unlimited amount of child specs.

Repro

vim.env.LAZY_STDPATH = ".repro"
load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()

local specs = {}
local plugin = [[
return {"folke/noice.nvim", specs = {
    {
      "AstroNvim/astrocore",
      opts = {}
    }
}}
]]

for i = 1, 100 do
  table.insert(specs, load(plugin)())
end

require("lazy.minit").repro({
  spec = specs,
})

EDIT: Small fix in repro code.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions