Feature #291

Υποστήριξη polling στον server με ?changes-since στο GET

Added by Vangelis Koukis over 13 years ago. Updated over 11 years ago.

Status:Closed Start date:03/16/2011
Priority:High Due date:03/25/2011
Assignee:Markos Gogoulos % Done:

0%

Category:old_synnefo Spent time: -
Target version:-

Description

Όπως προδιαγράφεται στο OpenStack Compute v1.1, θα υποστηρίζεται partial GET δεδομένων από τον server.
Αυτό λειτουργεί ως εξής:

α) ο πελάτης κάνει [πλήρες] GET /server/detail.
β) θυμάται την τιμή του Date: header από την απάντηση.
γ) τις επόμενες φορές κάνει GET /server/detail?changes-since=<το date της παλιάς απάντησης>

Ως απάντηση στο (γ) παίρνει μόνο τις αλλαγές από την ημερομηνία εισόδου.

Αυτό πρέπει να υλοποιηθεί στο API:
α) υπάρχει πεδίο updated σε όλα τα μοντέλα, το οποίο ανανεώνεται αυτόματα από το Django.
β) αλλάζει το φίλτρο στους handlers του GET, ώστε αντί να φιλτράρει με deleted=False να φιλτράρει για updatead > date εισόδου.

Υπάρχει θέμα αν η τιμή εισόδου στο date είναι υπερβολικά παλιά.
Να μπει ανάλογη σημείωση στον κώδικα, ότι πρέπει να καταγράφεται ποια είναι η πιο μικρή νόμιμη τιμή για το date (πότε έκανα τελευταία φορά archiving των μηχανών), ώστε οποιαδήποτε αίτηση έχει date μικρότερη αυτής να παίρνει απάντηση Bad Request.


Related issues

related to Synnefo - Feature #293: Partial refresh στο GUI Closed 03/16/2011 04/01/2011

Associated revisions

Revision 88854f35
Added by Dimitris Moraitis over 13 years ago

gt instead of gte condition, refs #291

Revision ab5282e4
Added by Dimitris Moraitis over 13 years ago

rename changes_since to changes-since & slider fix - Refs #291 #147

History

#1 Updated by Markos Gogoulos over 13 years ago

στο http://code.grnet.gr/projects/synnefo/repository/revisions/d19719cdb21417ecbd00a968d0ab5bbe5f495573 μπήκε η GET μεταβλητή changes_since η οποία αρχικά είναι κενή, ενώ μετά από κάθε κλήση GET /api/server/details αλλάζει στην ώρα που έτρεξε το request ώστε να σταλεί την επόμενη φορά.

Ο ServerHandler διαβάζει τη μεταβλητή αυτή και επιστρέφει τα machines τα οποία έχουν γίνει update την τελευταία ώρα (θα αλλάξει να παίρνει το changes_since). Αν ένα μηχάνημα έχει γίνει DESTROY κατά τη διάρκεια αυτή, το ui το καταλαβαίνει και το βγάζει απο τη λίστα

#2 Updated by Vangelis Koukis over 13 years ago

OK. Πρέπει να δεις επίσης τα εξής:

α) Η συνθήκη είναι updated__gt, πρέπει να είναι μεγαλύτερο του χρόνου changes-since, όχι ίσο, ο πελάτης ενδιαφέρεται για ό,τι άλλαξε μετά από τη στιγμή changes-since. Από το spec του OpenStack Compute 1.1: "your ReST client may use the changes-since parameter to check for changes since a previous request", οπότε ο χρόνος changes-since θα είναι πιθανότατα το Date: της απάντησης.

β) αν δεν έχει αλλάξει τίποτε, πρέπει να επιστρέφεται με τη μία HTTP 304 NOT MODIFIED: "if nothing has changed since the changes-since time, a 304 (Not Modified) response will be returned."

γ) Πρέπει να υποστηρίζεται και για το μοντέλο Image, αργότερα και για τα Disks.

δ) Όλες οι λεπτομέρειες εδώ:

http://docs.openstack.org/openstack-compute/developer/content/ch03s08.html

ΥΓ. Δεν χρειάζεται αναφορά στο πλήρες url του revision. Αρκεί μια αναφορά του στυλ "Refs #291" μέσα στο commit message, και το commit συνδέεται αυτόματα με το ticket, δείτε εδώ: http://www.redmine.org/projects/redmine/wiki/RedmineSettings#Referencing-issues-in-commit-messages και στο μέηλ που είχα στείλει προχθές.

#3 Updated by Dimitris Moraitis over 13 years ago

  • Status changed from Assigned to Feedback

Έγινε και φαίνεται να δουλεύει καλά

#4 Updated by Vangelis Koukis over 13 years ago

Σε γενικές γραμμές λειτουργεί ωραία, βλέπω ένα πλήρες GET /servers στην αρχή, και μετά GETs με ?changes-since.
Ωστόσο, υπάρχουν τα εξής προβλήματα:
α) πρέπει να υποστηρίζεται και για το GET /images
β) δεν συμβαδίζει με το OpenStack v1.1 spec: http://docs.openstack.org/openstack-compute/developer/content/ch03s08.html, το οποίο προδιαγράφει ότι η τιμή στο ?changes-since είναι ISO 8601 datetime, ή σκέτη ημερομηνία χωρίς timestamp. Δείτε εκεί για όλες τις λεπτομέρειες κι αλλάξτε το αναλόγως.
γ) δεν υπάρχει πρόβλεψη για χειρισμό λανθασμένης εισόδου από [κακόβουλο] χρήστη. Ο κώδικας κάνει χύμα int(changes-since), το οποίο στην καλύτερη μπορεί να πετάξει ValueError. ΓΕΝΙΚΑ, οποτεδήποτε γίνεται χειρισμός πραγμάτων από το χρήστη πρέπει να γράφεται αμυντικός κώδικας. Στη συγκεκριμένη περίπτωση, το Exception το πιάνει γενικά κι επιστρέφει HTTP 500, αλλά το σωστό είναι Bad Request. ΠΡΕΠΕΙ να υπάρχει ρητός χειρισμός αναμενόμενων exceptions.
δ) χρειάζεται προσθήκη tests για το ?changes-since στα unit tests. Έφτιαξα έναν κόμβο, τον βλέπω να εμφανίζεται-εξαφανίζεται κλπ στις απαντήσεις, αν παίξω με πλήρη ή partial GETs λίγο πριν φτιαχτεί και λίγο αφού φτιαχτεί;

Πάντως φαίνεται να κάνει ποοοολύ ελαφρύτερη την κοινή περίπτωση όπου κάποιος το έχει αφήσει. Απλώς παίρνει HTTP 304 NOT MODIFIED κάθε 5 sec. Μια χαρά.

#5 Updated by Vangelis Koukis over 13 years ago

  • Status changed from Feedback to Assigned

#6 Updated by Markos Gogoulos over 13 years ago

στο GET /images υπάρχει λόγος που θέλουμε να υποστηρίζεται?

#7 Updated by Vangelis Koukis over 13 years ago

Ναι.

α) το λέει το API. Είναι λογικό να το περιμένουν οι clients.
β) η υλοποίησή του είναι αντιγραφή του κώδικα για τους servers, και δεν χρειάζεται πάνω από 20λεπτο.

Υπενθυμίζω και τα υπόλοιπα σημεία, (β)-(δ).

#8 Updated by Vangelis Koukis over 13 years ago

  • Due date set to 03/25/2011

Διευκρίνιση μετά από σημερινή συνάντηση: μένει να υλοποιηθούν τα (α)-(δ).

#9 Updated by Markos Gogoulos over 13 years ago

Οκ τα α-β-γ, μένει το δ

#10 Updated by Markos Gogoulos over 13 years ago

Το changes_since δεν πρέπει να τσεκάρει οτι η ημερομηνία της τελευταίας φοράς που ρώτησε δεν είναι πολύ παλιά?

(πχ now - last_update < 1 minute)

δεδομενου οτι οταν υπαρχει changes_since, κανουμε query για ολα τα virtual machines (και τα deleted)

#11 Updated by Markos Gogoulos over 13 years ago

  • Status changed from Assigned to Feedback

οκ και το δ)

#12 Updated by Vangelis Koukis over 13 years ago

  • Status changed from Feedback to Assigned

Ισχύει ο προβληματισμός για το πόσο παλιό μπορεί να είναι το changes-since, το λέω και στην αρχική περιγραφή, το API δεν φαίνεται να προβλέπει τι συμβαίνει αν είναι υπερβολικά παλιό, ενώ θα έπρεπε. Βάλε έναν περιορισμό ότι δεν μπορεί να είναι παλιότερο από 1 ώρα [για να υπάρχει κάτι στον κώδικα], αν είναι επιστρέφει Bad Request.

Μην ξεχάσετε να τεκμηριώσετε αυτή τη συμπεριφορά.

#13 Updated by Markos Gogoulos over 13 years ago

  • Status changed from Assigned to Feedback

Έγινε στο 54f8cd6df51f9b95eadf68e45cc95d4fd97e9641

Η τιμή ορίστηκε σε 1 ώρα

#14 Updated by Constantinos Venetsanopoulos over 13 years ago

  • Status changed from Feedback to Closed

ok, closed

#15 Updated by Vangelis Koukis over 11 years ago

  • Category set to old_synnefo

Also available in: Atom PDF