2013-07-14 2 views
5

Gemäß der Dokumentation für zumero_sync:Warum muss zumero_sync mehrmals aufgerufen werden?

Wenn eine große Menge an Informationen muss von dem Server, diese Funktion gezogen werden kann mehr als einmal aufgerufen werden muß.

In meiner Android-App, die Zumero verwendet, ist das kein Problem; Ich rufe einfach weiter zumero_sync, bis der Rückgabewert nicht mit "0;" beginnt.

Aber jetzt versuche ich, einen Admin-Skript zu schreiben, das auch mit meinem Server dbfiles synchronisiert. Ich möchte die Shell sqlite3 verwenden und das Skript das SQL übergeben lassen, um es über Befehlszeilenargumente auszuführen. Ich muss zumero_sync in einer Schleife aufrufen (die SQLite nicht unterstützt), um sicherzustellen, dass die Datenbank vollständig synchronisiert ist. Wenn ich müsste, könnte ich sqlite3 in einer Schleife aufrufen (Lesen seiner Ausgabe, auf der Suche nach "0;"), oder sogar eine C++ App schreiben, um die SQLite/Zumero-Funktionen nativ aufzurufen. Aber es wäre sicherlich einfacher, wenn eine einzige zumero_sync genug wäre.

Ich denke, meine Frage ist: zumero_sync geändert werden könnte, damit es die Synchronisierung vor der Rückkehr abgeschlossen? Wenn es Fälle gibt, in denen das vorhandene Verhalten nützlicher ist, könnte es möglicherweise einen Parameter geben, um festzulegen, welcher Modus verwendet werden soll?

Antwort

4

Ich sehe zwei grundlegende Fragen hier:

(1) Warum zumero_sync() funktioniert, wie es funktioniert?

(2) Kann es anders funktionieren?

Ich antworte zuerst (2), da es einfacher ist: Ja, es könnte anders funktionieren. Stattdessen könnten wir (und wahrscheinlich werden Sie das auch bald umsetzen) eine zusätzliche Funktion namens zumero_sync_complete() implementieren, die [den Kern von] zumero_sync() in einer Schleife ausführt und nach Abschluss der Synchronisierung zurückkehrt.

Wir haben nicht versucht zumero_sync_complete(), weil es nicht viel Wert hinzufügt. Es ist eine einfache Schleife, also kannst du es gut selber schreiben. :-)

Er, außer in Scripting-Umgebungen, die keine Schleifen unterstützen. Wie die sqlite3-Shell.

Antwort (1):

Das Zumero Sync-Protokoll ist so konzipiert, dem Server die Flexibilität zu geben, Teilergebnisse zurück, wenn es so tun will. Und um die Belastung des Servers zu reduzieren (und seine Skalierbarkeit zu erhöhen), versucht es oft genau das zu tun.

Vor diesem Hintergrund besteht ein Grund, dies dem Kunden zur Verfügung zu stellen, darin, die Flexibilität des Kunden zu erhöhen. Solange wir mehrere Roundtrips machen, können wir dem Kunden auch die Möglichkeit geben, etwas dazwischen zu tun (wie zB einen Fortschrittsbalken zu aktualisieren).

Eine andere Sache, die ein Client zwischen Schleifeniterationen machen möchte, ist ein Fehler.

Oder im Fall eines Multi-Thread-Client, könnte es mit Änderungen umgehen will, die auf dem Client passiert ist, während die Synchronisierung los ist.

Welche Frage stellt sich, wie Locking verwaltet werden sollte?Halten wir die SQLite-Schreibsperre während der gesamten Schleife? Oder nur wenn absolut notwendig?

Fazit: Eine robuste App würde wahrscheinlich die Schleife selbst implementieren wollen, so dass sie ihre eigenen Entscheidungen treffen und die volle Kontrolle über die Dinge behalten kann.

Aber wie Sie sehen, hat die sqlite3-Shell keine Schleifen. Und es ist keine App. Und es hat keine Threads. Oder Fortschrittsbalken. Es ist also ein Anwendungsfall, in dem eine einfachere und weniger mächtige Form von zumero_sync() sinnvoll wäre.

+0

Danke Eric! Übrigens, ich finde es großartig, dass Zumero so viel Kontrolle über den Synchronisierungsprozess bietet. –