In testing, it appears to stick on some pages/files (but maybe that's just 
freenet), and obviously it only updates the progress bar and not the rest of 
the information about a download. I'm guessing maybe failed blocks aren't being 
reported? I haven't seen any indication of any failed blocks in all my testing, 
which seems rather unlikely...

As far as I can see, this is the approximate changelog (detailed comments 
below):
Purpose: To use javascript and a single push connection per browser to update 
various pages in real time. Currently, just the progress page. In future, the 
connections and queue pages will also be refreshed dynamically, and this work 
will also form the basis of a solution for the slow inline image loading 
problem.
Generated code:
- Everything inside staticfiles/freenetjs/ is generated. The contents of this 
dir are deleted when running ant distclean. Generating it requires the GWT 
jars, which compile java to javascript.
- The source code for this is currently in generator/js/.
- The GWT jars must be in generator/js/lib/.
Connection sharing:
- One window makes a connection.
- Every 100ms, followers process messages from the leader.
- Keepalive every 1sec, failover after 3sec.
- Failover assigns a new leader, arbitrated by /failover/ on the node (only 
allows failover from a request ID that was on the awaiting notifications list).
HTMLNode generation:
- Script formatting.
- generateChildren() to render a node's children to a string buffer.
- BaseUpdateableElement: base class of any updatable HTMLNode. Has the original 
ToadletContext, and an updateState() function to regenerate it.
- ProgressBarElement: an updatable element for a progress bar. Refactored from 
fproxy.
- Requests have a unique ID, available from ToadletContext, and put in a hidden 
value in PageMaker.
Event tracking:
- PushDataToadlet: fetch data from here.
- PushNotificationToadlet: poll for updates from here.
- PushKeepaliveToadlet: send keepalives here.
- FailoverToadlet: arbitrates failover.
- PushDataManager: Tracks elements that need updating, elements currently 
displayed, etc.
- Client sends a keepalive every 10 seconds. Anything not received in 21 
seconds is pruned.
Refactoring:
- Factor out FProxyFetchTracker.getFetcher().
Trivial:
- 2x test commits.

My comments about the code:

Synchronization issues in PushDataManager: In the early commits this was 
inconsistent, are you happy with it now?

Hidden input for the request ID (in PageMaker): is this valid HTML? IIRC it's 
not inside a form?

Is separating data from notifications more efficient, even though it involves 
more round-trips?

Re "+" in base64, you could just use a different encoding - the freenet 
nonstandard base64 for example. You can easily change the base64 code used in 
the java code to deal with this? OTOH you could avoid it completely with some 
changes to the wire format...

In the cleaner thread:
+                               for (Entry<String, Boolean> entry : new 
HashMap<String, Boolean>(isKeepaliveReceived).entrySet()) {
...
+                                               
isKeepaliveReceived.put(entry.getKey(), false);

Is this safe? You don't get ConcurrentModificationException's?

Please use Ticker rather than java timers, because of thread pooling and thread 
priority issues.

Would it make sense to randomise the failover interval slightly, so that one 
fails over and then the other two don't need to?

You are assuming we will almost never reach MAX_MESSAGES, and in that case the 
output will just be a little out of date, this is probably reasonable.

PushDataManager.awaitingNotifications only contains the "leaders", correct? But 
all events are broadcast to all leaders? (Javadocs for the variables would be 
nice)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 835 bytes
Desc: This is a digitally signed message part.
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20090617/a381b748/attachment.pgp>

Reply via email to