-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDESIGNDOC
37 lines (25 loc) · 5.82 KB
/
DESIGNDOC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
სერვერი მუშაობისთვის მოითხოვს openssl ბიბლიოთეკას. დაყენება : sudo apt-get install libssl-dev
სერვერისა და კლიენტის კოდი განთავსებულია ცალ-ცალკე შესაბამის დირექტორიებში.
1) კლიენტის გაშევბისას პროგრამა ხსნის და კითხულობს კონფიგურაციის ფაილს. თუ ფაილი ვერ მოიძებნა, იწერება შესაბამისი შეტყობინება და კლიენტი წყვეტს მუშაობას.
კონფიგურაციის ფაილიდან წაკითხული ინფორმაცია ინახება structs.h ფაილში აღწერილ სტრუქტურებში:
//ინახავს ინფორმაციას კლიენტის (და არა დისკების) შესახებ
struct meta_info {
char* errorlog_path;
int cache_size; // in MB
char* cache_replacement_algorithm; //only implementing lru
int timeout; // in s?
};
//ინახავს თითოეულ დისკთან დაკავშირებულ ინფორმაციას
struct disk_info {
char* diskname;
char* mountpoint;
int raid;
char** servers;
int num_servers;
char* hotswap;
};
struct disk_info* raids-ში ინახება ინფორმაცია კონფიგურაციის ფაილში გაწერილი ყველა დისკის შესახებ.
ამ სტრუქტურების ცალკე ფაილში გატანა საჭირო იყო, რათა მათი გამოყენება შესაძლებელი ყოფილიყო როგორც net_raid_client.c-ში, რომელიც ეშვება კლიენტის გაშვებისას, ასევე raid1_fuse.c-ში, რომელშიც ხდება სისქოლების გადატვირთვა.
2) კონფიგურაციის ფაილის წაკითხვის შემდეგ კლიენტი გადაუყვება raids მასივში შენახულ დისკებს და თითოეულისთვის ქმნის ცალკე პროცესს. ეს პროცესი თავის მხრივ იძახებს შესაბამის wrapper-ს fuse_main-ზე. რათა მოხდეს თითოეული სანახის mountpoint-ის დამაუნთება და ამ დირექტორიაში მომხამრებლის მუშაობისას შესაბამისი სისქოლების გამოძახება.
3) RAID 1
ყველა შექმნილი ფაილის დუბლირება ხდება კონფიგურაციის ფაილში გაწერილ ორ სერვერზე. ჩაწერა ხდება stable storage მექანიზმით. მეორე სერვერზე ფაილის/დირექტორიის შექმნა/ცვლილება ხდება მას შემდეგ, რაც ეს ცვლილება სრულად აისახება პირველ სერვერზე. სერვერზე ფაილის შეცვლის (ან შექმნის) შემდეგ ახლდება extended attribute-ად შენახული ამ ფაილის ჰეში. ფაილების დაზიანების ამოცნობა ხდება open syscall-ის გამოძახებისას. თუ ფაილის კონტეტნის ჰეში არ ემთხვევა შენახულ ჰეშს, შესაბამისი ინფორმაცია ეგზავნება კლიენტს. კლიენტს ასევე ორივე სერვერიდან ეგზავნება ფაილის ჰეში, რომ მათი ერთმანეთთან შედარება იყოს შესაძლებელი. თუ რომელიმე სერვერიდან დაბრუნდა პასუხი, რომ ფაილი ამ სერვერზე დაზიანებულია, მეორე სერვერიდან მოხდება ამ ფაილის გადმოწერა (თუ მეორე სერვერზე არაა დაზიანებული). თუ ფაილი ორივე სერვერზე დაუზიანებელია, მაგრამ ამ ფაილების ჰეშები არ ემთხვევა ერთმანეთს, უფრო ნაკლები ინდექსის მქონე სერვერიდან მოხდებამ მეორეზე გადმოწერა, რადგან პირველად ყოველთვის დაბალი ინდექსის მქონე სერვერზე ხდება ცვლილებელი ფაილებში (TODO: ცვლილების თარიღის მიხედვით უნდა გავაკეთო)