[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

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

Jonas Hartmann

6/24/2005 6:05:00 PM

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/6VI...


6 Answers

Jonas Hartmann

6/24/2005 7:16:00 PM

0

The test scripts, that are supplied by FSDB throw some errors as well;
see: http://rafb.net/paste/results/9gx...

again: how do i start debugging, whats the way to go?

Jonas


Ara.T.Howard

6/24/2005 7:25:00 PM

0

Joel VanderWerf

6/24/2005 8:09:00 PM

0

Jonas Hartmann wrote:
> The test scripts, that are supplied by FSDB throw some errors as well;
> see: http://rafb.net/paste/results/9gx...
>
> 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/fl...) 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!


Jonas Hartmann

6/25/2005 4:29:00 AM

0

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/6VI...
>>
>
> -a



Jonas Hartmann

6/25/2005 4:50:00 AM

0

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/6VI...
>>>
>>
>> -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

6/25/2005 4:59:00 AM

0

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/9gx...
>>
>> 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/fl...) 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