-
Notifications
You must be signed in to change notification settings - Fork 8
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
Panic when trying to remove a node #21
Comments
Thanks for the bug report! I'm not sure when I'll have time to track it
down, but feel free to keep looking for the cause.
At some point I'll have free time and will track it down if you haven't
found the already.
David Roundy
…On Fri, Aug 30, 2024, 2:51 PM Michael ***@***.***> wrote:
I recently started using this library in a work project (thank you for
making awesome open source ❤️ 💛 💙 💚 💜)
I got a few occurences of panics that happened in production and after
some digging and attempted to reproduce locally I have come up with a
minimal reproducible.
#[test]
fn test_tiny_set() {
let mut set = SetU64::new();
set.remove(90);
set.insert(158);
set.remove(90);
set.insert(159);
set.remove(90);
set.insert(160);
set.remove(90);
set.insert(161);
set.remove(90);
set.insert(162);
set.remove(90);
set.insert(163);
set.remove(90);
set.insert(164);
set.remove(90);
set.insert(165);
set.remove(90);
set.insert(166);
set.remove(90);
set.insert(167);
set.remove(90);
set.insert(168);
set.remove(90);
set.insert(169);
set.remove(90);
set.insert(170);
set.remove(90);
set.insert(171);
set.remove(90);
set.insert(172);
set.remove(90);
set.insert(173);
set.remove(90);
set.insert(174);
set.remove(90);
set.insert(175);
set.remove(90);
set.insert(176);
set.remove(90);
set.insert(177);
set.remove(90);
set.insert(178);
set.remove(90);
set.insert(179);
set.remove(90);
set.insert(180);
set.insert(181);
set.insert(181);
set.remove(94);
set.remove(95);
set.remove(96);
set.remove(97);
set.remove(98);
set.remove(99);
set.remove(100);
set.remove(101);
set.remove(102);
set.remove(103);
set.remove(104);
set.remove(105);
set.remove(106);
set.remove(107);
set.remove(108);
set.remove(109);
set.remove(110);
set.remove(111);
set.remove(112);
set.remove(113);
set.remove(114);
set.remove(115);
set.remove(116);
set.remove(117);
set.remove(118);
set.remove(119);
set.remove(120);
set.remove(121);
set.remove(122);
set.remove(123);
set.remove(124);
set.remove(125);
set.remove(126);
set.remove(127);
set.remove(128);
set.remove(129);
set.remove(130);
set.remove(131);
set.remove(132);
set.remove(133);
set.remove(134);
set.remove(135);
set.remove(136);
set.remove(137);
set.remove(138);
set.remove(139);
set.remove(140);
set.remove(141);
set.remove(142);
set.remove(143);
set.remove(144);
set.remove(145);
set.remove(146);
set.remove(147);
set.remove(148);
set.remove(149);
set.remove(150);
set.remove(151);
set.remove(152);
set.remove(153);
set.remove(154);
set.remove(155);
set.remove(156);
set.remove(157);
set.remove(158);
set.remove(159);
set.remove(160);
set.remove(161);
set.remove(162);
set.remove(163);
set.remove(164);
set.remove(165);
set.remove(166);
set.remove(167);
set.remove(168);
set.remove(169);
set.remove(170);
set.remove(171);
set.remove(172);
set.remove(173);
set.remove(174);
set.remove(175);
set.remove(176);
set.remove(177);
set.remove(178);
set.remove(179);
set.remove(180);
set.insert(90);
set.remove(90);
set.insert(85);
set.insert(86);
set.remove(181);
set.remove(85);
set.insert(182);
set.remove(182);
set.insert(86);
set.remove(86);
set.insert(183);
set.remove(183);
set.insert(184);
set.remove(184);
set.insert(185);
set.remove(185);
set.insert(186);
set.remove(186);
set.insert(187);
set.remove(187);
set.insert(188);
set.remove(188);
set.insert(189);
set.remove(189);
set.insert(190);
set.remove(190);
set.insert(191);
set.remove(191);
set.insert(192);
set.remove(192);
set.insert(193);
set.remove(193);
set.insert(194);
set.remove(194);
set.insert(195);
set.remove(195);
set.insert(196);
set.remove(196);
set.insert(197);
set.remove(197);
set.insert(198);
set.remove(198);
set.insert(199);
set.remove(199);
set.insert(200);
set.remove(200);
set.insert(201);
set.remove(201);
set.insert(202);
set.remove(202);
set.insert(203);
set.remove(203);
set.insert(204);
set.remove(204);
set.insert(205);
set.remove(205);
set.insert(206);
set.remove(206);
set.insert(207);
set.remove(207);
set.insert(208);
set.remove(85);
set.remove(86);
set.remove(183);
set.remove(184);
set.remove(185);
set.remove(186);
set.remove(187);
set.remove(188);
set.remove(189);
set.remove(190);
set.remove(191);
set.remove(192);
set.remove(193);
set.remove(194);
set.remove(195);
set.remove(196);
set.remove(197);
set.remove(198);
set.remove(199);
set.remove(200);
set.remove(201);
set.remove(202);
set.remove(203);
set.remove(204);
set.remove(205);
set.remove(206);
set.remove(207);
set.insert(208);
set.remove(86);
set.remove(14);
set.insert(10);
set.remove(208);
set.insert(209);
set.remove(10);
set.insert(8);
set.remove(209);
set.insert(210);
set.remove(8);
set.insert(211);
set.remove(210);
set.insert(209);
set.remove(209);
set.insert(208);
set.remove(211);
set.insert(8);
set.remove(8);
set.insert(5);
set.remove(208);
set.insert(207);
set.remove(5);
set.insert(1);
set.remove(207);
set.insert(212);
set.remove(1);
set.insert(0);
set.remove(212);
set.insert(213);
set.remove(0);
set.remove(213);
set.insert(212);
set.remove(212);
set.insert(207);
set.remove(207);
set.insert(206);
set.remove(206);
set.insert(214);
set.remove(214);
set.insert(215);
set.remove(215);
set.insert(214);
set.remove(214);
set.insert(206);
set.remove(206);
set.insert(205);
set.remove(205);
set.insert(216);
set.remove(216);
set.insert(217);
set.remove(217);
set.insert(216);
set.remove(216);
set.insert(205);
set.remove(205);
set.insert(204);
set.remove(204);
set.insert(218);
set.remove(218);
set.insert(219);
set.remove(219);
set.insert(218);
set.remove(218);
set.insert(204);
set.remove(204);
set.insert(203);
set.remove(203);
set.insert(220);
set.remove(220);
set.insert(221);
set.remove(221);
set.insert(220);
set.remove(220);
set.insert(203);
set.remove(203);
set.insert(202);
set.remove(202);
set.insert(222);
set.remove(222);
set.insert(223);
set.remove(223);
set.insert(222);
set.remove(222);
set.insert(202);
set.remove(202);
set.insert(201);
set.remove(201);
set.insert(224);
set.remove(224);
set.insert(225);
set.remove(225);
set.insert(224);
set.remove(224);
set.insert(201);
set.remove(201);
set.insert(200);
set.remove(200);
set.insert(226);
set.remove(226);
set.insert(227);
set.remove(227);
set.insert(226);
set.remove(226);
set.insert(200);
set.remove(200);
set.insert(199);
set.remove(199);
set.insert(228);
set.remove(228);
set.insert(229);
set.remove(229);
set.insert(228);
set.remove(228);
set.insert(199);
set.remove(199);
set.insert(198);
set.remove(198);
set.insert(230);
set.remove(230);
set.insert(231);
set.remove(231);
set.insert(230);
set.remove(230);
set.insert(198);
set.remove(198);
set.insert(197);
set.remove(197);
set.insert(232);
set.remove(232);
set.insert(233);
set.remove(233);
set.insert(232);
set.remove(232);
set.insert(197);
set.remove(197);
set.insert(196);
set.remove(196);
set.insert(234);
set.remove(234);
set.insert(235);
set.remove(235);
set.insert(234);
set.remove(234);
set.insert(196);
set.remove(196);
set.insert(195);
set.remove(195);
set.insert(236);
set.remove(236);
set.insert(237);
set.remove(237);
set.insert(236);
set.remove(236);
set.insert(195);
set.remove(195);
set.insert(194);
set.remove(194);
set.insert(238);
set.remove(238);
set.insert(239);
set.remove(239);
set.insert(238);
set.remove(238);
set.insert(194);
set.remove(194);
set.insert(193);
set.remove(193);
set.insert(240);
set.remove(240);
set.insert(241);
set.remove(241);
set.insert(240);
set.remove(240);
set.insert(193);
set.remove(193);
set.insert(192);
set.remove(192);
set.insert(242);
set.remove(242);
set.insert(243);
set.remove(243);
set.insert(242);
set.remove(242);
set.insert(192);
set.remove(192);
set.insert(191);
set.remove(191);
set.insert(244);
set.remove(244);
set.insert(245);
set.remove(245);
set.insert(244);
set.remove(244);
set.insert(191);
set.remove(191);
set.insert(190);
set.remove(190);
set.insert(246);
set.remove(246);
set.insert(247);
set.remove(247);
set.insert(246);
set.remove(246);
set.insert(190);
set.remove(190);
set.insert(189);
set.remove(189);
set.insert(248);
set.remove(248);
set.insert(249);
set.remove(249);
set.insert(248);
set.remove(248);
set.insert(189);
set.remove(189);
set.insert(188);
set.remove(188);
set.insert(250);
set.remove(250);
set.insert(251);
set.remove(251);
set.insert(250);
set.remove(250);
set.insert(188);
set.remove(188);
set.insert(187);
set.remove(187);
set.insert(252);
set.remove(252);
set.insert(253);
set.remove(253);
set.insert(252);
set.remove(252);
set.insert(187);
set.remove(187);
set.insert(186);
set.remove(186);
set.insert(254);
set.remove(254);
set.insert(255);
set.remove(255);
set.insert(254);
set.remove(254);
set.insert(186);
set.remove(186);
set.insert(185);
set.remove(185);
set.insert(256);
set.remove(256);
set.insert(257);
set.remove(257);
set.insert(256);
set.remove(256);
set.insert(185);
set.remove(185);
set.insert(184);
set.remove(184);
set.insert(258);
set.remove(258);
set.insert(259);
set.remove(259);
set.insert(258);
set.remove(258);
set.insert(184);
set.remove(184);
set.insert(183);
set.remove(183);
set.insert(260);
set.remove(260);
set.insert(261);
set.remove(261);
set.insert(260);
set.remove(260);
set.insert(183);
set.remove(183);
set.insert(86);
set.remove(86);
set.insert(83);
set.insert(182);
set.remove(182);
set.insert(85);
set.remove(83);
set.insert(61);
set.remove(61);
set.insert(262);
set.remove(85);
set.insert(82);
set.remove(262);
set.insert(263);
set.remove(82);
set.insert(59);
set.remove(59);
set.remove(263);
set.insert(262);
set.remove(262);
set.insert(264);
set.remove(264);
set.insert(262);
set.remove(262);
set.insert(59);
set.insert(61);
set.remove(61);
set.insert(265);
set.remove(61);
}
On the last operation I get an error like this:
thread 'dag::tests::test_tiny_set' panicked at /Users/mries/code/peg/native/dag/vendor/tinyset/src/setu64.rs:2289:5:
bug: we should have had space in [265, 59] for 61
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
I'm continuing to look around in the code to understand why this
happening, but I'm relatively new to rust. Hopefully this reproducible is
useful to identify the root cause.
—
Reply to this email directly, view it on GitHub
<#21>, or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AABBSKMDAQC6Y2SPBMVAIILZUDSMVAVCNFSM6AAAAABNNGHN4OVHI2DSMVQWIX3LMV43ASLTON2WKOZSGQ4TQMRSGIZTSNQ>
.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
I made a bit of progress on this problem today. I was able to reduce the size of the reproducible, but it's pretty large. I was also able to determine that when this panic occurs, the
|
Looking at the debug output a bit more closely, it looks like we have a fully populated array of set entries. When we call Is a fully populate array supposed to be a valid state here? It seems to me like we should just be returning |
I was able to narrow this down even further. This only happens after the set transitions to using a "Big" internal representation and if you try to remove values where the initial guess for the location is not at the beginning of the array. Here's another example:
#[test]
fn collision_panic() {
let mut set = SetU64::new();
set.remove(90);
set.insert(158);
set.remove(90);
set.insert(159);
set.remove(90);
set.insert(160);
set.remove(90);
set.insert(161);
set.remove(90);
set.insert(162);
set.remove(90);
set.insert(163);
set.remove(90);
set.insert(164);
set.remove(90);
set.insert(165);
set.remove(90);
set.insert(166);
set.remove(90);
set.insert(167);
set.remove(90);
set.insert(168);
set.remove(90);
set.insert(169);
set.remove(90);
set.insert(170);
set.remove(90);
set.insert(171);
set.remove(90);
set.insert(172);
set.remove(90);
set.insert(173);
set.remove(151);
set.remove(152);
set.remove(153);
set.remove(154);
set.remove(155);
set.remove(156);
set.remove(157);
set.remove(158);
set.remove(159);
set.remove(160);
set.remove(161);
set.remove(162);
set.remove(163);
set.remove(164);
set.remove(165);
set.remove(166);
set.remove(167);
set.remove(168);
set.remove(169);
set.remove(170);
set.remove(171);
set.remove(172);
set.remove(173);
set.remove(174);
set.remove(175);
set.remove(176);
set.remove(177);
set.remove(178);
set.remove(179);
set.remove(180);
set.insert(90);
set.remove(90);
set.insert(85);
set.insert(86);
set.remove(181);
set.remove(85);
set.insert(182);
set.remove(182);
set.insert(86);
set.remove(86);
set.insert(10);
set.remove(208);
set.insert(209);
set.remove(10);
set.insert(8);
set.remove(209);
set.insert(210);
set.remove(8);
set.insert(211);
set.remove(210);
set.insert(209);
set.remove(209);
set.insert(208);
set.remove(211);
set.insert(8);
set.remove(8);
set.insert(5);
set.remove(208);
set.insert(207);
set.remove(5);
set.insert(1);
set.remove(207);
set.insert(212);
set.remove(1);
set.insert(0);
set.remove(212);
set.insert(213);
set.remove(0);
set.remove(213);
set.insert(212);
set.remove(212);
set.insert(207);
set.remove(207);
set.insert(206);
set.remove(206);
set.insert(214);
set.remove(214);
set.insert(215);
set.remove(215);
set.insert(214);
set.remove(214);
set.insert(206);
set.remove(206);
set.insert(205);
set.remove(205);
set.insert(216);
set.remove(216);
set.insert(217);
set.remove(217);
set.insert(216);
set.remove(216);
set.insert(205);
set.remove(205);
set.insert(204);
set.remove(204);
set.insert(218);
set.remove(218);
set.insert(219);
set.remove(219);
set.insert(218);
set.remove(218);
set.insert(204);
set.remove(204);
set.insert(203);
set.remove(203);
set.insert(220);
set.remove(220);
set.insert(221);
set.remove(221);
set.insert(220);
set.remove(220);
set.insert(203);
set.remove(203);
set.insert(202);
set.remove(202);
set.insert(202);
set.remove(202);
set.insert(201);
set.remove(201);
set.insert(224);
set.remove(224);
set.insert(225);
set.remove(225);
set.insert(224);
set.remove(224);
set.insert(201);
set.remove(201);
set.insert(199);
set.remove(199);
set.insert(228);
set.remove(228);
set.insert(229);
set.remove(229);
set.insert(228);
set.remove(228);
set.remove(230);
set.insert(198);
set.remove(198);
set.insert(197);
set.remove(197);
set.insert(187);
set.remove(187);
set.insert(186);
set.remove(186);
set.debug_me("dense?");
set.insert(258);
set.debug_me("big?");
set.insert(260);
set.debug_me("full?");
set.remove(2);
} |
Thanks so much for looking into this, it was really helpful! |
Thanks @droundy glad our use-case could help to harden the project. We're very grateful for your open source work as it made our project a lot more efficient to represent directed edges as tinysets. |
I recently started using this library in a work project (thank you for making awesome open source ❤️ 💛 💙 💚 💜)
I got a few occurences of panics that happened in production and after some digging and attempted to reproduce locally I have come up with a minimal reproducible.
On the last operation I get an error like this:
I'm continuing to look around in the code to understand why this happening, but I'm relatively new to rust. Hopefully this reproducible is useful to identify the root cause.
The text was updated successfully, but these errors were encountered: