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

J

Jonas Hartmann

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
 
A

Ara.T.Howard

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
===============================================================================
 
J

Joel VanderWerf

Jonas said:
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!
 
J

Jonas Hartmann

Ara.T.Howard said:
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
 
J

Jonas Hartmann

Jonas said:
Ara.T.Howard said:
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.
 
J

Jonas Hartmann

Joel said:
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:



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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,767
Messages
2,569,571
Members
45,045
Latest member
DRCM

Latest Threads

Top