ldap/servers/slapd/util.c | 41 +++++++++++++++++++++++++++++++----------
ldap/systools/idsktune.c | 25 ++++++++++++++++++++++---
2 files changed, 53 insertions(+), 13 deletions(-)
New commits:
commit 636c89b575d290dd3d3d7ee9df20d2da204b2784
Author: William Brown <firstyear(a)redhat.com>
Date: Sun May 22 14:19:03 2016 +1000
Ticket 48846 - 32 bit systems set low vmsize
Bug Description: 32 bit systems set vmsize low, and it grows. We should use
*not* use this for page available checks as it causes some errors.
Fix Description: Only uses pages from meminfo on a 32bit platform rather than
vmsize.
https://fedorahosted.org/389/ticket/48846
Author: wibrown
Review by: nhosoi (Thanks!)
diff --git a/ldap/servers/slapd/util.c b/ldap/servers/slapd/util.c
index 070a7db..89c7579 100644
--- a/ldap/servers/slapd/util.c
+++ b/ldap/servers/slapd/util.c
@@ -1650,12 +1650,20 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t
*procpages, size
*/
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, vmsize=%lu,
\n",
(unsigned long) *pages, (unsigned long) vmsize,0);
+#if __GNUC__
+#if __x86_64__ || __ppc64__
+ /* On 64bit platforms, vmsize is set high (VmSize), and doesn't change. IE
17tb */
if (vmsize < *pages) {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using vmsize for pages
\n",0,0,0);
*pages = vmsize;
} else {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for pages
\n",0,0,0);
}
+#else
+ /* On 32bit platforms, vmsize is set low (VmSize) and grows. */
+ LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for pages
\n",0,0,0);
+#endif
+#endif
/* Availpages is how much we *could* alloc. We should take the smallest:
* - pages
commit b08fa7e6d4b2eae22eef4931af86353274ef3945
Author: William Brown <firstyear(a)redhat.com>
Date: Fri May 20 22:34:57 2016 +1000
Ticket 48846 - Older kernels do not expose memavailable
Bug Description: Old kernels do not expose MemAvailable. As a result this would
be 0, and would be the lowest value in the check.
Fix Description: Check that our values for util_sys_pages is > 0
https://fedorahosted.org/389/ticket/48846
Author: wibrown
Review by: nhosoi (Thanks!)
diff --git a/ldap/servers/slapd/util.c b/ldap/servers/slapd/util.c
index e7b02fa..070a7db 100644
--- a/ldap/servers/slapd/util.c
+++ b/ldap/servers/slapd/util.c
@@ -1670,15 +1670,15 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t
*procpages, size
(unsigned long)*pages, (unsigned long)*availpages, (unsigned
long)freesize);
}
- if (rlimsize != RLIM_INFINITY && rlimsize < freesize &&
rlimsize < *pages) {
+ if (rlimsize != RLIM_INFINITY && rlimsize < freesize &&
rlimsize < *pages && rlimsize > 0) {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using getrlim for
availpages \n",0,0,0);
*availpages = rlimsize;
- } else if (*pages < freesize) {
- LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for
availpages \n",0,0,0);
- *availpages = *pages;
- } else {
+ } else if (freesize < *pages && freesize > 0) {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using freesize for
availpages \n",0,0,0);
*availpages = freesize;
+ } else {
+ LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for
availpages \n",0,0,0);
+ *availpages = *pages;
}
}
commit 17a56dbb676bbf4a4fd4f752eaa5bda616c4696c
Author: William Brown <firstyear(a)redhat.com>
Date: Fri May 20 10:20:16 2016 +1000
Ticket 48846 - Rlimit checks should detect RLIM_INFINITY
Bug Description: On certain platforms (32 bit) it was possible for dsktune and
other checks to fail as rlim.cur and rlim.max was -1. This would result in a
pattern of rlim.cur < some base limit, failing, even though rlimit implied
infinite. This did not affect 64bit platforms as rlim_infinity for them is
uint64 max.
Fix Description: Fix our various checks to look for and detect RLIM_INFINITY
when set correctly.
https://fedorahosted.org/389/ticket/48846
Author: wibrown
Review by: nhosoi (Thanks!)
diff --git a/ldap/servers/slapd/util.c b/ldap/servers/slapd/util.c
index b0fd73b..e7b02fa 100644
--- a/ldap/servers/slapd/util.c
+++ b/ldap/servers/slapd/util.c
@@ -1571,6 +1571,7 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t
*procpages, size
size_t vmsize = 0;
size_t freesize = 0;
+ size_t rlimsize = 0;
*pagesize = getpagesize();
@@ -1632,8 +1633,14 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t
*procpages, size
freesize /= (*pagesize / 1024);
/* procpages is now in kb not pages... */
*procpages /= (*pagesize / 1024);
- /* This is in bytes, make it pages */
- *availpages = util_getvirtualmemsize() / *pagesize;
+
+ rlimsize = util_getvirtualmemsize();
+ /* On a 64 bit system, this is uint64 max, but on 32 it's -1 */
+ /* Either way, we should be ignoring it at this point if it's infinite */
+ if (rlimsize != RLIM_INFINITY) {
+ /* This is in bytes, make it pages */
+ rlimsize = rlimsize / *pagesize;
+ }
/* Now we have vmsize, the availpages from getrlimit, our freesize */
vmsize /= (*pagesize / 1024);
@@ -1655,19 +1662,25 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t
*procpages, size
* - getrlimit (availpages)
* - freesize
*/
- LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, getrlim=%lu,
freesize=%lu\n",
- (unsigned long)*pages, (unsigned long)*availpages, (unsigned long)freesize);
- if (*pages < *availpages && *pages < freesize) {
+ if (rlimsize == RLIM_INFINITY) {
+ LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu,
getrlim=RLIM_INFINITY, freesize=%lu\n",
+ (unsigned long)*pages, (unsigned long)freesize, 0);
+ } else {
+ LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, getrlim=%lu,
freesize=%lu\n",
+ (unsigned long)*pages, (unsigned long)*availpages, (unsigned
long)freesize);
+ }
+
+ if (rlimsize != RLIM_INFINITY && rlimsize < freesize &&
rlimsize < *pages) {
+ LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using getrlim for
availpages \n",0,0,0);
+ *availpages = rlimsize;
+ } else if (*pages < freesize) {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for
availpages \n",0,0,0);
*availpages = *pages;
- } else if ( freesize < *pages && freesize < *availpages ) {
+ } else {
LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using freesize for
availpages \n",0,0,0);
*availpages = freesize;
- } else {
- LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using getrlim for
availpages \n",0,0,0);
}
-
}
#endif /* linux */
diff --git a/ldap/systools/idsktune.c b/ldap/systools/idsktune.c
index 6a24b0e..c7e76e7 100644
--- a/ldap/systools/idsktune.c
+++ b/ldap/systools/idsktune.c
@@ -2380,7 +2380,12 @@ static void disk_tests(void)
if (flag_debug) {
printf("DEBUG : RLIMIT_CORE is %ld, %ld\n", r.rlim_cur, r.rlim_max);
}
- if (r.rlim_cur == (unsigned long)-1 || r.rlim_cur >= 2147483647) {
+
+#if defined(RLIM_INFINITY)
+ if (r.rlim_cur == RLIM_INFINITY || r.rlim_cur >= 2147483647) {
+#else
+ if (r.rlim_cur >= 2147483647) {
+#endif
if (swap_mb <2048) {
max_core = swap_mb;
} else {
@@ -2482,7 +2487,7 @@ static void check_mem_size(int ro,char *rn)
rprev = r.rlim_cur;
r.rlim_cur = r.rlim_max;
setrlimit(ro,&r);
- getrlimit(ro,&r);
+ getrlimit(ro,&r);
if (flag_debug) printf("DEBUG : %s (%d) max %d prev %d.\n", rn, ro,
(int)r.rlim_cur, rprev);
@@ -2490,11 +2495,17 @@ static void check_mem_size(int ro,char *rn)
if (r.rlim_cur <= 0L) {
return;
}
-#endif
+#endif
if (r.rlim_cur <= 0) {
return;
}
+#if defined(RLIM_INFINITY)
+ if (r.rlim_cur == RLIM_INFINITY) {
+ return;
+ }
+#endif
+
m_mb = r.rlim_cur / 1048576;
if (m_mb < mem_min) { /* 64 MB */
@@ -2522,7 +2533,11 @@ static void limits_tests(void)
#if defined(RLIMIT_NOFILE)
getrlimit(RLIMIT_NOFILE,&r);
+#if defined(RLIM_INFINITY)
+ if (r.rlim_max <= 1024 && r.rlim_max != RLIM_INFINITY) {
+#else
if (r.rlim_max <= 1024) {
+#endif
if (flag_html) printf("<P>\n");
if (flag_carrier) {
@@ -2568,7 +2583,11 @@ static void limits_tests(void)
}
}
+#if defined(RLIM_INFINITY)
+ if (r.rlim_cur <= 1024 && r.rlim_max != RLIM_INFINITY) {
+#else
if (r.rlim_cur <= 1024) {
+#endif
if (flag_html) {
printf("<P>\n");
}