]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Alex Rousskov <rousskov@measurement-factory.com>
authorHenrik Nordstrom <henrik@henriknordstrom.net>
Sun, 30 May 2010 09:13:54 +0000 (11:13 +0200)
committerHenrik Nordstrom <henrik@henriknordstrom.net>
Sun, 30 May 2010 09:13:54 +0000 (11:13 +0200)
Bug #2789: Optimize unlimited memory pools, and correctly handle limits > 2GB.

include/MemPool.h
lib/MemPool.cc
src/cf.data.pre
src/mem.cc

index 111e25cbea819ca379e772501c74f1f53798f033..8fe5be2d4b34b1a9d71767cfc176e0d86b613a37 100644 (file)
@@ -45,8 +45,6 @@
 /// \ingroup MemPoolsAPI
 #define MB ((size_t)1024*1024)
 /// \ingroup MemPoolsAPI
-#define mem_unlimited_size 2 * 1024 * MB
-/// \ingroup MemPoolsAPI
 #define toMB(size) ( ((double) size) / MB )
 /// \ingroup MemPoolsAPI
 #define toKB(size) ( (size + 1024 - 1) / 1024 )
@@ -137,9 +135,8 @@ public:
      * totally free chunks are immediately considered for release. Otherwise
      * only chunks that have not been referenced for a long time are checked.
      */
-    void setIdleLimit(size_t new_idle_limit);
-
-    size_t idleLimit() const;
+    void setIdleLimit(ssize_t new_idle_limit);
+    ssize_t idleLimit() const;
 
     /**
      \par
@@ -171,7 +168,7 @@ public:
 
     void setDefaultPoolChunking(bool const &);
     MemImplementingAllocator *pools;
-    int mem_idle_limit;
+    ssize_t mem_idle_limit;
     int poolCount;
     bool defaultIsChunked;
 private:
@@ -396,7 +393,7 @@ struct _MemPoolGlobalStats {
     int tot_items_idle;
 
     int tot_overhead;
-    int mem_idle_limit;
+    ssize_t mem_idle_limit;
 };
 
 /// \ingroup MemPoolsAPI
index beaaf9bee9777176183091d1dc07d3bf1d79ef34..fd58d41bf8ab3f01a742e9e1b4a8bda58d272888 100644 (file)
@@ -103,12 +103,12 @@ memPoolIterateNext(MemPoolIterator * iter)
 }
 
 void
-MemPools::setIdleLimit(size_t new_idle_limit)
+MemPools::setIdleLimit(ssize_t new_idle_limit)
 {
     mem_idle_limit = new_idle_limit;
 }
 
-size_t
+ssize_t
 MemPools::idleLimit() const
 {
     return mem_idle_limit;
@@ -263,14 +263,16 @@ MemImplementingAllocator::freeOne(void *obj)
 void
 MemPools::clean(time_t maxage)
 {
-    MemImplementingAllocator *pool;
-    MemPoolIterator *iter;
+    flushMeters();
+    if (mem_idle_limit < 0) // no limit to enforce
+        return;
 
     int shift = 1;
-    flushMeters();
     if (TheMeter.idle.level > mem_idle_limit)
         maxage = shift = 0;
 
+    MemImplementingAllocator *pool;
+    MemPoolIterator *iter;
     iter = memPoolIterate();
     while ((pool = memPoolIterateNext(iter)))
         if (pool->idleTrigger(shift))
index d173d6556f0a08fec9ae8e8c7457038424205b0a..ee96cd71147fe01ee2134ff9dce7442c41a27fd0 100644 (file)
@@ -6641,7 +6641,7 @@ DOC_START
        memory_pools_limit to a reasonably high value even if your
        configuration will use less memory.
 
-       If set to zero, Squid will keep all memory it can. That is, there
+       If set to none, Squid will keep all memory it can. That is, there
        will be no limit on the total amount of memory used for safe-keeping.
 
        To disable memory allocation optimization, do not set
index 23010d376d3c90252cc91349f9c6806f84bc06bc..0d2c4b81f8571e3b6f94e4e0c080a423963829aa 100644 (file)
@@ -353,8 +353,11 @@ memConfigure(void)
         new_pool_limit = 0;
     else if (Config.MemPools.limit > 0)
         new_pool_limit = Config.MemPools.limit;
-    else
-        new_pool_limit = mem_unlimited_size;
+    else {
+       if (Config.MemPools.limit == 0)
+           debugs(13, 1, "memory_pools_limit 0 has been chagned to memory_pools_limit none. Please update your config");
+        new_pool_limit = -1;
+    }
 
 #if 0
     /** \par
@@ -762,7 +765,8 @@ Mem::Report(std::ostream &stream)
     stream << "Current overhead: " << mp_total.tot_overhead << " bytes (" <<
     std::setprecision(3) << xpercent(mp_total.tot_overhead, mp_total.TheMeter->inuse.level) << "%)\n";
     /* limits */
-    stream << "Idle pool limit: " << std::setprecision(2) << toMB(mp_total.mem_idle_limit) << " MB\n";
+    if (mp_total.mem_idle_limit >= 0)
+        stream << "Idle pool limit: " << std::setprecision(2) << toMB(mp_total.mem_idle_limit) << " MB\n";
     /* limits */
     stream << "Total Pools created: " << mp_total.tot_pools_alloc << "\n";
     stream << "Pools ever used:     " << mp_total.tot_pools_alloc - not_used << " (shown above)\n";