Andrew, Thanks for pointing your finger at it Am 04.08.2010 um 17:48 schrieb Andrew Coppin:
> Frank Kupke wrote: >> Good questions. I am about to write a paper explaining the design of the >> DSTM library in more detail which I will link when available. Please bear >> with me, here. In the meantime please find some shorter answers below. >> > > Well, that was pretty comprehensive. A few questions remain... > >> - If the failure comes up *before* the transaction has been validated ok, it >> is aborted. > > Right. So the transaction rolls back and the application gets an exception? Yes, the transaction aborts and the application gets an exception (see remarks below). > >> - If the failure comes up *after* the transaction has been validated ok, it >> is committed. >> > > So if a TVar goes walkabout in the split second between validate and commit, > the others commit anyway, and then the application gets an exception? Yes. > > In that case, is there a way to determine whether or not the rest of the > transaction completed? Because it looks like you can the same exception > either way, regardless of whether a commit happened or not. Ah, now I see. Excellent point. I was always focussing the commit case which is well designed, I am certain. But, maybe, the abort case above is not. It would probably be better to not only abort but also restart the transaction even in presence of a failure (that is what's being done when there is no failure). I am not quite clear yet about a possible implementation of such a behavior. Currently I'm thinking: Restarting a transaction containing broken TVars will definitely fail again. To avoid that, the validation vote of a broken TVar (i.e. not able to vote any more) should be taken as a valid vote and no exception should be thrown. Eventually every transaction comes to a commit and probably that's the only place where an exception should be thrown. Then the answer to your question is clear, also. Any opinions? > >>> 4. What network transport does this thing use? TCP? UDP? What port numbers? >>> >> DSTM uses TCP communication. It searches dynamically for available ports >> starting at port 60001, using 60000 for the name server. If two nodes are >> running each on a separate machine with a different IP address, chances are >> that both use the same port 60001. If they run on the same machine, most >> likely one will use port 60001 and the other 60002. >> > > Right. So both the nameserver and any clients run on random port numbers? > (Begs the question of how the clients figure out which port a remote > nameserver is on...) Well, not quite. The name server gets a fixed 60000 to make it accessible statically, the others may vary. Their dynamic address is used to label the TVars which then always carry their correct address. > >>> 5. How does it work? Does it spawn a Haskell thread for each machine >>> connection or something? >>> >> Each node spawns a Haskell thread listening to its designated port and >> spawning itself a thread for each accepted TCP communication, i.e. one for >> each foreign node talking to it. Each such thread implements a communication >> line between two threads. I have tried several communication line schemas >> which I will describe in more detail in the paper yet to come... >> > > What impact (if any) does threaded vs non-threaded RTS have? I have done a few tests with threads and could not find a significant difference. But I really did not look deep and thorough enough into it to give a qualified answer. > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe