[ZODB-Dev] How to move fs files between directories?

Tim Peters tim at zope.com
Fri Jan 21 16:48:19 EST 2005


[Ammar Hakim]
> I just started using ZODB a couple of days ago. I converted an
> application using SQLITE to now use ZODB. Everything works great!

To keep it that way <wink>, do read this:

    http://zope.org/Wikis/ZODB/FileStorageBackup

> The problem I have is that I am not able to copy the fs file to some
> other location on the same machine. If I do so and try to open it,

Sorry, I'm confused already.  You first said you weren't able to copy it.
But if that's true, how could you possibly try to open the copy (that you
weren't able to make)?  I'll assume that you were in fact able to copy it,
and that the "it" in "and try to open it" refers to the copy, not to the
original.

> say from the python prompt, I get the execption IOError: [Errno 11]
> Resource temporarily unavailable.

It's a Unix file-locking thing.  I don't really understand that stuff
anymore (it's been a long time).  In general, ZODB wants at most one handle
with read access to a FileStorage open at a time.  But then if my
assumptions above are correct, I don't see any reason for the complaint
you're seeing.

Can you back up and be more specific about exactly what it is you typed at
your command prompt, from the attempt to copy onward?

> Is there some special way to copy the fs file

No, although read the page linked to above.

> or does the database need to be closed in a special way when the
> application shuts down?

You should close the database when you're done with it, via invoking its
.close() method.

> I am attaching a stack trace below.

That would be a lot more helpful if you also explained exactly what it is
you did preceding this stack trace.

> Cheers, Ammar
>
>   File
> "/usr/lib/python2.3/site-packages/ZODB/config.py", line 52, in
> databaseFromURL
>     return databaseFromConfig(config.database)
>   File
> "/usr/lib/python2.3/site-packages/ZODB/config.py", line 55, in
> databaseFromConfig
>     return section.open()
>   File
> "/usr/lib/python2.3/site-packages/ZODB/config.py", line 97, in open
>     storage = section.storage.open()
>   File
> "/usr/lib/python2.3/site-packages/ZODB/config.py", line 133, in open
>     quota=self.config.quota)
>   File
> "/usr/lib/python2.3/site-packages/ZODB/FileStorage/FileStorage.py", line
> 120, in __init__
>     self._lock_file = LockFile(file_name + '.lock')
>   File
> "/usr/lib/python2.3/site-packages/ZODB/lock_file.py", line 63, in
> __init__
>     lock_file(self._fp)
>   File
> "/usr/lib/python2.3/site-packages/ZODB/lock_file.py", line 42, in
> lock_file
>     fcntl.flock(file.fileno(), _flags)
> IOError: [Errno 11] Resource temporarily unavailable

That's the expected exception on a Unixish box if more than one attempt to
open the database file for write access is made simultaneously.  For
example,

$ python
Python 2.3.4 (#1, Aug  9 2004, 17:15:36)
[GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ZODB
>>> ZODB.__version__
'3.2.5'
>>> from ZODB.FileStorage import FileStorage
>>> st1 = FileStorage('Data.fs')
>>> st2 = FileStorage('Data.fs')  # and try opening it again -- boom!
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "ZODB/FileStorage.py", line 232, in __init__
    self._lock_file = LockFile(file_name + '.lock')
  File "ZODB/lock_file.py", line 62, in __init__
    lock_file(self._fp)
  File "ZODB/lock_file.py", line 42, in lock_file
    fcntl.flock(file.fileno(), _flags)
IOError: [Errno 11] Resource temporarily unavailable
>>> st3 = FileStorage('Data.fs', read_only=True) # but read_only is fine




More information about the ZODB-Dev mailing list