کلودفلر (Cloudflare) گزارشی در مورد یکی از بزرگترین حوادثی که زیرساختهای آن را تحت تأثیر قرار داده است، منتشر کرده است که دیروز بخش عمدهای از شبکه تحویل محتوای آن را به مدت بیش از سه ساعت از دسترس خارج کرد. این قطعی پس از تغییر در ساختار پایگاه دادهای که در فضای ذخیرهسازی ClickHouse میزبانی میشد، رخ داد که اندازه فایل حاوی پارامترهای سیستم ضد ربات را دو برابر کرد. جداول تکراری در پایگاه داده ایجاد شدند، با وجود این واقعیت که پرس و جوی SQL مورد استفاده برای تولید فایل، به سادگی تمام دادهها را از همه جداول بر اساس کلید بازیابی میکرد، بدون اینکه موارد تکراری را فیلتر کند. SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;

فایل ایجاد شده به تمام گرههای موجود در کلاستر که درخواستهای ورودی را پردازش میکردند، توزیع شد. در هندلری که از این فایل برای بررسی درخواستهای ربات استفاده میکرد، پارامترهای مشخص شده در فایل در RAM ذخیره میشدند و برای محافظت در برابر مصرف بیش از حد حافظه، کد شامل محدودیتی برای حداکثر اندازه فایل بود. در شرایط عادی، اندازه واقعی فایل به طور قابل توجهی کوچکتر از حد مجاز بود، اما پس از کپی کردن جداول، از حد مجاز فراتر رفت.
مشکل این بود که به جای مدیریت صحیح مقدار از حد مجاز و ادامه استفاده از نسخه قبلی فایل، و اطلاعرسانی به سیستم مانیتورینگ در مورد وضعیت اضطراری، کنترلکننده دچار مشکل میشد و ارسال ترافیک بیشتر را مسدود میکرد. این خطا ناشی از استفاده از متد unwrap() با نوع Result در کد Rust بود.

وقتی مقدار نتیجه "Ok" باشد، متد unwrap() شیء مرتبط با آن حالت را برمیگرداند، اما اگر نتیجه ناموفق باشد، فراخوانی منجر به خاتمه غیرطبیعی میشود (ماکرو "panic!" فراخوانی میشود). Unwrap() معمولاً در هنگام اشکالزدایی یا هنگام نوشتن کد آزمایشی استفاده میشود و برای استفاده در پروژههای عملیاتی توصیه نمیشود.


منبع: opennet.ru
