FSDB, Apache, FastCGI - ERROR: FSDB::Database::DirIsImmutableError

Discussion in 'Ruby' started by Jonas Hartmann, Jun 24, 2005.

  1. when I run a script [1] from the command line, it works. it asks for
    cgi pairs - key/value - cause it is in offline mode.

    when i run it through mod_fastcgi => ruby it does not work.

    a ruby script printing out the http_enviroment via FastCGI works (so
    FastCGI works).

    If i run the script via browser (on
    http://localhost/ruby/db_connect.rb) I get the following error +
    backtrace:

    -- ERROR: FSDB::Database::DirIsImmutableError
    -- BACKTRACE:
    /fsdb/lib/fsdb/database.rb:404:in `open_write_lock
    /fsdb/lib/fsdb/database.rb:620:in `[]=
    /fsdb/lib/fsdb/database.rb:619:in `object_exclusive
    /fsdb/lib/fsdb/database.rb:358:in `sync_object_exclusive
    /fsdb/lib/fsdb/database.rb:102:in `synchronize
    /fsdb/lib/fsdb/database.rb:102:in `sync_object_exclusive
    /fsdb/lib/fsdb/database.rb:358:in `object_exclusive
    /fsdb/lib/fsdb/database.rb:357:in `use_cache_entry
    /fsdb/lib/fsdb/database.rb:357:in `object_exclusive
    /fsdb/lib/fsdb/database.rb:619:in `[]=
    /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    `load
    /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler

    It seems to mean that I cannot change/write to the dir, right?

    I have no clue what I should do about that. How can i make the script
    access the dir /tmp/my-data correctly? What is causing this error?

    It should just print "Hello world, and hello database!\n" (and does
    that in offlinemode via "ruby db_connect.rb" + CTRL+D


    [1]: http://rafb.net/paste/results/6VIFri64.html
     
    Jonas Hartmann, Jun 24, 2005
    #1
    1. Advertising

  2. Jonas Hartmann, Jun 24, 2005
    #2
    1. Advertising

  3. Jonas Hartmann

    Ara.T.Howard Guest

    On Sat, 25 Jun 2005, Jonas Hartmann wrote:

    > when I run a script [1] from the command line, it works. it asks for cgi
    > pairs - key/value - cause it is in offline mode.
    >
    > when i run it through mod_fastcgi => ruby it does not work.
    >
    > a ruby script printing out the http_enviroment via FastCGI works (so FastCGI
    > works).
    >
    > If i run the script via browser (on http://localhost/ruby/db_connect.rb) I
    > get the following error + backtrace:
    >
    > -- ERROR: FSDB::Database::DirIsImmutableError
    > -- BACKTRACE:
    > ./fsdb/lib/fsdb/database.rb:404:in `open_write_lock
    > ./fsdb/lib/fsdb/database.rb:620:in `[]=
    > ./fsdb/lib/fsdb/database.rb:619:in `object_exclusive
    > ./fsdb/lib/fsdb/database.rb:358:in `sync_object_exclusive
    > ./fsdb/lib/fsdb/database.rb:102:in `synchronize
    > ./fsdb/lib/fsdb/database.rb:102:in `sync_object_exclusive
    > ./fsdb/lib/fsdb/database.rb:358:in `object_exclusive
    > ./fsdb/lib/fsdb/database.rb:357:in `use_cache_entry
    > ./fsdb/lib/fsdb/database.rb:357:in `object_exclusive
    > ./fsdb/lib/fsdb/database.rb:619:in `[]=
    > /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    > `load
    > /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
    >
    > It seems to mean that I cannot change/write to the dir, right?
    >
    > I have no clue what I should do about that. How can i make the script access
    > the dir /tmp/my-data correctly? What is causing this error?


    you ran once as normal user - now user www (or whatever) can't access it.
    blow away the dir and try again OR do a recursive chown of the dir to apache
    as root.

    >
    > It should just print "Hello world, and hello database!\n" (and does that in
    > offlinemode via "ruby db_connect.rb" + CTRL+D
    >
    >
    > [1]: http://rafb.net/paste/results/6VIFri64.html
    >


    -a
    --
    ===============================================================================
    | email :: ara [dot] t [dot] howard [at] noaa [dot] gov
    | phone :: 303.497.6469
    | My religion is very simple. My religion is kindness.
    | --Tenzin Gyatso
    ===============================================================================
     
    Ara.T.Howard, Jun 24, 2005
    #3
  4. Jonas Hartmann wrote:
    > The test scripts, that are supplied by FSDB throw some errors as well;
    > see: http://rafb.net/paste/results/9gxy2a55.html
    >
    > again: how do i start debugging, whats the way to go?
    >
    > Jonas


    Aside from the file ownership issue, the EISDIR is a real problem.
    You're running on OS X, I see? A few months ago, a Tristan O'Tierney was
    trying to run FSDB on OSX and ran into the same thing: flock() on a dir
    raises EISDIR.

    Here's a suggestion that seemed to solve the problem for him:

    > I've never had a chance to try fsdb on darwin, but I suspect that
    > there are the usual minor variations in what the file system allows
    > and what errors it reports. There's already some code in fsdb to
    > account for the difference between WinME, Win2K, Linux, and Solaris.
    > Locking is especially hard to do portably.
    >
    > One thing you might try first is to use fcntl locks instead of flock.
    > It's easy to switch--just create your database like this:
    >
    > require 'fsdb/fcntl_lock' # this will be unnnecessary in future FSDB
    > versions
    >
    > db = FSDB::Database.new dir, :lock_type => :fcntl_lock
    >
    > Whether that works or not, it's probably a good idea for me to patch
    > the locking code to avoid trying to lock dirs, if that operation
    > fails on darwin. Or it could just always use fcntl, if that works.
    >
    > The odd thing is that I don't see anything on the man pages
    > (http://www.manpages.info/macosx/flock.2.html) saying that flock
    > fails on dirs.


    But I'm not sure that completely solved the problem, and I haven't been
    able to get a darwin machine to test on. Would you mind trying the above
    suggestion?

    One thing to watch out for: the fcntl-lock is a C extension (code thanks
    to Ara!), which is why it's not the default. But I dunno if it builds on
    darwin. So, if the suggestion above doesn't work, let me know what
    output you get for the config/setup process.

    Thanks!
     
    Joel VanderWerf, Jun 24, 2005
    #4
  5. Ara.T.Howard wrote:
    > On Sat, 25 Jun 2005, Jonas Hartmann wrote:
    >
    >> when I run a script [1] from the command line, it works. it asks for
    >> cgi pairs - key/value - cause it is in offline mode.
    >>
    >> when i run it through mod_fastcgi => ruby it does not work.
    >>
    >> a ruby script printing out the http_enviroment via FastCGI works (so
    >> FastCGI works).
    >>
    >> If i run the script via browser (on
    >> http://localhost/ruby/db_connect.rb) I get the following error +
    >> backtrace:
    >>
    >> -- ERROR: FSDB::Database::DirIsImmutableError
    >> -- BACKTRACE:
    >> ./fsdb/lib/fsdb/database.rb:404:in `open_write_lock
    >> ./fsdb/lib/fsdb/database.rb:620:in `[]=
    >> ./fsdb/lib/fsdb/database.rb:619:in `object_exclusive
    >> ./fsdb/lib/fsdb/database.rb:358:in `sync_object_exclusive
    >> ./fsdb/lib/fsdb/database.rb:102:in `synchronize
    >> ./fsdb/lib/fsdb/database.rb:102:in `sync_object_exclusive
    >> ./fsdb/lib/fsdb/database.rb:358:in `object_exclusive
    >> ./fsdb/lib/fsdb/database.rb:357:in `use_cache_entry
    >> ./fsdb/lib/fsdb/database.rb:357:in `object_exclusive
    >> ./fsdb/lib/fsdb/database.rb:619:in `[]=
    >> /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    >> `load
    >> /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
    >>
    >> It seems to mean that I cannot change/write to the dir, right?
    >>
    >> I have no clue what I should do about that. How can i make the script
    >> access the dir /tmp/my-data correctly? What is causing this error?

    >
    >
    > you ran once as normal user - now user www (or whatever) can't access it.

    to extend this case.

    I can delete the temporary directories and run it via www user the
    first time and the www user won't be able to access it.

    To make it simple I exchanged:

    db = FSDB::Database.new('/tmp/my-data')
    # notice
    ^
    with

    db = FSDB::Database.new('tmp/my-data')

    i ran it again via normal user/terminal on darwin - it again works.
    then i deleted the tmp directory that had been created, and after
    that ran it again via browser/webserver:

    it now says:

    -- ERROR: Insecure operation - directory?
    -- BACKTRACE:
    /usr/local/lib/ruby/1.8/ftools.rb:204:in `directory?
    /usr/local/lib/ruby/1.8/ftools.rb:204:in `makedirs
    /usr/local/lib/ruby/1.8/ftools.rb:202:in `each
    /usr/local/lib/ruby/1.8/ftools.rb:202:in `makedirs
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:147:in `initialize
    /Library/WebServer/Documents/ruby/db_connect.rb:8:in `new
    /Library/WebServer/Documents/ruby/db_connect.rb:8/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    `load
    /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler

    > blow away the dir

    I have already tried that. gives this error:

    -- ERROR: undefined method `close' for nil:NilClass
    -- BACKTRACE:
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:318:in `inc_version_of
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:622:in `[]=
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:620:in `open_write_lock
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:620:in `[]=
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:619:in
    `object_exclusive
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:358:in
    `sync_object_exclusive
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:102:in `synchronize
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:102:in
    `sync_object_exclusive
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:358:in
    `object_exclusive
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:357:in `use_cache_entry
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:357:in
    `object_exclusive
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:619:in `[]=
    /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    `load
    /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler

    > and try again OR do a recursive chown of the dir to
    > apache
    > as root.
    >
    >>
    >> It should just print "Hello world, and hello database!\n" (and does
    >> that in offlinemode via "ruby db_connect.rb" + CTRL+D
    >>
    >>
    >> [1]: http://rafb.net/paste/results/6VIFri64.html
    >>

    >
    > -a
     
    Jonas Hartmann, Jun 25, 2005
    #5
  6. Jonas Hartmann wrote:
    > Ara.T.Howard wrote:
    >
    >> On Sat, 25 Jun 2005, Jonas Hartmann wrote:
    >>
    >>> when I run a script [1] from the command line, it works. it asks for
    >>> cgi pairs - key/value - cause it is in offline mode.
    >>>
    >>> when i run it through mod_fastcgi => ruby it does not work.
    >>>
    >>> a ruby script printing out the http_enviroment via FastCGI works (so
    >>> FastCGI works).
    >>>
    >>> If i run the script via browser (on
    >>> http://localhost/ruby/db_connect.rb) I get the following error +
    >>> backtrace:
    >>>
    >>> -- ERROR: FSDB::Database::DirIsImmutableError
    >>> -- BACKTRACE:
    >>> ./fsdb/lib/fsdb/database.rb:404:in `open_write_lock
    >>> ./fsdb/lib/fsdb/database.rb:620:in `[]=
    >>> ./fsdb/lib/fsdb/database.rb:619:in `object_exclusive
    >>> ./fsdb/lib/fsdb/database.rb:358:in `sync_object_exclusive
    >>> ./fsdb/lib/fsdb/database.rb:102:in `synchronize
    >>> ./fsdb/lib/fsdb/database.rb:102:in `sync_object_exclusive
    >>> ./fsdb/lib/fsdb/database.rb:358:in `object_exclusive
    >>> ./fsdb/lib/fsdb/database.rb:357:in `use_cache_entry
    >>> ./fsdb/lib/fsdb/database.rb:357:in `object_exclusive
    >>> ./fsdb/lib/fsdb/database.rb:619:in `[]=
    >>> /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    >>> `load
    >>> /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
    >>>
    >>> It seems to mean that I cannot change/write to the dir, right?
    >>>
    >>> I have no clue what I should do about that. How can i make the script
    >>> access the dir /tmp/my-data correctly? What is causing this error?

    >>
    >>
    >>
    >> you ran once as normal user - now user www (or whatever) can't access it.

    >
    > to extend this case.
    >
    > I can delete the temporary directories and run it via www user the first
    > time and the www user won't be able to access it.
    >
    > To make it simple I exchanged:
    >
    > db = FSDB::Database.new('/tmp/my-data')
    > # notice
    > ^
    > with
    >
    > db = FSDB::Database.new('tmp/my-data')
    >
    > i ran it again via normal user/terminal on darwin - it again works.
    > then i deleted the tmp directory that had been created, and after that
    > ran it again via browser/webserver:
    >
    > it now says:
    >
    > -- ERROR: Insecure operation - directory?
    > -- BACKTRACE:
    > /usr/local/lib/ruby/1.8/ftools.rb:204:in `directory?
    > /usr/local/lib/ruby/1.8/ftools.rb:204:in `makedirs
    > /usr/local/lib/ruby/1.8/ftools.rb:202:in `each
    > /usr/local/lib/ruby/1.8/ftools.rb:202:in `makedirs
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:147:in `initialize
    > /Library/WebServer/Documents/ruby/db_connect.rb:8:in `new
    > /Library/WebServer/Documents/ruby/db_connect.rb:8/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    > `load
    > /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
    >
    >> blow away the dir

    >
    > I have already tried that. gives this error:
    >
    > -- ERROR: undefined method `close' for nil:NilClass
    > -- BACKTRACE:
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:318:in `inc_version_of
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:622:in `[]=
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:620:in `open_write_lock
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:620:in `[]=
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:619:in `object_exclusive
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:358:in
    > `sync_object_exclusive
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:102:in `synchronize
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:102:in
    > `sync_object_exclusive
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:358:in `object_exclusive
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:357:in `use_cache_entry
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:357:in `object_exclusive
    > /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:619:in `[]=
    > /Library/WebServer/Documents/ruby/db_connect.rb:10/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    > `load
    > /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
    >
    >> and try again OR do a recursive chown of the dir to apache
    >> as root.
    >>
    >>>
    >>> It should just print "Hello world, and hello database!\n" (and does
    >>> that in offlinemode via "ruby db_connect.rb" + CTRL+D
    >>>
    >>>
    >>> [1]: http://rafb.net/paste/results/6VIFri64.html
    >>>

    >>
    >> -a


    besides that: all directories are being created as told (but that
    process thows a lot of errors by calling via terminal).

    besides all that I notice that the file: "..fsdb.meta.myself" is not
    beeing created by the www call of the script, while it is being
    created by the non terminal call/user call. atleast the file "myself"
    is beeing created in both cases, holding the data inserted in both cases.
     
    Jonas Hartmann, Jun 25, 2005
    #6
  7. Joel VanderWerf wrote:
    > Jonas Hartmann wrote:
    >
    >> The test scripts, that are supplied by FSDB throw some errors as well;
    >> see: http://rafb.net/paste/results/9gxy2a55.html
    >>
    >> again: how do i start debugging, whats the way to go?
    >>
    >> Jonas

    >
    >
    > Aside from the file ownership issue, the EISDIR is a real problem.
    > You're running on OS X, I see? A few months ago, a Tristan O'Tierney was
    > trying to run FSDB on OSX and ran into the same thing: flock() on a dir
    > raises EISDIR.
    >
    > Here's a suggestion that seemed to solve the problem for him:
    >
    >> I've never had a chance to try fsdb on darwin, but I suspect that
    >> there are the usual minor variations in what the file system allows
    >> and what errors it reports. There's already some code in fsdb to
    >> account for the difference between WinME, Win2K, Linux, and Solaris.
    >> Locking is especially hard to do portably.
    >>
    >> One thing you might try first is to use fcntl locks instead of flock.
    >> It's easy to switch--just create your database like this:
    >>
    >> require 'fsdb/fcntl_lock' # this will be unnnecessary in future FSDB
    >> versions
    >>
    >> db = FSDB::Database.new dir, :lock_type => :fcntl_lock
    >>
    >> Whether that works or not, it's probably a good idea for me to patch
    >> the locking code to avoid trying to lock dirs, if that operation
    >> fails on darwin. Or it could just always use fcntl, if that works.
    >>
    >> The odd thing is that I don't see anything on the man pages
    >> (http://www.manpages.info/macosx/flock.2.html) saying that flock
    >> fails on dirs.

    >
    >
    > But I'm not sure that completely solved the problem, and I haven't been
    > able to get a darwin machine to test on. Would you mind trying the above
    > suggestion?
    >
    > One thing to watch out for: the fcntl-lock is a C extension (code thanks
    > to Ara!), which is why it's not the default. But I dunno if it builds on
    > darwin. So, if the suggestion above doesn't work, let me know what
    > output you get for the config/setup process.
    >
    > Thanks!


    Warning: I have no clue how to use C-Extensions in ruby. I did not
    plan to do so soon ;-(.

    I have modified the code in my "db_connect.rb" (within that folder
    there is a fsdb folder that holds the complete fsdb 0.4 directory as
    in previous examples)

    $LOAD_PATH.insert(-1, "./fsdb/lib")
    require 'fsdb.rb'
    require 'fsdb/ext/fsdb/fcntl_lock' # this will be unnnecessary in
    # future FSDB versions

    db = FSDB::Database.new('tmp/my-data', :lock_type => :fcntl_lock)
    # added ^^^^^^^^^^^^^^^^^^^^^^^^^^^

    I don't know if I did that right... it throws no error on terminal.
    But it does throw one via www user:

    -- ERROR: Insecure operation - directory?
    -- BACKTRACE:
    /usr/local/lib/ruby/1.8/ftools.rb:204:in `directory?
    /usr/local/lib/ruby/1.8/ftools.rb:204:in `makedirs
    /usr/local/lib/ruby/1.8/ftools.rb:202:in `each
    /usr/local/lib/ruby/1.8/ftools.rb:202:in `makedirs
    /usr/local/lib/ruby/site_ruby/1.8/fsdb/database.rb:147:in `initialize
    /Library/WebServer/Documents/ruby/db_connect.rb:9:in `new
    /Library/WebServer/Documents/ruby/db_connect.rb:9/usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in
    `load
    /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler
     
    Jonas Hartmann, Jun 25, 2005
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. ytfilter

    About fsdb Dump using ncvhdl

    ytfilter, Mar 5, 2008, in forum: VHDL
    Replies:
    1
    Views:
    1,743
  2. Carl Youngblood

    Apache/FastCGI with Ruby on Windows

    Carl Youngblood, Aug 28, 2003, in forum: Ruby
    Replies:
    0
    Views:
    136
    Carl Youngblood
    Aug 28, 2003
  3. Mohammad Khan
    Replies:
    0
    Views:
    112
    Mohammad Khan
    Nov 17, 2005
  4. Mohammad Khan

    Apache + FastCGI + RoR

    Mohammad Khan, Nov 17, 2005, in forum: Ruby
    Replies:
    4
    Views:
    148
    James Britt
    Nov 20, 2005
  5. Replies:
    1
    Views:
    127
    Matthias Georgi
    Mar 14, 2006
Loading...

Share This Page