problem using pstore with multi-users

N

Noam Noam

Hi all,
when i'm using pstore with multi-users:
Permission denied - ../comments.dat.new
it seems that more then one user is asking to use the same file.
i tried to use synchronize for locking the transaction until it finsh,
but it seems that i can not using it when i using pstore.
any one having any idea???
Thanks.
 
K

khaines

Hi all,
when i'm using pstore with multi-users:
Permission denied - ../comments.dat.new
it seems that more then one user is asking to use the same file.
i tried to use synchronize for locking the transaction until it finsh,
but it seems that i can not using it when i using pstore.
any one having any idea???
Thanks.

pstore doesn't itself do any locking of any sort.

If you have multiple threads or processes that might try to use pstore on
the same file at the same time, you will have to handle the locking
yourself.

If you aren't on Windows, I suggest Ara Howard's lockfile.rb if you are
doing multiprocess work. If it is multithreaded, you certainly can use a
mutex to synchronize access.

http://codeforpeople.com/lib/ruby/lockfile/

However, permission denied suggests a simple file permissions problem that
locking will not solve, so I suggest you take a look at whether you might
accidentally be be creating the pstore file under a user or with
permissions that you don't intend.


Kirk Haines
 
N

Noam Noam

thanks Kirk,
i didn't understand what do you meen by "under a user "
how can i solve this problem?
the output error "premisson denied" pops up from some of the threads
(randomally) and not from all of them, so i figured its because to many
threads attemps to write to the pstore file in the same time, isn't it?
Thanks again,
Noam
 
J

James Edward Gray II

pstore doesn't itself do any locking of any sort.

I don't think that's accurate. Here's part of the transaction()
method for PStore. Note the calls to flock():

def transaction(read_only=false) # :yields: pstore
# ...

unless read_only
file = File.open(@filename, File::RDWR | File::CREAT)
file.binmode
file.flock(File::LOCK_EX)
commit_new(file) if FileTest.exist?(new_file)
content = file.read()
else
begin
file = File.open(@filename, File::RDONLY)
file.binmode
file.flock(File::LOCK_SH)
content = (File.read(new_file) rescue file.read())
rescue Errno::ENOENT
content = ""
end
end

# ...

James Edward Gray II
 
K

khaines

I don't think that's accurate. Here's part of the transaction() method for
PStore. Note the calls to flock():

def transaction(read_only=false) # :yields: pstore
# ...

unless read_only
file = File.open(@filename, File::RDWR | File::CREAT)
file.binmode
file.flock(File::LOCK_EX)
commit_new(file) if FileTest.exist?(new_file)
content = file.read()
else
begin
file = File.open(@filename, File::RDONLY)
file.binmode
file.flock(File::LOCK_SH)
content = (File.read(new_file) rescue file.read())
rescue Errno::ENOENT
content = ""
end
end

Well now, that's really interesting, because I never had anything but
misery when I tried using pstore in a context where two threads or
processes would try to access the same file at the same time. This has me
very curious as to why.

Fiddlesticks!


Kirk Haines
 
J

Joel VanderWerf

Well now, that's really interesting, because I never had anything but
misery when I tried using pstore in a context where two threads or
processes would try to access the same file at the same time. This has
me very curious as to why.

In the case of threads you might have had misery because PStore doesn't
do any thread-level locking (e.g. Mutex or Sync). But PStore should be
safe at the process level, AFAIK.
 
A

ara.t.howard

In the case of threads you might have had misery because PStore doesn't do
any thread-level locking (e.g. Mutex or Sync). But PStore should be safe at
the process level, AFAIK.

it is - just not on nfs. i use it this way quite a bit with zero issues.
it's really nice as the backend for tiny cgi scripts.

-a
 
N

Noam Noam

James said:
I don't think that's accurate. Here's part of the transaction()
method for PStore. Note the calls to flock():

so, if i understand correctly, because in pstore.rb there is a lock to
the file, i cannot use pstore with some processes because it will front
a lock. and because of that i get "premission denied"???
thanks you all, for your all responses.
 
D

David Vallner

Noam said:
so, if i understand correctly, because in pstore.rb there is a lock to
the file, i cannot use pstore with some processes because it will front
a lock. and because of that i get "premission denied"???
thanks you all, for your all responses.

Seems so. s/pstore/sqlite/ maybe? A single-table, string -> blob
database isn't SUCH a horrible conceptual rape for simple apps. (Or as
some system architects of my days past would think, not even for
embedded J2EE.)

David Vallner
 
N

Noam Noam

Hi all,
after more examination of the fails,
its look like pstore.rb fail in line #179
File.unlink(new_file)

any one have an idea' whats the problem????

Thanks again,
Noam.
 
D

David Vallner

Noam said:
Hi all,
after more examination of the fails,
its look like pstore.rb fail in line #179
File.unlink(new_file)

any one have an idea' whats the problem????

I think you can't delete a file in use. (unlink == delete)

So the problem is what others have already mentioned, it's a lock file
or something that prevents another process from thrashing the storage
file while you're reading from it.

David Vallner
 

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,992
Messages
2,570,220
Members
46,805
Latest member
ClydeHeld1

Latest Threads

Top