The Samba-Bugzilla – Attachment 6437 Details for
Bug 7610
winbindd_cache.tdb grows too large when scaled
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
git-am fix for 3.5.next
0001-tdb_expand-limit-the-expansion-with-huge-records.patch (text/plain), 2.14 KB, created by
Jeremy Allison
on 2011-05-06 21:42:37 UTC
(
hide
)
Description:
git-am fix for 3.5.next
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2011-05-06 21:42:37 UTC
Size:
2.14 KB
patch
obsolete
>From cb884186a55c9ef8aca6ee48b16423b3c881e689 Mon Sep 17 00:00:00 2001 >From: Simo Sorce <idra@samba.org> >Date: Mon, 18 Apr 2011 22:15:11 +0930 >Subject: [PATCH] tdb_expand: limit the expansion with huge records > >ldb can create huge records when saving indexes. >Limit the tdb expansion to avoid consuming a lot of memory for >no good reason if the record being saved is huge. >--- > lib/tdb/common/io.c | 25 ++++++++++++++++++++----- > 1 files changed, 20 insertions(+), 5 deletions(-) > >diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c >index 058ca6c..78bbf2e 100644 >--- a/lib/tdb/common/io.c >+++ b/lib/tdb/common/io.c >@@ -299,7 +299,7 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_off_t size, tdb_off_t ad > int tdb_expand(struct tdb_context *tdb, tdb_off_t size) > { > struct tdb_record rec; >- tdb_off_t offset, new_size; >+ tdb_off_t offset, new_size, top_size, map_size; > > if (tdb_lock(tdb, -1, F_WRLCK) == -1) { > TDB_LOG((tdb, TDB_DEBUG_ERROR, "lock failed in tdb_expand\n")); >@@ -309,10 +309,25 @@ int tdb_expand(struct tdb_context *tdb, tdb_off_t size) > /* must know about any previous expansions by another process */ > tdb->methods->tdb_oob(tdb, tdb->map_size + 1, 1); > >- /* always make room for at least 100 more records, and at >- least 25% more space. Round the database up to a multiple >- of the page size */ >- new_size = MAX(tdb->map_size + size*100, tdb->map_size * 1.25); >+ /* limit size in order to avoid using up huge amounts of memory for >+ * in memory tdbs if an oddball huge record creeps in */ >+ if (size > 100 * 1024) { >+ top_size = tdb->map_size + size * 2; >+ } else { >+ top_size = tdb->map_size + size * 100; >+ } >+ >+ /* always make room for at least top_size more records, and at >+ least 25% more space. if the DB is smaller than 100MiB, >+ otherwise grow it by 10% only. */ >+ if (tdb->map_size > 100 * 1024 * 1024) { >+ map_size = tdb->map_size * 1.10; >+ } else { >+ map_size = tdb->map_size * 1.25; >+ } >+ >+ /* Round the database up to a multiple of the page size */ >+ new_size = MAX(top_size, map_size); > size = TDB_ALIGN(new_size, tdb->page_size) - tdb->map_size; > > if (!(tdb->flags & TDB_INTERNAL)) >-- >1.7.3.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Flags:
idra
:
review+
Actions:
View
Attachments on
bug 7610
:
6128
| 6437