לדלג לתוכן

פרויקט מאגר מקומי עמיד

נבנה שרת מקומי שמחזיק מאגר מפתחות וערכים, מקבל בקשות דרך named pipe ושומר עסקאות ביומן. המטרה היא לחבר חוזי קובץ, השלמה, פרוטוקול ו־recovery למערכת אחת שאפשר להפסיק ולהפעיל מחדש.

תחום מוגדר

המאגר מחזיק מפתחות וערכים בני שלושים ושניים ביט, ועד מאה עשרים ושמונה בקשות כתיבה ייחודיות. מזהה בקשת כתיבה נמצא בטווח אחד עד הערך המרבי של uint32, אף ששדה הפרוטוקול מאפשר שמונה בתים. חריגה מן הגבול נדחית לפני כתיבה.

השרת מטפל בלקוח אחד בכל רגע ומסיים אחרי שמונה חיבורים או timeout של המתנה לחיבור. הגבלה זו משאירה את לוגיקת העסקאות סדרתית; ה־I/O של הצינור עדיין משתמש ב־OVERLAPPED ובאיסוף completion מסודר. אין להציג את המימוש כשרת ייצור רב־לקוחות.

הפקודה create יוצרת יומן חדש ונכשלת אם הוא קיים. הפקודה open פותחת רק יומן מעבדה קיים ומבצעת recovery. אין להשתמש בקובץ שאינו שייך לניסוי. סיומת של עסקה שלא הושלמה יכולה להיחתך לאחר דיווח, אבל פגם בעסקה שלמה גורם לכישלון סגור.

פרוטוקול ותוצאה

הבקשה והתשובה תואמות למסגרות של שיעור 7.8. הסטטוסים הם אפס להצלחה, אחד למפתח חסר, שתיים לקונפליקט מזהה, שלוש לבקשה לא תקינה וארבע למגבלת קיבולת. ביט אפס בשדה הדגלים מציין שהערך נשען על מצב שאושר ביומן.

לאחר קבלת תשובה הלקוח שולח הודעת ACK בת בית אחד שערכו 0xAC. ההודעה מאפשרת לשרת לנתק בלי להשליך תשובה שעוד לא נקראה. אובדן ACK אינו מבטל עסקה שכבר אושרה.

משימות ובדיקות

ממשו כתיבה של data ו־commit, flush לפני אישור ו־replay שמחזיר תוצאה שמורה בלי לכתוב שוב. שימרו גם את מפת הערכים וגם את טבלת מזהי הבקשות בזמן recovery.

הגבילו את ה־pipe למשתמש הנוכחי ול־SYSTEM באמצעות ACL מפורש, דחו לקוחות מרוחקים ודרשו יצירת instance ראשון. תעדו שהגבול הוא חשבון משתמש, ולא זהות תוכנית מסוימת בתוך אותו חשבון.

הזריקו יציאה של תהליך השרת אחרי data, אחרי commit ואחרי flush. הפעילו מחדש ושלחו את אותה בקשה. בדקו גם שינוי תוכן עם אותו מזהה, מסגרת פגומה, לקוח שמתנתק לפני תשובה וקובץ יומן עם checksum שגוי.

הגישו קוד מלא, trace של לפחות שני מסלולי כשל וטבלת מה שהשרת והלקוח יודעים בכל נקודת קריסה. תנאי הקבלה הוא שאין אישור לפני flush מוצלח, אין החלה מחדש של מזהה מוכר ואין שחרור buffer בזמן I/O פעיל.