[Gambas-user] Concurrent gb.settings

Tobias Boege taboege at ...626...
Fri Feb 12 13:25:46 CET 2016


Hi Benoit,

in my project I use a Gambas library which manages some kind of flat file
database where "config" files in gb.settings format play a role. The current
project I use the library in is a gb.web.form project. I got to install it
on a friend's server and on its first day of runtime, I noticed that the
config files got corrupted: either the whole file or some lines of them
vanished.

I suspect that this is due to the library saving the configs on exit.
Naturally the gb.web.form project initialises and exits very often and
concurrently. I must add that the project only reads the database and does
not modify it, so the writing is useless. And indeed after I modified the
library to not issue explicit Settings.Save()'s and refuse to modify any
value in a Settings object (which would trigger the auto-save mechanism in
gb.settings), the server ran for 34 hours now without a problem.

Clearly I'm at fault for the file corruption here, but does this problem not
sound common enough to deserve some thought about a solution inside of
gb.settings?

I could imagine a Settings.ReadOnly property which when set to True disables
the automatic saving of configuration files in Settings._free() (and maybe
cancels even explicit Settings.Save()s). That's the pattern I now have in my
library, to restrict access to Settings methods.

There are two things that puzzle me though:
  1. Apparently gb.settings already uses lock files to counter this sort of
     corruption. What happened?[*]
  2. How could sometimes a whole config file vanish, i.e. it is not only
     emptied but does not exist anymore in the filesystem.

If you have no idea, maybe I can reproduce the issue... [ JFTR: whenever it
happened that a part of a web page, like a background image, could not be
loaded, it was an indicator that a config corruption happened. Probably the
server crashed in an unhandled error (from Settings.Save()) before the file
was sent. So even if I can't reproduce it, I might still verify that it is
gb.settings. ]

Sorry for the long mail. Some passages are just reminders for myself :-)

Regards,
Tobi

[*] Maybe this theory makes sense: imagine three processes are trying to
    write the settings concurrently.

    The #1 gets the lock and begins writing. Now #2 kicks in and fails to
    get the lock. In the Finally block in Settings.Save(), it Kills #1's
    lock file (is that possible if #1 still holds the lock?). Then #3 can
    acquire the lock again and writes concurrently with #1.

-- 
"There's an old saying: Don't change anything... ever!" -- Mr. Monk




More information about the User mailing list