From 33dd599c3d29549cdd6c3dde0194897ce5f0a27a Mon Sep 17 00:00:00 2001 From: DarkSky Date: Sat, 27 Jan 2024 15:42:02 +0800 Subject: [PATCH 1/2] fix: conflict check when reference right is none --- .cargo/config.toml | 3 +++ y-octo/src/doc/store.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 4768414..2603371 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,5 @@ [env] CARGO_WORKSPACE_DIR = { value = "", relative = true } + +[unstable] +gc = true diff --git a/y-octo/src/doc/store.rs b/y-octo/src/doc/store.rs index aeb8316..d13eaea 100644 --- a/y-octo/src/doc/store.rs +++ b/y-octo/src/doc/store.rs @@ -554,7 +554,6 @@ impl DocStore { let mut right = right.get_mut_unchecked(); right.left = item_owner_ref.clone(); } - this.right = right.clone(); } else { // no right, parent.start = this, delete this.left if let Some(parent_sub) = &this.parent_sub { @@ -565,6 +564,7 @@ impl DocStore { } } } + this.right = right.clone(); let parent_deleted = parent.item.get().map(|item| item.deleted()).unwrap_or(false); From e027223aa9a791a0fbed43aa60a564d2d8c9a23d Mon Sep 17 00:00:00 2001 From: DarkSky Date: Sat, 27 Jan 2024 15:49:03 +0800 Subject: [PATCH 2/2] feat: add edge case doc --- y-octo/src/doc/codec/update.rs | 5 +++++ y-octo/src/doc/document.rs | 17 +++++++++++++++++ .../edge-case-left-right-same-node.bin | Bin 0 -> 6673 bytes 3 files changed, 22 insertions(+) create mode 100644 y-octo/src/fixtures/edge-case-left-right-same-node.bin diff --git a/y-octo/src/doc/codec/update.rs b/y-octo/src/doc/codec/update.rs index 1f48eb0..d107666 100644 --- a/y-octo/src/doc/codec/update.rs +++ b/y-octo/src/doc/codec/update.rs @@ -466,6 +466,11 @@ mod tests { (include_bytes!("../../fixtures/database.bin").to_vec(), 1, 149), (include_bytes!("../../fixtures/large.bin").to_vec(), 1, 9036), (include_bytes!("../../fixtures/with-subdoc.bin").to_vec(), 2, 30), + ( + include_bytes!("../../fixtures/edge-case-left-right-same-node.bin").to_vec(), + 2, + 243, + ), ]; for (doc, clients, structs) in docs { diff --git a/y-octo/src/doc/document.rs b/y-octo/src/doc/document.rs index a180ffc..8acad3f 100644 --- a/y-octo/src/doc/document.rs +++ b/y-octo/src/doc/document.rs @@ -608,4 +608,21 @@ mod tests { assert_eq!(&text.to_string(), "hello world"); }); } + + #[test] + #[cfg_attr(any(miri, loom), ignore)] + fn test_apply_update() { + let updates = [ + include_bytes!("../fixtures/basic.bin").to_vec(), + include_bytes!("../fixtures/database.bin").to_vec(), + include_bytes!("../fixtures/large.bin").to_vec(), + include_bytes!("../fixtures/with-subdoc.bin").to_vec(), + include_bytes!("../fixtures/edge-case-left-right-same-node.bin").to_vec(), + ]; + + for update in updates { + let mut doc = Doc::new(); + doc.apply_update_from_binary_v1(&update).unwrap(); + } + } } diff --git a/y-octo/src/fixtures/edge-case-left-right-same-node.bin b/y-octo/src/fixtures/edge-case-left-right-same-node.bin new file mode 100644 index 0000000000000000000000000000000000000000..c598191e22f76dbbe31283bf842935d152550615 GIT binary patch literal 6673 zcma)=O>84c6~|M(i3!QfWY7@AtdKC;)n<{#gY)Sm9FP-#2?)zway zCy}Das`u}z_kQnH^{ZyS3;y%RfBpUD$P5TnMY-0}rVpB-Eq;HkATDgLL^9d!x^j@` z!P_H_E}-?aRe=L0U590peOX;(JF=kybCRvs1qrSyYy%D`I#AUFSppB388rWm{)07M z5IGe}BY1Q|QDtRS7jzLa#M9;MfzgpxHtKSzu%;;)JsFkOv8MszDOHF32n>393wf#; zYMrfNXC0C2>=<$@Ky@~7({>h$uni?$!~RT;>OBPl^9ye}oDD&TtAeCMRbs_eiPeP; zd=pJPIo4rC1A=h}%BV$~8UsO5&vjJW;lK@>P? zlB{D6j>6>tkh@cZ9Po6XwmEcrCJ)RTUk~34-&+oc@2xC;0}G~XL6xnw8meqaR#CkX z3ONY~kzUI1WmnhevPQqnw~ABHK&J zoRx{us;u)k1e7$cVdYKJaAbGKG`%N64D$6GRaxbrnqxV^(7=OnH2dol&Ujupg5bd@ z9-Ty^_7vurCW``xZ4(;Lajww`?yYJeY?v|B*YT`)#=WEsY-T^#X zSUZe&4=ZLq?I6iNRfl{E4(9*1yJ=Onp|T1;AoCSLkXi&mrwE+VAJt)3N5HYc z8eztrGQVSmN%e2kv5(zZ>z`2h{>}-;btv9~p9$=+VXd%(t%qq*pwb_uQ zaLH&i14aVx*f3`RQFhmt(n;8?u&KrM*+@aCwxX(FDW5w^`@glq9rDD6uw0UkihIRM zV>g-%M`yLAeA|7Zjh|qCY5%I@3_JuR1=K|m+lSzKIY2sJ5*`9-79N6OX>cw5JbdH{ zyKNM2Ub_rYWm>bf8`f_a^F(EbzvhumXe&-568@7O3pPK&`G@*O3Jkm zQcs-Z+o-6%lHJ5A>3mfxZ^cWCjYXjwPnTBKBJOTN6MYQ8$Y%&Ap}4XY&1Tq5K3k|{ zwC!Gutt2t0mmW@3A>#D%nw*f%$LS@V)61cpTnpj!XNQv&o;gkR745W7z|Cl8Gnj*Q zXthK&IN~|L+U&d--Kxwj*Jfu8t&y$I!}WDAGX31%c4&ovS^xn7*q%$K(xrkh-<1yw zyX(N#u%1vl%Z=Ka(LOBeyDb63IP<`u3K5L6Yr;S}AB;0P zjI*IITnnkDC!Uz8zLJ>3W;h88hiOGsFZJTX&+DCTF^j2Y>CF+Zcn z{A_5W{*F@di%41t5qfBfkWp9Dt8nY&_2o8^UVAtojEh30-+ z2(MS7?wR|sdw3Ied?F?!+AHZDK~^gIW=IxUIcC+1J@Ys@FQ_^!yYjejX0v5paL(}M z!@?Q$o)ru~H-kJv!_GlrD{tN2RiG4%30lq2`WH^^BYXT)Hcb0XMRlGqh=&q#F2C4J zX?sPz-V1M;b9>vEfv3Nw>JWpg`)k`NN9JST>#rTLmjUXp2MitxZ_Ro7XX`rDvC2aW z)=`(z3N}>8>Ot$TYFO8AtFya*|GvZNi-Z$3K*A}MQ_K51iDap6>}jx5sET}{f1cVt zl}W8obyzl7EBGEN3YtEk@F6Nw%cSf@G+s4C5n8<{Di&Of25WL#ktOTP$7OU~I=b!NAFZi}8=sen-_NSvzzb5+^FU?RCS=GOci_>z1TAe3g2;(2S zr@c8%g+n0Eub6YCBcs_~YR0>fh54LN+el-`=N`yZA%c8k}Q?F*9V-e$VN8?XHCyEa~;QW;)UmtMNHyOG<6$;yXLik#)Zwe{TE! zo;wl2oLi|j%4w~%QCKh{`?E%?W^VK^hxP-f9?Vpss~da~QNARi`RMK5DV_BxrfGjO z^)@@MrO(-U^S;N}OZ=R%8fB`lB<5CODc7~G!m6>gzn#h%jgAoMe|fPd@ZJHbLRWXa zm??Kav<~$h?B4WzF}oHL^Ak_ZR9~Hh2fmtl445-8_8aip@4?;wfxET`%*gmpn2G-b D#h@(P literal 0 HcmV?d00001