Re: Andres Freund 2014-06-12 <20140612094112.gz8...@alap3.anarazel.de> > > * Make initdb determine the best shm type for this platform and write > > it into postgresql.conf as it does now. > > * If no dynamic_shared_memory_type is found in the config, default to > > "none". > > * Modify the three identical error messages concerned about shm > > segments to include the shm type instead of always just saying > > "FATAL: could not open shared memory segment" > > * Add a HINT to the POSIX error message: > > "HINT: This might indicate that /dev/shm is not mounted, or its > > permissions do not allow the database user to create files there" > > Sounds like a sane plan to me.
Here are two patches, one that implements the annotated error messages, and one that selects none as default. It might also make sense to add a Note that POSIX depends on /dev/shm, and also a Note that dynamic_shared_memory_type is not related to the shared_buffers shm segments, which I didn't include here. Christoph -- c...@df7cb.de | http://www.df7cb.de/
diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c new file mode 100644 index 0819641..780e3a5 *** a/src/backend/storage/ipc/dsm_impl.c --- b/src/backend/storage/ipc/dsm_impl.c *************** dsm_impl_posix(dsm_op op, dsm_handle han *** 289,296 **** if (errno != EEXIST) ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open shared memory segment \"%s\": %m", ! name))); return false; } --- 289,299 ---- if (errno != EEXIST) ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open POSIX shared memory segment \"%s\": %m", ! name), ! errhint("This error usually means that /dev/shm is not mounted, or its " ! "permissions do not allow the database user to create files " ! "there."))); return false; } *************** dsm_impl_posix(dsm_op op, dsm_handle han *** 313,319 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat shared memory segment \"%s\": %m", name))); return false; } --- 316,322 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat POSIX shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_posix(dsm_op op, dsm_handle han *** 332,338 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } --- 335,341 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize POSIX shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } *************** dsm_impl_posix(dsm_op op, dsm_handle han *** 358,364 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap shared memory segment \"%s\": %m", name))); return false; } --- 361,367 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap POSIX shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_posix(dsm_op op, dsm_handle han *** 382,388 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map shared memory segment \"%s\": %m", name))); return false; } --- 385,391 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map POSIX shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_sysv(dsm_op op, dsm_handle hand *** 512,518 **** errno = save_errno; ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not get shared memory segment: %m"))); } return false; } --- 515,521 ---- errno = save_errno; ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not get System V shared memory segment: %m"))); } return false; } *************** dsm_impl_sysv(dsm_op op, dsm_handle hand *** 530,536 **** { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap shared memory segment \"%s\": %m", name))); return false; } --- 533,539 ---- { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap System V shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_sysv(dsm_op op, dsm_handle hand *** 540,546 **** { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove shared memory segment \"%s\": %m", name))); return false; } --- 543,549 ---- { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove System V shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_sysv(dsm_op op, dsm_handle hand *** 556,562 **** { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat shared memory segment \"%s\": %m", name))); return false; } --- 559,565 ---- { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat System V shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_sysv(dsm_op op, dsm_handle hand *** 577,583 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map shared memory segment \"%s\": %m", name))); return false; } --- 580,586 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map System V shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 645,651 **** _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap shared memory segment \"%s\": %m", name))); return false; } --- 648,654 ---- _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 655,661 **** _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove shared memory segment \"%s\": %m", name))); return false; } --- 658,664 ---- _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 691,697 **** _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not create shared memory segment \"%s\": %m", name))); return false; } --- 694,700 ---- _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not create Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 718,724 **** _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open shared memory segment \"%s\": %m", name))); return false; } --- 721,727 ---- _dosmaperr(GetLastError()); ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 739,745 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map shared memory segment \"%s\": %m", name))); return false; } --- 742,748 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_windows(dsm_op op, dsm_handle h *** 763,769 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat shared memory segment \"%s\": %m", name))); return false; } --- 766,772 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat Windows shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 808,814 **** { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap shared memory segment \"%s\": %m", name))); return false; } --- 811,817 ---- { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap mmap shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 818,824 **** { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove shared memory segment \"%s\": %m", name))); return false; } --- 821,827 ---- { ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not remove mmap shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 832,838 **** if (errno != EEXIST) ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open shared memory segment \"%s\": %m", name))); return false; } --- 835,841 ---- if (errno != EEXIST) ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not open mmap shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 856,862 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat shared memory segment \"%s\": %m", name))); return false; } --- 859,865 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not stat mmap shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 875,881 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } --- 878,884 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize mmap shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 923,929 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } --- 926,932 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not resize mmap shared memory segment %s to %zu bytes: %m", name, request_size))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 950,956 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap shared memory segment \"%s\": %m", name))); return false; } --- 953,959 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not unmap mmap shared memory segment \"%s\": %m", name))); return false; } *************** dsm_impl_mmap(dsm_op op, dsm_handle hand *** 974,980 **** ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map shared memory segment \"%s\": %m", name))); return false; } --- 977,983 ---- ereport(elevel, (errcode_for_dynamic_shared_memory(), ! errmsg("could not map mmap shared memory segment \"%s\": %m", name))); return false; }
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml new file mode 100644 index 697cf99..db52c77 *** a/doc/src/sgml/config.sgml --- b/doc/src/sgml/config.sgml *************** include 'filename' *** 1416,1429 **** <literal>windows</> (for Windows shared memory), <literal>mmap</> (to simulate shared memory using memory-mapped files stored in the data directory), and <literal>none</> (to disable this feature). ! Not all values are supported on all platforms; the first supported ! option is the default for that platform. The use of the ! <literal>mmap</> option, which is not the default on any platform, is generally discouraged because the operating system may write modified pages back to disk repeatedly, increasing system I/O load; however, it may be useful for debugging, when the <literal>pg_dynshmem</> directory is stored on a RAM disk, or when other shared memory facilities are not available. </para> </listitem> </varlistentry> --- 1416,1432 ---- <literal>windows</> (for Windows shared memory), <literal>mmap</> (to simulate shared memory using memory-mapped files stored in the data directory), and <literal>none</> (to disable this feature). ! Not all values are supported on all platforms. ! The use of the <literal>mmap</> option is generally discouraged because the operating system may write modified pages back to disk repeatedly, increasing system I/O load; however, it may be useful for debugging, when the <literal>pg_dynshmem</> directory is stored on a RAM disk, or when other shared memory facilities are not available. + <application>initdb</> will select a suitable setting for the system. + The default, when not configured explicitely in + <filename>postgresql.conf</>, is to disable the use of dynamic shared + memory. </para> </listitem> </varlistentry> diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c new file mode 100644 index 1d094f0..e73f6c1 *** a/src/backend/utils/misc/guc.c --- b/src/backend/utils/misc/guc.c *************** static struct config_enum ConfigureNames *** 3453,3459 **** NULL }, &dynamic_shared_memory_type, ! DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE, dynamic_shared_memory_options, NULL, NULL, NULL }, --- 3453,3459 ---- NULL }, &dynamic_shared_memory_type, ! DSM_IMPL_NONE, dynamic_shared_memory_options, NULL, NULL, NULL }, diff --git a/src/include/storage/dsm_impl.h b/src/include/storage/dsm_impl.h new file mode 100644 index 6e2a013..aa3487a *** a/src/include/storage/dsm_impl.h --- b/src/include/storage/dsm_impl.h *************** *** 26,41 **** */ #ifdef WIN32 #define USE_DSM_WINDOWS - #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_WINDOWS #else #ifdef HAVE_SHM_OPEN #define USE_DSM_POSIX - #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_POSIX #endif #define USE_DSM_SYSV - #ifndef DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE - #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_SYSV - #endif #define USE_DSM_MMAP #endif --- 26,36 ----
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers