flush() | was Re: FileSystem API Comments

2014-10-31 Thread Arun Ranganathan
Greetings Ali!

I’ve been thinking about the discussion of flush(), and would like to see if I 
can make my previous statement a bit more nuanced. It turns out that flush() 
(in the vein of fsync/sync) is pretty useful, and after discussion with a few 
folks within Mozilla, I realize that it isn’t as simple as tacking it on to the 
“write-family” of Promises — as you point out, it is a potentially expensive 
operation.

Something like a flush feature might help the following use cases:

1. Creating a database technology on top of the filesystem technology. This 
might include IndexedDB, but also WebSQL (as a hypothetical example). Most 
transactional operations like this need the ability to do something like flush.

2. Then, there’s the use case of compiling C++ codebases to JS. Well-known 
examples of this are games, leveraging asm.js. In this genre of use case, 
sometimes a large database is brought over (e.g. sqlite). It could be memory 
backed, but it is a definite bonus if it could be filesystem backed. Something 
like flush helps make that a possibility.

Now the question is how to do this in a WebAPI, allowing for the power along 
with the mitigations that a web app might need, notably for performance? A few 
ideas below:

On Oct 21, 2014, at 4:36 PM, Ali Alabbas a...@microsoft.com wrote:

  * flush()
  - This is costly functionality to expose and is likely to be overused by 
 callers. It would be beneficial to automatically flush changes to disk by 
 allowing the default file write behavior by the OS. For example, on Windows, 
 we would leave it up to the filesystem cache to determine the best time to 
 flush to disk. This is non-deterministic from the app's point of view, but 
 the only time it is a potential problem is when there's a hard power-off. 
 Most apps should not be concerned with this; only apps that have very high 
 data reliability requirements would need the granular control of flushing to 
 disk. In those cases a developer should use IndexedDB. So we should consider 
 obscuring this functionality since it's not a common requirement and has a 
 performance impact if it's widely used.


I agree with the idea of obscuring the functionality a bit, especially given 
that it might not be necessary for a large class of operations. A few ways to 
do that:

1. Add this to a dictionary option when coining the FileHandleWritable from the 
Directory (e.g. add it to something like the OpeWriteOptions: 
http://w3c.github.io/filesystem-api/Overview.html#widl-Directory-openWrite-Promise-FileHandleWritable--DOMString-File-path-OpenWriteOptions-options).

This way, the developer has the ability to “coin” a “more expensive” promise, 
if that particular set of write operations needs this feature.

2. Add this to the set of options on the FileHandleWritable.

This could be by dictionary, again. Or, it could be a boolean on the 
FileHandleWritable’s write(). This latter might not be specific enough. Like 
other implementations, ours is not going to buffer anything, but rely on the 
underlying operating system’s buffer for writes and reads.

3. Stick with the idea of a method, like flush(). In this case, we might have 
to caveat the use of this, since the possibility of inexperienced developer 
misuse is high :-) It might help to see if we can determine some boundaries on 
this.

Any feedback on some of these options would be valuable. I am thinking of 1. 
and 2.

— A*





[url] Feedback from TPAC

2014-10-31 Thread Sam Ruby

bcc: WebApps, IETF, TAG in the hopes that replies go to a single place.

- - -

I took the opportunity this week to meet with a number of parties 
interested in the topic of URLs including not only a number of Working 
Groups, AC and AB members, but also members of the TAG and members of 
the IETF.


Some of the feedback related to the proposal I am working on[1].  Some 
of the feedback related to mechanics (example: employing Travis to do 
build checks, something that makes more sense on the master copy of a 
given specification than on a hopefully temporary branch.  These are not 
the topics of this email.


The remaining items are more general, and are the subject of this note. 
 As is often the case, they are intertwined.  I'll simply jump into the 
middle and work outwards from there.


---

The nature of the world is that there will continue to be people who 
define more schemes.  A current example is 
http://openjdk.java.net/jeps/220 (search for New URI scheme for naming 
stored modules, classes, and resources).  And people who are doing so 
will have a tendency to look to the IETF.


Meanwhile, The IETF is actively working on a update:

https://tools.ietf.org/html/draft-ietf-appsawg-uri-scheme-reg-04

They are meeting F2F in a little over a week[2].  URIs in general, and 
this proposal in specific will be discussed, and for that reason now 
would be a good time to provide feedback.  I've only quickly scanned it, 
but it appears sane to me in that it basically says that new schemes 
will not be viewed as relative schemes[3].


The obvious disconnect is that this is a registry for URI schemes, not 
URLs.  It looks to me like making a few, small, surgical updates to the 
URL Standard would stitch all this together.


1) Change the URL Goals to only obsolete RFC 3987, not RFC 3986 too.

2) Reference draft-ietf-appsawg-uri-scheme-reg in 
https://url.spec.whatwg.org/#url-writing as the way to register schemes, 
stating that the set of valid URI schemes is the set of valid URL schemes.


3) Explicitly state that canonical URLs (i.e., the output of the URL 
parse step) not only round trip but also are valid URIs.  If there are 
any RFC 3986 errata and/or willful violations necessary to make that a 
true statement, so be it.


That's it.  The rest of the URL specification can stand as is.

What this means operationally is that there are two terms, URIs and 
URLs.  URIs would be of a legacy, academic topic that may be of 
relevance to some (primarily back-end server) applications.  URLs are 
most people, and most applications, will be concerned with.  This 
includes all the specifications which today reference IRIs (as an 
example, RFC 4287, namely, Atom).


My sense was that all of the people I talked to were generally OK with 
this, and that we would be likely to see statements from both the IETF 
and the W3C TAG along these lines mid November-ish, most likely just 
after IETF meeting 91.


More specifically, if something along these lines I describe above were 
done, the IETF would be open to the idea of errata to RFC3987 and 
updating specs to reference URLs.


- Sam Ruby

[1] http://intertwingly.net/projects/pegurl/url.html
[2] https://www.ietf.org/meeting/91/index.html
[3] https://url.spec.whatwg.org/#relative-scheme