API does not protect from race conditions

If two clients PUT the same resource (such as a goal with its many fields) simultaneously, one of the two will win and overwrite the earlier update. The earlier changes will be lost completely and there is no easy way for either client to be notified of this.
Optimistic Locking is one way to address this: The client provides together with the update the timestamp of the resource’s last known update and the server only performs the update if this supplied timestamp equals the resource’s most recent update. If they don’t equal, the server knows that the resource was updated unbeknownst to the client and can indicate this via a HTTP status code.
IMHO this is well suited for Beeminder for a number of reasons, one of them being that most resources already provide this timestamp, such as the goal and user resource with their updated_at field.
The other reason being that the Beeminder server sees low data contention, presumably.

Alternatively, the API could use an HTTP ETag, which is basically the same thing, just as HTTP header.

Ruby on rails does support optimistic locking out of the box: https://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html

On the chance that Beeminder does already offer optimistic locking: Why is it neither documented nor mandatory?

Thoughts? @bee


Yes please. I have a weird bug with my Greasemonkey script that keeps track of total web pages loaded. The script should ++ the lastest data point, but it will sometimes add extra data points due to this issue.

1 Like