Re: Andres Freund 2014-06-12 <[email protected]>
> > * 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
--
[email protected] | 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers