Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

In v3.4.0, calling an event will create an SOL2 assertion failure #317

Closed
Neptnium opened this issue May 10, 2024 · 7 comments · Fixed by #318
Closed

In v3.4.0, calling an event will create an SOL2 assertion failure #317

Neptnium opened this issue May 10, 2024 · 7 comments · Fixed by #318
Assignees
Labels
bug Something isn't working
Milestone

Comments

@Neptnium
Copy link
Contributor

Fill out general information
OS (windows, linux, ...):
BeamMP-Server Version: v3.4.0 (BeamMP-Server.debian.11.x86_64)

Describe the bug
When calling an event with MP.TriggerLocalEvent or MP.TriggerGlobalEvent you will get an SOL2 assertion failure.
Getting the return value with Future:GetResults() will also make an SOL2 assertion failure.
BUT, everything works nomrally execpt for this assertion failure, the right data is passed to the event, and you get the right data that is returned.

To Reproduce
Here are examples of code that will make the errors:

function testHandler(data)

end

MP.RegisterEvent("testEvent", "testHandler")
MP.TriggerLocalEvent("testEvent", "test data")

Will make 1 assertion error


function testHandler(data)

end

MP.RegisterEvent("testEvent", "testHandler")
MP.TriggerGlobalEvent("testEvent", "test data")

Will make 1 assertion error


function testHandler(data)
  print(data)
  return "Hey, this is a test"
end

MP.RegisterEvent("testEvent", "testHandler")

local Future = MP.TriggerGlobalEvent("testEvent", "test data")
while not Future:IsDone() do
  MP.Sleep(10)
end
print(Future:GetResults()[1])

Will make 2 assertion errors

Expected behavior
No SOL3 assertion failure

Logs
(For only 1 assertion error)

[10/05/24 09:55:58] [INFO] BeamMP Server v3.4.0
[10/05/24 09:55:58] [INFO] Loaded 3 Mods
[10/05/24 09:55:58] [INFO] Vehicle data network online on port 31000 with a Max of 64 Clients
[10/05/24 09:55:58] [INFO] Vehicle event network online
[10/05/24 09:55:58] [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 09:55:58] [INFO] Server up-to-date!
[10/05/24 09:55:58] [INFO] PluginMonitor started
... and all following is normal
@Neptnium Neptnium added the bug Something isn't working label May 10, 2024
@Neptnium
Copy link
Contributor Author

Update on tests:

I enabled debug in config and here are the results:
For the code:

function testHandler(data)
  print(data)
end

MP.RegisterEvent("testEvent", "testHandler")
MP.TriggerGlobalEvent("testEvent", "test data")

I get the following logs:

[10/05/24 10:23:08.286] [DEBUG] renamed old log file to 'Server.old.log'
[10/05/24 10:23:08.286] [INFO] BeamMP Server v3.4.0
[10/05/24 10:23:08.286] Main [INFO] Loaded 3 Mods
[10/05/24 10:23:08.286] LuaEngine [DEBUG] Creating lua state for state id "!test"
[10/05/24 10:23:08.287] PPSMonitor [DEBUG] PPSMonitor starting
[10/05/24 10:23:08.287] TCPServer [INFO] Vehicle event network online
[10/05/24 10:23:08.287] UDPServer [INFO] Vehicle data network online on port 31000 with a Max of 64 Clients
[10/05/24 10:23:08.287] LuaEngine [DEBUG] Lua plugin "!test" starting in "Resources/Server/!test"
[10/05/24 10:23:08.599] Main [INFO] Server up-to-date!
[10/05/24 10:23:08.599] PluginMonitor [INFO] PluginMonitor started
[10/05/24 10:23:08.787] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 10:23:08.787] Lua:!test [DEBUG] json: ["test data"]
[10/05/24 10:23:08.787] Lua:!test [EVENT] testEvent
[10/05/24 10:23:08.787] Lua:!test [LUA] test data	
[10/05/24 10:23:08.787] LuaEngine [EVENT] onInit
[10/05/24 10:23:13.292] Heartbeat [DEBUG] heartbeat (after 5s)
[10/05/24 10:23:14.103] Main(Waiting) [INFO] ALL SYSTEMS STARTED SUCCESSFULLY, EVERYTHING IS OKAY

I tried running it inside of the onInit event, but I get the same issue:

function testHandler(data)
  print(data)
end

MP.RegisterEvent("testEvent", "testHandler")

function initHandler()
  print("initHandler Called")
  MP.TriggerGlobalEvent("testEvent", "test data")
end
MP.RegisterEvent("onInit", "initHandler")

I get logs:

[10/05/24 10:25:18.176] [DEBUG] renamed old log file to 'Server.old.log'
[10/05/24 10:25:18.176] [INFO] BeamMP Server v3.4.0
[10/05/24 10:25:18.176] Main [INFO] Loaded 3 Mods
[10/05/24 10:25:18.177] PPSMonitor [DEBUG] PPSMonitor starting
[10/05/24 10:25:18.177] LuaEngine [DEBUG] Creating lua state for state id "!test"
[10/05/24 10:25:18.177] TCPServer [INFO] Vehicle event network online
[10/05/24 10:25:18.177] UDPServer [INFO] Vehicle data network online on port 31000 with a Max of 64 Clients
[10/05/24 10:25:18.177] LuaEngine [DEBUG] Lua plugin "!test" starting in "Resources/Server/!test"
[10/05/24 10:25:18.401] Main [INFO] Server up-to-date!
[10/05/24 10:25:18.401] PluginMonitor [INFO] PluginMonitor started
[10/05/24 10:25:18.677] LuaEngine [EVENT] onInit
[10/05/24 10:25:18.677] Lua:!test [LUA] initHandler Called	
[10/05/24 10:25:18.677] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 10:25:18.677] Lua:!test [DEBUG] json: ["test data"]
[10/05/24 10:25:18.677] Lua:!test [EVENT] testEvent
[10/05/24 10:25:18.677] Lua:!test [LUA] test data	
[10/05/24 10:25:23.181] Heartbeat [DEBUG] heartbeat (after 5s)
[10/05/24 10:25:23.905] Main(Waiting) [INFO] ALL SYSTEMS STARTED SUCCESSFULLY, EVERYTHING IS OKAY

Hypothesis : The bug is in the validation of values.

I'm not sure, but will look in the code and keep updated on my findings

@Neptnium
Copy link
Contributor Author

Update on Tests

Feels like this is the right track, by passing 2 arguments to the event, you will get 2 assertion failures!

function testHandler(data1, data2)
  print(data1, data2)
end

MP.RegisterEvent("testEvent", "testHandler")

MP.TriggerGlobalEvent("testEvent", "test1", "test2")

Log:

[10/05/24 10:52:19.703] [INFO] BeamMP Server v3.4.0
[10/05/24 10:52:19.704] Main [INFO] Loaded 3 Mods
[10/05/24 10:52:19.704] PPSMonitor [DEBUG] PPSMonitor starting
[10/05/24 10:52:19.704] LuaEngine [DEBUG] Creating lua state for state id "!test"
[10/05/24 10:52:19.704] UDPServer [INFO] Vehicle data network online on port 31000 with a Max of 64 Clients
[10/05/24 10:52:19.704] LuaEngine [DEBUG] Lua plugin "!test" starting in "Resources/Server/!test"
[10/05/24 10:52:19.704] TCPServer [INFO] Vehicle event network online
[10/05/24 10:52:19.950] Main [INFO] Server up-to-date!
[10/05/24 10:52:19.950] PluginMonitor [INFO] PluginMonitor started
[10/05/24 10:52:20.204] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 10:52:20.204] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 10:52:20.204] Lua:!test [DEBUG] json: ["test1","test2"]
[10/05/24 10:52:20.204] Lua:!test [EVENT] testEvent
[10/05/24 10:52:20.204] Lua:!test [LUA] test1	test2	
[10/05/24 10:52:20.204] LuaEngine [EVENT] onInit

@Neptnium
Copy link
Contributor Author

New Update

For me the issue is located here: https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L461-L462

While testing the follwing code:

function testHandler(data1, data2)
  print(data1, data2)
end

MP.RegisterEvent("testEvent", "testHandler")

local test = function() return true end

MP.TriggerGlobalEvent("testEvent", "test Str", test)

I got the following logs:

[10/05/24 11:20:13.344] [DEBUG] renamed old log file to 'Server.old.log'
[10/05/24 11:20:13.344] [INFO] BeamMP Server v3.4.0
[10/05/24 11:20:13.344] Main [INFO] Loaded 3 Mods
[10/05/24 11:20:13.345] LuaEngine [DEBUG] Creating lua state for state id "!test"
[10/05/24 11:20:13.345] PPSMonitor [DEBUG] PPSMonitor starting
[10/05/24 11:20:13.345] UDPServer [INFO] Vehicle data network online on port 31000 with a Max of 64 Clients
[10/05/24 11:20:13.345] LuaEngine [DEBUG] Lua plugin "!test" starting in "Resources/Server/!test"
[10/05/24 11:20:13.345] TCPServer [INFO] Vehicle event network online
[10/05/24 11:20:13.345] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 11:20:13.345] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 11:20:13.345] Lua:!test [WARN] Passed a value of type 'function' to TriggerGlobalEvent("testEvent", ...). This type can not be serialized, and cannot be passed between states. It will arrive as <nil> in handlers.
[10/05/24 11:20:13.345] Lua:!test [DEBUG] json: ["test Str","BEAMMP_SERVER_INTERNAL_NIL_VALUE"]
[10/05/24 11:20:13.345] Lua:!test [EVENT] testEvent
[10/05/24 11:20:13.345] Lua:!test [LUA] test Str	<nil>	
[10/05/24 11:20:13.345] LuaEngine [EVENT] onInit
[10/05/24 11:20:13.588] Main [INFO] Server up-to-date!

The interesting part is:

[10/05/24 11:20:13.345] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 11:20:13.345] Lua:!test [LUA ERROR] SOL2 assertion failure: Assertion `push_count == 1` failed in /__w/BeamMP-Server/BeamMP-Server/bin/vcpkg_installed/x64-linux/include/sol/stack.hpp:208. This *should* be a fatal error, but BeamMP Server overrides it to not be fatal. This may cause the Lua Engine to crash, or cause other issues.
[10/05/24 11:20:13.345] Lua:!test [WARN] Passed a value of type 'function' to TriggerGlobalEvent("testEvent", ...). This type can not be serialized, and cannot be passed between states. It will arrive as <nil> in handlers.
[10/05/24 11:20:13.345] Lua:!test [DEBUG] json: ["test Str","BEAMMP_SERVER_INTERNAL_NIL_VALUE"]
[10/05/24 11:20:13.345] Lua:!test [EVENT] testEvent
[10/05/24 11:20:13.345] Lua:!test [LUA] test Str	<nil>	

Which tells me that the issue is before the type validation for the arguments, and the fact that by passing 2 args, i get the error twice makes me think that is is located between line 461 and 462!

@lionkor lionkor self-assigned this May 10, 2024
@Neptnium
Copy link
Contributor Author

Neptnium commented May 10, 2024

Update

It could also be Table.add that causes the issue
https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L469
https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L473
https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L479

All of this seems to correspond to raw_table_set of SOL2's stack.hpp function wich calls SOL_ASSERT(push_count == 1);

@lionkor lionkor added this to the next patch milestone May 10, 2024
@lionkor
Copy link
Contributor

lionkor commented May 10, 2024

Update

It could also be Table.add that causes the issue https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L469 https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L473 https://github.com/BeamMP/BeamMP-Server/blob/minor/src/TLuaEngine.cpp#L479

All of this seems to correspond to raw_table_set of SOL2's stack.hpp function wich calls SOL_ASSERT(push_count == 1);

it was exactly this, thank you very much :)

@lionkor
Copy link
Contributor

lionkor commented May 10, 2024

I wrote this in the commit for the fix as well, but basically, the behavior of add is not well defined when the table is not sequential, and we're also using it in a bit of an odd way. Replacing it with set and some boilerplate seems to work fine!

@Neptnium
Copy link
Contributor Author

I wrote this in the commit for the fix as well, but basically, the behavior of add is not well defined when the table is not sequential, and we're also using it in a bit of an odd way. Replacing it with set and some boilerplate seems to work fine!

Ok, this explains it, Thanks a lot for the quick fix !!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants