การเขียน SQLite ใหม่ของ Turso พบข้อผิดพลาดการเสียหายข้อมูลที่ 1GB เนื่องจาก Lock-Byte Page ที่ไม่มีเอกสารบันทึก

ทีมชุมชน BigGo
การเขียน SQLite ใหม่ของ Turso พบข้อผิดพลาดการเสียหายข้อมูลที่ 1GB เนื่องจาก Lock-Byte Page ที่ไม่มีเอกสารบันทึก

Turso โปรเจกต์ที่ทะเยอทะยานในการเขียน SQLite ใหม่ตั้งแต่เริ่มต้นด้วยภาษา Rust เพิ่งประสบปัญหาการเสียหายของข้อมูลที่น่าสับสน ซึ่งจุดประกายการถกเถียงอย่างรุนแรงในชุมชนนักพัฒนา ข้อผิดพลาดนี้ปรากฏขึ้นทุกครั้งที่ฐานข้อมูลมีขนาดเกิน 1GB ทำให้เกิดการตรวจสอบความสมบูรณ์ที่ล้มเหลวใน SQLite ตัวเดิม สิ่งที่ดูเหมือนจะเป็นข้อบกพร่องร้ายแรงในการเขียนใหม่ของพวกเขา กลับกลายเป็นฟีเจอร์ที่มีเอกสารบันทึกของ SQLite ที่ทีมงานมองข้ามไป

ภาพรวมโปรเจค Turso :

  • ภาษา: เขียน SQLite ใหม่ด้วยภาษา Rust
  • สถานะ: อยู่ในช่วงทดสอบแอลฟ่า
  • ฟีเจอร์ใหม่: CDC, การเขียนพร้อมกัน, การเข้ารหัส
  • การทดสอบ: ใช้ Deterministic Simulation Testing (DST)
  • โมเดลธุรกิจ: โอเพนซอร์สพร้อมบริการคลาวด์เชิงพาณิชย์

ปริศนาของการเสียหายข้อมูลที่ 1GB

ปัญหานี้เกิดขึ้นครั้งแรกเมื่อวิศวกร Turso ค้นพบว่าฐานข้อมูลใดๆ ที่มีขนาดเกิน 1GB จะทำให้เกิดคำเตือนการเสียหายในการตรวจสอบความสมบูรณ์ของ SQLite จังหวะเวลานั้นแม่นยำมาก - ไม่ใช่ประมาณ 1GB แต่เป็นที่เกณฑ์ 1GB พอดี ไม่ว่าข้อมูลจะมาจาก blob ขนาดใหญ่ชิ้นเดียวหรือการแทรกข้อมูลเล็กๆ หลายพันครั้งก็ไม่สำคัญ ความสม่ำเสมอนี้ทำให้ข้อผิดพลาดนั้นทั้งคาดเดาได้และน่าสับสน

วิธีการทดสอบที่ซับซ้อนของทีม ซึ่งอาศัย Deterministic Simulation Testing เป็นหลัก ไม่สามารถตรวจพบปัญหานี้ได้เลย การทดสอบ fault injection ของพวกเขา ซึ่งออกแบบมาเพื่อจำลองความล้มเหลวในโลกจริง ป้องกันไม่ให้ฐานข้อมูลเติบโตใหญ่พอที่จะถึงจุด 1GB เมื่อพวกเขาเพิ่มการทดสอบที่ไม่มีการจำลองความผิดพลาดเข้าไป รูปแบบนี้จึงปรากฏชัดเจน

การวิพากษ์วิจารณ์จากชุมชนเกี่ยวกับการวิจัยพื้นฐาน

การตอบสนองของชุมชนนักพัฒนามาอย่างรวดเร็วและเป็นการวิพากษ์วิจารณ์ หลายคนตั้งคำถามว่าทีมที่อ้างว่าสร้างระบบที่เข้ากันได้จะมองข้ามแง่มุมพื้นฐานของสถาปัตยกรรม SQLite ได้อย่างไร การวิพากษ์วิจารณ์มุ่งเน้นไปที่สิ่งที่หลายคนมองว่าเป็นความล้มเหลวในการทำวิจัยพื้นฐานก่อนที่จะพยายามเขียนใหม่ที่ทะเยอทะยานเช่นนี้

How the fuck did you manage to write a clone of SQLite without reading the description of its file format?

Lock-byte page ที่จุด 1GB ไม่ใช่ความรู้ที่ซ่อนเร้น - มีการบันทึกไว้อย่างชัดเจนในเอกสารรูปแบบไฟล์อย่างเป็นทางการของ SQLite และมีมานานกว่าทศวรรษแล้ว ฟีเจอร์นี้มีอยู่เพื่อจัดการกลไกการล็อกไฟล์ แต่การใช้งานของ Turso ไม่ได้คำนึงถึงสิ่งนี้ ทำให้เกิดปัญหาความเข้ากันได้

การสนทนาดิจิทัลระหว่างนักพัฒนาที่อภิปรายปัญหาเกี่ยวกับการดีบั๊กฐานข้อมูลและการตรวจสอบความสมบูรณ์
การสนทนาดิจิทัลระหว่างนักพัฒนาที่อภิปรายปัญหาเกี่ยวกับการดีบั๊กฐานข้อมูลและการตรวจสอบความสมบูรณ์

ปัญหาที่แท้จริงเบื้องหลังข้อผิดพลาด

สาเหตุหลักไม่ใช่การเสียหายของข้อมูลในฐานข้อมูลของ Turso จริงๆ การตรวจสอบความสมบูรณ์ของพวกเขาเองแสดงว่าฐานข้อมูลนั้นสมบูรณ์ดี ปัญหาคือ SQLite คาดหวัง pending byte เฉพาะที่จุด 1GB สำหรับกลไกการล็อก หากไม่มีการใช้งานฟีเจอร์นี้อย่างเหมาะสม SQLite จะตีความฐานข้อมูลว่าเสียหาย แม้ว่าข้อมูลเองจะยังคงสมบูรณ์

การเปิดเผยนี้เน้นย้ำถึงความกังวลที่กว้างขึ้นในชุมชนเกี่ยวกับความท้าทายในการสร้างระบบที่เข้ากันได้อย่างแท้จริง เมื่อซอฟต์แวร์ต้นฉบับมีพฤติกรรมและกรณีพิเศษที่สะสมมาหลายทศวรรษ แม้แต่ฟีเจอร์ที่มีเอกสารบันทึกดีก็สามารถถูกมองข้ามได้ง่ายๆ ระหว่างความพยายามในการใช้งานใหม่

รายละเอียดของ SQLite Lock-Byte Page:

  • ตำแหน่ง: อยู่ที่จุดหมาย 1GB ในไฟล์ฐานข้อมูล
  • วัตถุประสงค์: กลไกการล็อกไฟล์สำหรับการเข้าถึงแบบพร้อมกัน
  • เอกสาร: มีให้ในข้อกำหนดรูปแบบไฟล์อย่างเป็นทางการของ SQLite
  • ผลกระทบ: จำเป็นสำหรับความเข้ากันได้กับ SQLite หากหายไปจะทำให้การตรวจสอบความสมบูรณ์ล้มเหลว

บทเรียนสำหรับความเข้ากันได้ของฐานข้อมูล

เหตุการณ์นี้ทำให้เกิดคำถามสำคัญเกี่ยวกับแนวทางในการเขียนระบบที่มีอยู่แล้วใหม่ แม้ว่าเป้าหมายของ Turso ในการเพิ่มฟีเจอร์อย่าง CDC (Change Data Capture) การเขียนแบบพร้อมกัน และการเข้ารหัสจะมีคุณค่า แต่การถกเถียงในชุมชนแสดงให้เห็นว่าการทบทวนเอกสารอย่างละเอียดควรมาก่อนความพยายามในการใช้งาน

การแก้ไขเองนั้นตรงไปตรงมาเมื่อระบุปัญหาได้แล้ว - การใช้งานกลไก lock-byte page ที่ SQLite คาดหวัง อย่างไรก็ตาม กระบวนการค้นพบเผยให้เห็นช่องว่างในวิธีการทดสอบและแนวปฏิบัติการวิจัยที่อาจส่งผลต่อแง่มุมความเข้ากันได้อื่นๆ ของโปรเจกต์

หมายเหตุ: CDC (Change Data Capture) เป็นเทคนิคสำหรับติดตามการเปลี่ยนแปลงในฐานข้อมูลเพื่อให้แอปพลิเคชันสามารถตอบสนองต่อการเปลี่ยนแปลงเหล่านั้นแบบเรียลไทม์

อ้างอิง: An adventure in writing compatible systems