2012-04-28

Một bản "cực kỳ" nháp syncing file (file storage)


Theo cách liệt kê thì tất cả các trường hợp có thể conflict:

Đối với file
Local
Remote
Notes
Created
Created
Type 1
Created
Modified
Hạn chế *
Created
Renamed
Hạn chế *
Created
Deleted
Hạn chế *
Created
Deleted container folder
Có thể không coi là conflict **
Modified
Created
logically
Modified
Modified
Type 2
Modified
Renamed
Type 2
Modified
Deleted
Type 3
Modified
Deleted container folder
Type 4
Renamed
Created
logically
Renamed
Modified
Type 2
Renamed
Renamed
Type 2
Renamed
Deleted
Type 3
Renamed
Deleted container folder
Type 4
Deleted
Created
logically
Deleted
Modified
Type 3
Deleted
Renamed
Type 3
Deleted
Deleted
Type 5
Deleted
Deleted container folder
Type 6

* hạn chế là trường hợp ít khả năng xảy ra, ví dụ Created – Modified là ít khả năng xảy ra, khi local tạo file mà không biết rằng remote đã tạo file, và không biết cả việc thay đổi nội dung file sau đó.
** trường hợp Created file vs Deleted parent folderCreated folder vs Deleted parent folder có thể không coi là conflict vì chúng ta sẽ phải luôn giữ các file mới tạo tại remote dù đã bị xóa tại local vì vấn đề an toàn (do local không biết nội dung file/folder mới tạo).
Notes: trường hợp loại bỏ là liệt kê theo logic và không tính là conflict à dạng Deleted vs CreatedModified (Renamed) vs Created à sẽ phải rơi vào trường hợp Created vs Created và phải giải quyết trước khi có thể xảy ra, implementation sẽ không để xảy ra những trường hợp này.

Đối với folder tương tự nhưng không có modified, chỉ còn trường hợp renamed
Local
Remote
Notes
Created
Created
Type 7
Created
Renamed
Hạn chế *
Created
Deleted
Hạn chế *
Created
Deleted container folder
Có thể không coi là conflict
Renamed
Created
logically
Renamed
Renamed
Type 8
Renamed
Deleted
Type 9
Renamed
Deleted container folder
Type 10
Deleted
Created
logically
Deleted
Renamed
Type 9
Deleted
Deleted
Type 11
Deleted
Deleted container folder
Type 12


Gom lại có tất cả 7 trường hợp conflict (cả case conflict)


1.       Created  file – Created file conflict

Tạo file khi không biết thông tin về file đã được tạo

2.       Modified file – Modified file conflict

Thay đổi nội dung file (kể cả đổi tên) khi không biết file đã bị thay đổi

3.       Modified file – Deleted file conflict

Thay đổi nội dung file (kể cả đổi tên) khi không biết chính file đó bị xóa

4.       Modified file – Deleted parent folder conflict

Thay đổi nội dung file (kể cả đổi tên) khi không biết folder chứa file (parent hoặc ancestor đã bị xóa)

5.       Deleted file – Deleted file conflict

Xóa file khi không biết chính file đã bị xóa

6.       Deleted file – Deleted parent folder conflict

Xóa file khi không biết folder chứa file (parent hoặc ancestor đã bị xóa)

7.       Case conflict

Trên Mac và Windows không phân biệt hoa thường trong khi trên Linux có phân biệt à case conflict giải quyết à force rename?
Dựa trên các trường hợp có thể detect conflict phân thành theo file và theo folder
DetectFileConflict(…) kiểm tra conflict từ 1 đến 6
DetectFolderConflict(…) kiểm tra conflict đối với folder

Phát hiện conflict

ü  Khi download notice changes từ server, pause sync, kiểm tra giữa 2 file list để xác định conflict về file với Type từ 1 đến 6.
ü  Khi thực hiện sync up lên server à phát hiện conflict do thực hiện thất bại và theo error code trả về.
Xét với từng loại
ü  Type 1: xác định cùng file name nhưng khác file size, modified date à conflict
ü  Type 2 & Type 3: Modified file vs Modified file và Modified file vs Deleted file
ü  Type 4: là conflict

ü  Type 5 & 6: có thể không coi là conflict

Startup syncing

Download server snapshot

Thực hiện download snapshot file và folder list trên server insert vào table snapshot tại client. Table snapshot giữ thông tin mới nhất về file và folder, chỉ download 1 lần khi start app. Table snapshot cấu trúc giống table signstore.
Table signstore dung để keep track thay đổi khi app running, mọi thay đổi nếu đã sync với server sẽ được update vào signstore.

Có thể dùng thuật toán Eugene Myers?

Tìm danh sách file chỉ có tại local và danh sách file chỉ có tại server?

Coi thông tin trong stored là chuẩn à tính diff của local files và server files để có thông tin thay đổi của local và server đối với stored.

Tính diff giữa local và stored à local deleted files, no changes và local added files.
Tính diff giữa server và stored à server deleted files, no changes và server added files.

Xử lý các trường hợp xảy ra như sau:



Giải thích:
1 + 4: local added
2 + 5: local both
3 + 6: local deleted
4 + 7: server added
5 + 6: server both
2 + 3: server deleted

1.      Local added (1 + 4)  và server added (4 + 7)

Local add bắt buộc sync up, server added bắt buộc sync down. Local va server cùng added à conflict.
1: created sync up
7: created sync down
4: conflict

2.      Local added (1 + 4) và server both (5 + 6) à không intersect

3.      Local added (1 + 4)  và server deleted (2 + 3) à không intersect

4.      Local both (2 + 5)  và server added (4 + 7) à không intersect

5.      Local both (2 + 5)  và server both (5 + 6) à không chọn vì cả 2 list cùng có nhiều items

Nếu có cả server và local kiểm tra modified cho phần 5: có cả tại local, stored và server
5: check modified

6.      Local both (2 + 5)  và server deleted (2 + 3)

2: deleted sync down
3: delete khỏi stored (có trong stored nhưng không có tại local và server)
5: check modified à làm cho case 5

7.      Local deleted (3 + 6)  và server added (4 + 7) à không intersect

8.      Local deleted (3 + 6)  và server both (5 + 6) à server both nhiều items

6: deleted sync up

9.      Local deleted (3 + 6)  và server deleted (2 + 3)

2: deleted sync down
3: không cần sync deleted à xóa khỏi stored
6: deleted sync up à làm cho case 8




No comments:

Post a Comment