تخطَّ إلى المحتوى

الترقية من أجزاء SQLite القديمة

عند البدء يُستأنف استرداد عمليات تبديل إعادة التضمين المتقطعة، ويحوّل فهارس libSQL DiskANN إلى محرك Turso الحالي، ثم يتحقق من مخطط الجزء القديم أو يرقّيه. يعمل تحويل المحرك حتى عندما يحمل المخزن بالفعل علامة ترحيل قديمة مكتملة، ويحافظ على المتجهات المخزّنة دون إعادة تضمين. تُنسخ كل قاعدة بيانات محوَّلة احتياطيًا باسم <database>.pre-tursodb-<timestamp>.bak.

على macOS وLinux، يمكن لعدة جلسات OpenCode مشاركة نفس storagePath عبر multiprocess_wal التجريبي من Turso (يجب أن يستخدم كل عملية نفس الوضع — أعد تشغيل جميع الجلسات بعد الترقية). على Windows يرفض المحرك ذلك العلم، لذا يمكن لجلسة OpenCode واحدة فقط امتلاك قواعد بيانات الذاكرة في وقت واحد.

يفتح tursoMultiprocessWal: false في وضع المالك الواحد بدلًا من ذلك: تفشل العمليات الأخرى بـ database is locked بدل مشاركة المخزن. هذا الخيار أكثر أمانًا إذا لمست أدوات خارج المكوّن الإضافي نفس الملفات، لأن عملية SQLite أجنبية تكتب تجعل فهرس WAL لـ Turso قديمًا وتُفقد الكتابة التالية بصمت. ينقل tursoAutoHeal (الافتراضي true) ملفات الفهرس الجانبية -shm/-tshm للمخزن إلى storagePath/recovery/<db>-<timestamp>/ ويعيد المحاولة مرة عند فشل الفتح بسبب فهرس WAL قديم، بعد التحقق من نسخة من قاعدة البيانات الرئيسية. لا يُنقل -wal غير الفارغ أبدًا، فتبقى المعاملات المُلتزَم بها وغير المُتحققَنَة؛ يُزال فقط -wal المفقود أو ذو حجم 0 بايت. تُسلسل الجلسات المتزامنة الإصلاح عبر storagePath/recovery/<db>.lock.

عند أول تشغيل بعد الترقية، يرحّل opencode-mem تلقائيًا قواعد بيانات أجزاء الذاكرة الحالية إلى تنسيق متجهات Turso/libSQL الأصلي:

  • يُنسخ كل جزء احتياطيًا باسم <shard>.db.legacy.bak قبل إعادة الكتابة
  • يُتتبَّع التقدم لكل جزء في <shard>.db.turso-migrate.json
  • تُكتب علامة عالمية .turso-migrated فقط بعد التحقق الناجح من جميع الأجزاء
  • لا تُبطل الإدراجات والحذف العادية ترحيل جزء مكتمل؛ لا يزال البدء يتحقق من أن المتجهات قابلة للقراءة وتطابق الأبعاد المخزّنة
  • لا تشغّل عدة نسخ من OpenCode ضد نفس storagePath أثناء الترحيل؛ يمنع ملف قفل (.turso-migrate.lock) الترحيل المتزامن
  • تستخدم ترحيلات الأبعاد اليدوية .turso-operation.lock؛ ترفض عمليات المكون الإضافي الأخرى كتابات الذاكرة الجديدة حتى ينتهي الترحيل
  • تنتهي الأقفال بعد 30 دقيقة دون تحديث طابع زمني للتقدم (أو وقت تعديل الملف إن تعذّر الطابع)، حتى لو كانت العملية المالكة حيّة. يستخدم هذا الإيجار ساعة الحائط: قفزة ساعة للأمام أكبر من 30 دقيقة قد تُنهي عملية جارية مبكرًا؛ قفزة للخلف أو قفل مؤرخ في المستقبل قد يمدّد عمر قفل خامل. تحمل الأقفال معرّف اقتناء فريدًا، وتنظيف الأقفال البالية يزيل فقط الملف الذي فحصه. ترسل الترحيلات نبضات أثناء التقدم وتُلغى إذا اكتشفت فقدان الملكية. يُسجَّل تنظيف الأقفال البالية للتشخيص.

إذا انقطع الترحيل، يستأنف التشغيل التالي تلقائيًا من النسخة الاحتياطية.

إذا أصبح جزء غير متوافق (مثلًا بعد تغيير embeddingDimensions)، تُحظر الكتابات وتُترك قاعدة البيانات الأصلية دون مساس. استخدم ترحيل إعادة التضمين في واجهة الويب لبناء بديل والتحقق منه قبل تبديله في مكانه. يبقى الجزء السابق متاحًا باسم <shard>.db.pre-reembed-<pid>-<timestamp>.bak.