Recent submissions

Comment · 2 years ago
Thank you for taking the time to explains this. I am still a bit confused, if external consistency is not trying to solve global serial order, but only solving read from client point of view, such that all committed transaction before read timestamp will be returned and none of the transaction after read timestamp will be returned.

I am confused on why each data node have to wait 7ms to commit, isn't it easier to ask whichever client is reading to read from the maximum uncertainty timestamp?

Assume the following example

    nodeA is on time
    trxA arrive nodeA at (true time 7ms, A time 7ms, B time 0ms)
    trxA commit by nodeA at (true time 8ms, A time 8ms, B time 1ms)

    nodeB lag by 7ms
    trxB arrive nodeB at (true time 9ms, A time 9ms, B time 2ms)
    trxB is commit by nodeB at (true time 10ms, A time 10ms, B time 3ms)

    nodeD ahead by 7ms
    trxD arrive nodeD at (true time 9ms, D time 16ms, B time 2ms, A time 9ms)
    trxD commit by nodeD at (true time 10ms, D time 17ms, B time 3ms, A time 10ms)

For example if client C is reading and client C lags real world time by 7ms

    ClientC ask to read node A and B for transaction on real-world time 11ms local time 4ms 
    instead to ask all transaction before 4ms, ClientC will ask all transaction before 4ms + 2x_uncertainty(14ms) = 18ms

    trxA(8ms) < 18ms -> trxA will be read
    trxB(3ms) < 18ms -> trxB will be read
    trxD(17ms) < 18ms -> trxD will be read
Instead of asking each node to wait to commit timestamp, this guarantees any commit happened before read in real-world time is read, and none of the commit happend after read in real-world is read (since we are requesting read at the time read happens)
Comment · 2 years ago
please bear with me on this, running through the example even when the wait kicked in trxA's timestamp (14ms nodeA time) is still greater than trxB's timestamp (9ms nodeB time) which violate gcp's definition of external consistency?

> To be externally consistent, a transaction must see the effects of all the transactions that complete before it and none of the effects of transactions that complete after it, in the global serial order

Example when both node waited

    real-world time = 7ms
    node A local time = 7ms
    node B local time = 0ms


    trxA arrive nodeA at (real-world time 7ms, A time 7ms, B time 0ms)
    wait 7ms before commit
    trxA commit by nodeA at (real-world time 14ms, A time 14ms, B time 7ms)

    trxB arrive nodeB at (real-world time 9ms, A time 9ms, B time 2ms)
    wait 7ms before commit
    trxB is commit by nodeB at (real-world time 16ms, A time 16ms, B time 9ms)
result, localtime(trxA) = 14ms , localtime(trxB) = 9ms

No wait example

    real-world time = 7ms
    node A local time = 7ms
    node B local time = 0ms


    trxA arrive nodeA at (real-world time 7ms, A time 7ms, B time 0ms)
    trxA take 1ms to commit
    trxA commit by nodeA at (real-world time 8ms, A time 8ms, B time 1ms)

    trxB arrive nodeB at (real-world time 9ms, A time 9ms, B time 2ms)
    trxB take 1ms to commit
    trxB is commit by nodeB at (real-world time 10ms, A time 10ms, B time 3ms)

result, localtime(trxA) = 8ms , localtime(trxB) = 3ms

in both cases localtime(trxA) > localtime(trxB) , external consistency is not achieved?

and in the no wait example the transactions are not concurrent, only when it waited it became concurrent?

I must be missing something here?

Live from the official Hacker News API

A modern reader for Hacker News · SvelteKit + Skeleton