ΠΙΘΟΣ Αρχιτεκτονικό και Σεχνολογύεσ .NET Παναγιώτησ Καναβόσ
ΠΙΘΟΣ
Αρχιτεκτονικό και Σεχνολογύεσ .NET
Παναγιώτησ Καναβόσ
Object storage αντύςτοιχο του Amazon S3/Azure Blob storage
Τπηρεςύα του Synnefo
Γραμμϋνο ςε Python
Clients για Web, Windows, iOS, Android, Linux
Synnefo
Client API
REST βαςιςμϋνο ςτο OpenStack Object Storage API
Accounts, Containers χωρύσ Folders
GET για data, object info
PUT, POST για upload και update data
Δομή
Extensions ςτο API
Block Storage
Partial Upload/Download
Permissions, Versions
Metadata Queries
UUIDs για Object IDs
Object updates (copy, move)
Χαρακτηριςτικά API
Δεν υπϊρχουν folders
Placeholder directory object για metadata
Block updates ΜΟΝΟ
Merkle hashing για εντοπιςμό αλλαγμϋνων block
Χρόςη SHA256
Merkle Hashing
Top Hash
Hash of #1-2 Hashes
Block #1 Hash
Block #2 Hash
Hash of #2-3 Hashes
Block #3 Hash
Block #4 Hash
Διαδικαςία Download
Get Hashmapfrom server
Calculate local hashmap
Find different blocks
Download blocks
Patch local file with blocks
Διαδικαςία Upload
Calculate local hashmap
PUT to serverServer responds
with missing block hashes
PUT missing blocks at
container levelRepeat from #2
Server responds 201
Pithos Client
Πολλαπλϊ accounts ανϊ μηχϊνημα
υγχρονιςμόσ τοπικού folder με account ςτον Πύθο
Εντοπιςμόσ τοπικών αλλαγών και upload
Εντοπιςμόσ αλλαγών ςτο server και download
Τπολογιςμόσ Merkle Hash για κϊθε αρχεύο
Η αρχιτεκτονική
UI
WPF
MVVM
CaliburnMicro
Core
File Agent
Poll Agent
Network Agent
Status Agent
Networking
CloudFiles
HttpClient
Storage
SQLite
SQL Server Compact
Τεχνολογίεσ
.ΝΕΣ 4, εξαιτύασ των Windows XP Visual Studio 2012 + Async Targeting Pack UI - Caliburn.Micro Concurrency - TPL, Parallel, Dataflow Network – HttpClient Hashing - OpenSSL - Σαχύτερο του native
provider για hashing Storage - NHibernate, SQLite/SQL Server
Compact Logging - log4net
Οι προκλήςεισ
Χειριςμόσ πιθανόσ εκατοντϊδων file events
Hashing πολλών/μεγϊλων αρχεύων
Πολλαπλϋσ αργϋσ κλόςεισ ςτο server
Αςταθϋσ δύκτυο
Παρόλαυτα να μην κολλϊει
Minimal UI με επαρκεύσ πληροφορύεσ
Χειριςμόσ Events
• Listen
• Wait for Idle
File Agent
• Get Server hashes
• Compare hashes
• Identify changes
Poll Agent
• Queue requests
• Process each file
Network Agent
• Network ops for files
Uploader/Downloader
Χειριςμόσ Events (2)
Χρόςη producer/consumer
Αποθόκευςη των events ςε ConcurrentQueue
Επεξεργαςύα ΜΟΝΟ μετϊ από timeout
Merkle Hashing
Γιατύ μιςώ το Game of Thrones
Αςύγχρονη ανϊγνωςη blocks
Παρϊλληλο Hashing κϊθε block
Χρόςη OpenSSL επειδό ϋχει SSE
Περιοριςμόσ ςτο concurrency
Προςοχό ςτη μνόμη!
Memory Leaks ςε Managed Environment!
4ΜΒ Blocks? Large Memory αλλϊ …
Γρόγορο διϊβαςμα 2GB ανϊ 64ΚΒ
Κατϋβαςμα 600ΜΒ ανϊ x KBs
Σρελόσ αριθμόσ αντικειμϋνων που περιμϋνει collection κατϊ τη διϊρκεια CPU/IO intensive processing
Που να προλϊβει ο Garbage Collector!
Hashing 100% CPU?
Καλό το multicore αλλϊ
Μπλοκϊρει το ςύςτημα για μεγϊλα αρχεύα!
Επιλογό για περιοριςμό των παρϊλληλων block hash ops
Βελτιώςεισ:
Περιοριςμόσ για «μεγϊλα» αρχεύα
«Throttling» του File Read
Πολλαπλέσ αργέσ κλήςεισ
Κϊθε κλόςη ϋνα Task
Σαυτόχρονα REST calls ανϊ account και shares
Task.WhenAll για να επεξεργαςτούμε όλα τα αποτελϋςματα
Αςταθέσ Δίκτυο
Χρόςη System.Net.Http.HttpClient
Αποθόκευςη των blocks ςε cache
Έλεγχοσ για orphans
Αςύγχρονο Retry των κλόςεων
Αντοχή ςε ςκαςίματα
Χρόςη Transactional NTFS αν εύναι διαθϋςιμο
Thanks MS for killing it!
Σροποπούηςη αντιγρϊφων και File.Replaceδιαφορετικϊ
Να μην κολλάει
Χρόςη ανεξϊρτητων agents
Asynchronous operations όπου εύναι δυνατόν
Χρόςη async/await για πιο κατανοητό κώδικα
Απαραύτητο το .ConfigureAwait(false)!
ΠΡΟΟΧΗ ςτο async void
Minimal UI
Χρόςη WPF, MVVM
Χρόςη Progress για την ενημϋρωςη του UI
Ενςωματωμϋνο ςτο .NET 4.5, αντιγραφό ςτο 4
To Shell εύναι το Icon!
Έλλειψη WPF Notification Icon
Προβληματικό Data Binding ςε menu
SQLite ή Compact CE?
Αρχικϊ SQLite -> Προβλόματα ςυγχρονιςμού (DUH !)
Write Ahead logging, ςημαύνει ότι φαύνονται παλιότερα δεδομϋνα
Αλλαγό ςε SQL Compact λόγω προβλημϊτων ςυγχρονιςμού (duh ?)
Μόπωσ ϋπρεπε να ϋχουμε κϊποιο καλύτερο caching?
Akavache?
Μύα Document DB θα όταν προτιμότερη
Επόμενα Βήματα
Δημιουργύα File Manager
Γενικό Καθϊριςμα (DUH!)
Επαναφορϊ των Unit Tests (Duh ?)
Mock Server
WebAPI? scriptcs? Yumm!
Δημιουργύα ανεξϊρτητου Pithos library
Windows RT, Windows Phone clients
ΜΕΣΑ το καθϊριςμα
Links για Πίθο
Pithos trialhttp://pithos.okeanos.io
Synnefo Documentationhttp://www.synnefo.org/docs/synnefo/latest/index.html
Pithos API Documentationhttp://www.synnefo.org/docs/pithos/latest/index.html
Pithos Windows Clienthttps://code.grnet.gr/projects/pithos-ms-client
Χρήςιμα Links
Parallel FX Team bloghttp://blogs.msdn.com/b/pfxteam
Caliburn.Microhttp://caliburnmicro.codeplex.com/
Ayende’s BufferPoolhttp://ayende.com/blog/4827/answer-stopping-the-leaks
Χρήςιμα Βιβλία
C# 5 in a Nutshell, O’Riley
Parallel Programming with .NET, Microsoft
• Pro Parallel Programming with C#, Wiley
• Concurrent Programming on Windows, Pearson
• The Art of Concurrency, O’Reilly