Quit Command corrupts standalone (stack called by standalone splash)
Richard Gaskin
ambassador at fourthworld.com
Mon Feb 26 22:38:01 EST 2018
Knapp Martin wrote:
> Thanks for the in-depth reply. Are there known issues with saving LC
> stacks to Dropbox? I was thinking of Roland's issue with corruption
> and Phil's suggested fix of watching the file with the tilde character
> before allowing a quit to complete. I have an app where users create
> documents (stacks) and saving them to Dropbox is a built-in option.
My hunch (read, "I'm likely wrong, wait for something more definitive
from someone on the core team or Brian Milby, since he reads the engine
source <g>) is that LC files are less prone to a wide range of
disk-related issues by virtue of being written in a single pass.
HyperCard, FileMaker, SQLite, and others are read and written in pages,
which works more reliably in some (SQLite) than others (no one misses
HC's 504 errors <g>). Moving stuff in and out of portions of a file
that may not change much otherwise isn't necessarily brittle in itself
(SQLite as a reputation for being enormously robust), but we can
envision how larger SQLite files may confuse a syncing system that can
only move chunks of data over a network so quickly.
Since LC files are, near as I recall, written fresh from beginning to
end with each save command, the result is usually a cleaner file than
with some paging systems.
And it's also faster to write everything in one pass than writing the
same amount of data by moving back and forth throughout a file, so my
hunch would be that LC stack files would likely be less prone to error
when synced over Dropbox than SQLite files.
But by no means should this be taken as gospel, and certainly not as any
indication that we should drop SQLite and use stack files instead.
Different formats for different purposes.
And as Mark Wieder noted, some of the biggest challenges with syncing
occur with multiple users accessing a given resource simultaneously.
Those are very real challenges, which may be why so many developers over
the years keep writing their own sync mechanisms, with no single
solution having emerged as the one-size-fits-all answer.
Consider this scenario with stack files, for example:
Mark writes a stack, then I open it, then you open it. You and I are
both making changes, and I save mine a few seconds before you save
yours. In that scenario, what's on disk?
When I get back to work on the file tomorrow, I'll likely be
disappointed to find that everything I'd done is now gone. I can see
only your changes, since yours were the last saved and when you saved
you hadn't yet updated to have a copy with my changes. So after Dropbox
faithfully performs everything we ask it to do, my changes are gone forever.
Write-locking can help with things like that, and that's a subject in
itself. At what level of granularity should we lock? And before
editing begins do we first compare what's in memory with what's in the
data store to ensure what we're about to edit is the most recent copy?
How do we handle conflicts, when one inevitably occurs?
So many ways to handle sync....
> I have one customer who stores their stacks on a network server and
> a few times they've ended up with a corrupted stack.
Corruption is very interesting to me. Lost data is usually explainable
through simple multiuser workflow weaknesses, such as inadequate locking
mechanisms. But corruption in LC means something interrupted the write,
or overwrote portions before the write was completed. And since LC
stacks files are written in a single pass, whatever caused it to corrupt
was very efficient at it, as it had little time to do it in.
I can conceive of a possible scenario in which neither Dropbox nor LC
has a bug per se at all, but which may account for corruption:
1. Your app issues a save command on a large stack.
2. Dropbox begins syncing the file to the server.
3. Your friend has the same file open on his machine.
4. On his machine, Dropbox notices the server has a newer version, and
prepares to update his copy.
5. He starts a save in his stack.
6. Dropbox has written a portion of the stack from the server to his
disk, but stopped when it noticed the file was being updated.
7. After your friend's save is done, the corrupted stack is then copied
to the server, where it later propagates to your machine.
RESULT: everyone now has the same file, and it's broken.
I haven't studied the file system triggers and server monitoring that
trigger reads and writes in Dropbox. And if it's proprietary, chances
are no one outside that company has either.
There are many ways that imagined scenario might for all I know be
accounted for in the way Dropbox is written. But there may also be
other scenarios that can produce the same corrupted result that I
haven't thought of.
--
Richard Gaskin
Fourth World Systems
Software Design and Development for the Desktop, Mobile, and the Web
____________________________________________________________________
Ambassador at FourthWorld.com http://www.FourthWorld.com
More information about the use-livecode
mailing list