> Question: Does anybody know of a better way to get memory shared among > processes other than to create a fake file and mmap() it? Are there some > magic options to mmap() (perhaps Linux-only options) that prevent it from > actually writing to disk?
Why don't you use shm_open() instead of a real file? I'm not sure though how it behaves with chroot jail. Pavel On Thu, Mar 8, 2012 at 11:35 AM, Richard Hipp <d...@sqlite.org> wrote: > On Thu, Mar 8, 2012 at 10:58 AM, Yongiljang <yongilj...@gmail.com> wrote: > >> Dear all, >> I'm an android developer in charge of sqlite database. >> >> Some days ago, I'd got a SIGBUS error from sqlite when there is no space >> in current partition and WAL journal mode is used. >> This error was occurred from memset function in libc that was called by >> libsqlite and debugging information shows shm file was related to this >> issue. >> >> Following sequence shows how to generate this error. >> >> 1) Make disk full >> 2) Reboot device - wal and shm files are remained in some applications >> folder >> 3) Do 1) ~ 2) until free space remained under 32KB >> 4) SIGBUS error is occurred randomly >> >> I'd tried to solve this problem and guessed following scenario. >> >> 1) shm file is truncated to zero size by calling robust_truncate function >> when a new connection is opened in unixOpenSharedMemory >> 2) shm file is extended to 32KB by calling robust_truncate function in >> unixShmMap >> 3) mmap function is called with 32KB length >> >> In my guess, problem is occurred from robust_truncate or mmap functions, >> because of they didn't returned error code whether shm file is extended to >> 32KB or not on disk full status. >> robust_truncate and mmap may caused illegal memset operation because of >> shm file actually doesn't have 32KB size, it may less than 32KB. >> Interesting point is when I tested it with above scenario, there was a shm >> file that has 32KB size. >> It is impossible because of there was no space to make 32KB sized file in >> current partiton. >> > > We do not want to really make a file. The purpose of the -shm file is > merely to give a name to a block of memory that various processes accessing > the database can share between themselves using mmap(). Ideally, the > content of the -shm file remains the OS page cache and is never written to > disk. > > Can you please try this experiment for us: Beginning with a standard > SQLite build (without your patches) recompile using > -DSQLITE_SHM_DIRECTORY="/dev/shm". That option will cause the shared > memory file to be created in the /dev/shm directory rather than in the same > directory as the database. Since /dev/shm is not backed by disk (or flash) > the problem should be solved. > > FWIW: We looked at always putting the -shm files in a special directory > like this when we were first designing WAL. But we noticed that design > fails if two programs in different chroot jails try to access the database > at the same time, and so we switched to the current design of using the > -shm file in the same directory as the database. > > Question: Does anybody know of a better way to get memory shared among > processes other than to create a fake file and mmap() it? Are there some > magic options to mmap() (perhaps Linux-only options) that prevent it from > actually writing to disk? > > >> >> Whatever, I'd changed unixOpenSharedMemory to solve it. >> >> 1) make a shm file and write null data until 32KB if this file doesn't >> exists >> - return SQLITE_FULL error when write operation is failed >> 2) write null data until 32KB if this file exists and got write lock >> instead of calling truncate function to shrink shm file to zero size >> - return same error code when it failed >> >> By changed source, I could solve this problem. >> Sqlite returns SQLITE_FULL errors only without SIGBUS core dump. >> >> However, this instant code changing may not be a good solution. >> I wish to get better comment or source patches from here. >> >> Thank you for reading this including my poor english. :) >> >> Best wishes, >> Jang. >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users@sqlite.org >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> > > > > -- > D. Richard Hipp > d...@sqlite.org > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users