HeadlinesBriefing HeadlinesBriefing.com

مُحلِّل دوري يجد شروط السباق في بناءات Nix

Hacker News •
×

يومًا ما كتبت عن Rewind VM، آلة افتراضية دورية حيث يكون كل تشغيل لبناء Nix دالة صافية لمدخلاته، بما في ذلك جدول الخيوط! استخدمتها لاكتشاف شروط السباق في بناءات Nix، وتكاثرها، وحلها، لكنها جعلتني أشعر بقلة الاتزان. ما هذه القوة الفائقة، ولماذا لا يستخدمها الآخرون؟

لقد نمت الأداة بسرعة لتصبح لوحة مصادر، إطارات كول، علامات ت Bookmarks، تاب "Compare"، دعمmany لـ GDB، قنوات خيوط تُظهر من امتلك المعالجة في كل خطوة، و"Check from here"، التي تساعد في العثور على الخطوة الدقيقة حيث يحدث شرط سباق. دخلت في كل ميزة جديدة أthought كانت ستتطلب نقلًا ضخًا للnist، لكنني واجهت نفس الشيء مرارًا: الجزء الصعب من كل ميزة كان بالفعل مكتملًا، وNix قام به.

مثلاً، يحتاج المُحلِّل إلى المدخلات الدقيقة لل程序، ورموز التصحيح، ومصادرها، ومصادر كل مكتبة تحتها، وطريقة لكي ي 获取 كل ذلك على جهاز شخص آخر. هذا هو بالتحديد ما تفعله Derivation، وNix يجعله سهلاً.

اثنان من الصناديق، حساب واحد

مثال كلاسيكي بسيط ل-condition سباق هو خيطان يوديعان في حساب بنكي واحد. كل ودعة تقرأ الرصيد، تكتب خطًا في الدفتر، ثم تحفظ الرصيد بالإضافة إلى الودعة. إذا جرى الصندوق بين قراءة الشريك وحفظه، يكتب رصيدًا قديمًا على ودائع الشريك.

static void deposit(int teller, long amount){long seen = balance;char line[64];int n = snprintf(line, sizeof line,"teller %d: %ld + %ld\n",teller, seen, amount);if (write(1, line, n) != n)return;balance = seen + amount;}

الصناديق الذي يjem بين قراءة الشريك وحفظه يكتب رصيدًا قديمًا على ودائع الشريك.

11

في جهاز اللاب توب الذي يحتوي على 16 أنوية، فقدت Bank المال في 396 من 1,000 تشغيل. تم ربطها بأنوية واحدة مع taskset، لم تفقد المال في أي من 1,000: أنوية واحدة نادرًا ما تغيّر الخيوط في منتصف الودعة،لهذا السبب Rewind يُ disturbance الجدول.

VM Rewind تحتوي على معالجة واحدة، لذاruns الأول يمر بسهولة. rewind check يexecutes Build مرتين تحت جدول م disturbance، كل one يطلب من kernel الضيف重新 تخطيط في خطوات مختلفة، ويقلل الفشل الأول إلى خطوة واحدة:

$ rewind check --where github:fzakaria/rewindvm#bank...step 3237 يحدد: there reschedule يجعل Runs فشل

passing: run 12feb5f832205a72, schedule 0

failing: run c2f1cfac0c288f3e, schedule 1 over steps 3237..3238

الruns الثلاثة نفس الآلة، خرج for خرج، حتى خطوة 3237، حيث يplanes فقط الفشل reschedule.

الشيء/free الأول: المدخلات

arguments لـ check هو Derivation و يمكن أن يكون flake reference. جمال Nix أنه يعلم inputs لـ Derivation، لذا فهذا كل ما نحتاجه لضمان reproducible. inputs Derivation هي Source، Compiler، Libraries، Kernel، و VM configuration. Rewind nix يimplements inputs Derivation، يpack Closure في صورة read-only erofs، و يboot VM عليها. id Run هو hash inputs، كما أن store path، و rewind show يprint command that makes it again:

$ rewind show 12feb5f8

rewind nix /nix/store/cr8rl40rjb9cmmcd9sxn9mpdrhvp53jj-bank-0.1.0.drv --epoch --clock branches --name bank-0.1.0 # 12feb5f832205a72

عندما يًuccess Build، يُبلغ الضيف كل output NAR hash، و rewind nix يcheckها ضد نسخة Host و ضد كل binary cache Nix substitutes من، بـ fetching فقط .narinfo:

$ rewind nix github:fzakaria/rewindvm#bank.../nix/store/27a4q7w90jzp4wg5kaaajvb64zll6yqg-bank-0.1.0 dbf0df3de84b7a84 matches your store

هذا يساعدنا على validate أن Build داخل VM هو نفس Build على اللاب توب، و أن VM Run هو reproducible من Nix.

المصدر: Hacker News · لخّصه HeadlinesBriefing