This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new b38ef432eb Add a dir-entry setting to volumes.config (#11838)
b38ef432eb is described below

commit b38ef432ebf9910f33258f88ed446627c2b333f7
Author: Leif Hedstrom <[email protected]>
AuthorDate: Thu Nov 14 16:48:14 2024 -0700

    Add a dir-entry setting to volumes.config (#11838)
---
 doc/admin-guide/files/volume.config.en.rst | 11 ++++++++++-
 src/iocore/cache/Cache.cc                  |  2 +-
 src/iocore/cache/CacheHosting.cc           | 12 +++++++++++-
 src/iocore/cache/CacheProcessor.cc         |  1 +
 src/iocore/cache/P_CacheHosting.h          |  1 +
 src/iocore/cache/Stripe.cc                 | 20 ++++++++++++--------
 src/iocore/cache/Stripe.h                  |  7 ++++---
 src/iocore/cache/StripeSM.cc               |  4 ++--
 src/iocore/cache/StripeSM.h                |  2 +-
 9 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/doc/admin-guide/files/volume.config.en.rst 
b/doc/admin-guide/files/volume.config.en.rst
index 7aa0426d3f..91fc2e648a 100644
--- a/doc/admin-guide/files/volume.config.en.rst
+++ b/doc/admin-guide/files/volume.config.en.rst
@@ -68,6 +68,15 @@ sits in front of a volume.  This may be desirable if you are 
using something lik
 ramdisks, to avoid wasting RAM and cpu time on double caching objects.
 
 
+Optional directory entry sizing
+-------------------------------
+
+You can also add an option ``avg_obj_size=<size>`` to the volume configuration
+line. This overrides the global 
:ts:cv:`proxy.config.cache.min_average_object_size`
+configuration for this volume. This is useful if you have a volume that is 
dedicated
+for say very small objects, and you need a lot of directory entries to store 
them.
+
+
 Exclusive spans and volume sizes
 ================================
 
@@ -106,5 +115,5 @@ ramcache has been disabled.::
     volume=1 scheme=http size=20%
     volume=2 scheme=http size=20%
     volume=3 scheme=http size=20%
-    volume=4 scheme=http size=20%
+    volume=4 scheme=http size=20% avg_obj_size=4096
     volume=5 scheme=http size=20% ramcache=false
diff --git a/src/iocore/cache/Cache.cc b/src/iocore/cache/Cache.cc
index 6e80427aab..04f88f3416 100644
--- a/src/iocore/cache/Cache.cc
+++ b/src/iocore/cache/Cache.cc
@@ -273,7 +273,7 @@ Cache::open(bool clear, bool /* fix ATS_UNUSED */)
           for (; q; q = q->link.next) {
             blocks                         = q->b->len;
             CacheDisk *d                   = cp->disk_stripes[i]->disk;
-            cp->stripes[vol_no]            = new StripeSM(d, blocks, 
q->b->offset);
+            cp->stripes[vol_no]            = new StripeSM(d, blocks, 
q->b->offset, cp->avg_obj_size);
             cp->stripes[vol_no]->cache     = this;
             cp->stripes[vol_no]->cache_vol = cp;
 
diff --git a/src/iocore/cache/CacheHosting.cc b/src/iocore/cache/CacheHosting.cc
index cc1daf61d4..e984d41f0b 100644
--- a/src/iocore/cache/CacheHosting.cc
+++ b/src/iocore/cache/CacheHosting.cc
@@ -654,6 +654,7 @@ ConfigVolumes::BuildListFromString(char *config_file_path, 
char *file_buf)
     int         size             = 0;
     int         in_percent       = 0;
     bool        ramcache_enabled = true;
+    int         avg_obj_size     = -1; // Defaults
 
     while (true) {
       // skip all blank spaces at beginning of line
@@ -741,6 +742,13 @@ ConfigVolumes::BuildListFromString(char *config_file_path, 
char *file_buf)
         } else {
           in_percent = 0;
         }
+      } else if (strcasecmp(tmp, "avg_obj_size") == 0) { // match avg_obj_size
+        tmp          += 13;
+        avg_obj_size  = atoi(tmp);
+
+        while (ParseRules::is_digit(*tmp)) {
+          tmp++;
+        }
       } else if (strcasecmp(tmp, "ramcache") == 0) { // match ramcache
         tmp += 9;
         if (!strcasecmp(tmp, "false")) {
@@ -767,7 +775,8 @@ ConfigVolumes::BuildListFromString(char *config_file_path, 
char *file_buf)
       /* add the config */
 
       ConfigVol *configp = new ConfigVol();
-      configp->number    = volume_number;
+
+      configp->number = volume_number;
       if (in_percent) {
         configp->percent    = size;
         configp->in_percent = true;
@@ -776,6 +785,7 @@ ConfigVolumes::BuildListFromString(char *config_file_path, 
char *file_buf)
       }
       configp->scheme           = scheme;
       configp->size             = size;
+      configp->avg_obj_size     = avg_obj_size;
       configp->cachep           = nullptr;
       configp->ramcache_enabled = ramcache_enabled;
       cp_queue.enqueue(configp);
diff --git a/src/iocore/cache/CacheProcessor.cc 
b/src/iocore/cache/CacheProcessor.cc
index 916f4a66e1..402fc619c5 100644
--- a/src/iocore/cache/CacheProcessor.cc
+++ b/src/iocore/cache/CacheProcessor.cc
@@ -1177,6 +1177,7 @@ cplist_update()
       if (config_vol->number == cp->vol_number) {
         if (cp->scheme == config_vol->scheme) {
           cp->ramcache_enabled = config_vol->ramcache_enabled;
+          cp->avg_obj_size     = config_vol->avg_obj_size;
           config_vol->cachep   = cp;
         } else {
           /* delete this volume from all the disks */
diff --git a/src/iocore/cache/P_CacheHosting.h 
b/src/iocore/cache/P_CacheHosting.h
index 9e83e09db4..ef111cc899 100644
--- a/src/iocore/cache/P_CacheHosting.h
+++ b/src/iocore/cache/P_CacheHosting.h
@@ -296,6 +296,7 @@ struct ConfigVol {
   bool      in_percent;
   bool      ramcache_enabled;
   int       percent;
+  int       avg_obj_size;
   CacheVol *cachep;
   LINK(ConfigVol, link);
 };
diff --git a/src/iocore/cache/Stripe.cc b/src/iocore/cache/Stripe.cc
index 628249643e..90e33ebbef 100644
--- a/src/iocore/cache/Stripe.cc
+++ b/src/iocore/cache/Stripe.cc
@@ -84,7 +84,7 @@ struct StripeInitInfo {
 // Stripe
 //
 
-Stripe::Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip)
+Stripe::Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size)
   : path{ats_strdup(disk->path)},
     fd{disk->fd},
     skip{ROUND_TO_STORE_BLOCK((dir_skip < START_POS ? START_POS : dir_skip))},
@@ -95,7 +95,7 @@ Stripe::Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip)
   ink_assert(this->len < MAX_STRIPE_SIZE);
 
   this->_init_hash_text(disk->path, blocks, dir_skip);
-  this->_init_data(STORE_BLOCK_SIZE);
+  this->_init_data(STORE_BLOCK_SIZE, avg_obj_size);
   this->_init_directory(this->dirlen(), this->headerlen(), 
DIRECTORY_FOOTER_SIZE);
 }
 
@@ -113,21 +113,25 @@ Stripe::_init_hash_text(char const *seed, off_t blocks, 
off_t dir_skip)
 }
 
 void
-Stripe::_init_data(off_t store_block_size)
+Stripe::_init_data(off_t store_block_size, int avg_obj_size)
 {
   // iteratively calculate start + buckets; updates this->start
-  this->_init_data_internal();
-  this->_init_data_internal();
-  this->_init_data_internal();
+  this->_init_data_internal(avg_obj_size);
+  this->_init_data_internal(avg_obj_size);
+  this->_init_data_internal(avg_obj_size);
 
   this->data_blocks = (this->len - (this->start - this->skip)) / 
store_block_size;
 }
 
 void
-Stripe::_init_data_internal()
+Stripe::_init_data_internal(int avg_obj_size)
 {
+  if (avg_obj_size <= 0) {
+    avg_obj_size = cache_config_min_average_object_size;
+  }
+
   // step1: calculate the number of entries.
-  off_t total_entries = (this->len - (this->start - this->skip)) / 
cache_config_min_average_object_size;
+  off_t total_entries = (this->len - (this->start - this->skip)) / 
avg_obj_size;
   // step2: calculate the number of buckets
   off_t total_buckets = total_entries / DIR_DEPTH;
   // step3: calculate the number of segments, no segment has more than 16384 
buckets
diff --git a/src/iocore/cache/Stripe.h b/src/iocore/cache/Stripe.h
index ebf6e46dba..590d7883d9 100644
--- a/src/iocore/cache/Stripe.h
+++ b/src/iocore/cache/Stripe.h
@@ -51,6 +51,7 @@ struct CacheVol {
   int          scheme           = 0;
   off_t        size             = 0;
   int          num_vols         = 0;
+  int          avg_obj_size     = -1; // Defer to the records.config if not 
overriden
   bool         ramcache_enabled = true;
   StripeSM   **stripes          = nullptr;
   DiskStripe **disk_stripes     = nullptr;
@@ -114,7 +115,7 @@ public:
    *
    * @see START_POS
    */
-  Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip);
+  Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size = -1);
 
   int dir_check();
 
@@ -176,8 +177,8 @@ protected:
 
 private:
   void _init_hash_text(char const *seed, off_t blocks, off_t dir_skip);
-  void _init_data(off_t store_block_size);
-  void _init_data_internal();
+  void _init_data(off_t store_block_size, int avg_obj_size = -1);
+  void _init_data_internal(int avg_obj_size = -1); // Defaults to 
cache_config_min_average_object_size;
   void _init_directory(std::size_t directory_size, int header_size, int 
footer_size);
 };
 
diff --git a/src/iocore/cache/StripeSM.cc b/src/iocore/cache/StripeSM.cc
index d5899dbe29..36a5d61229 100644
--- a/src/iocore/cache/StripeSM.cc
+++ b/src/iocore/cache/StripeSM.cc
@@ -112,8 +112,8 @@ struct StripeInitInfo {
 // This is weird: the len passed to the constructor for _preserved_dirs is
 // initialized in the superclasse's constructor. This is safe because the
 // superclass should always be initialized first.
-StripeSM::StripeSM(CacheDisk *disk, off_t blocks, off_t dir_skip)
-  : Continuation(new_ProxyMutex()), Stripe{disk, blocks, dir_skip}, 
_preserved_dirs{static_cast<int>(len)}
+StripeSM::StripeSM(CacheDisk *disk, off_t blocks, off_t dir_skip, int 
avg_obj_size)
+  : Continuation(new_ProxyMutex()), Stripe{disk, blocks, dir_skip, 
avg_obj_size}, _preserved_dirs{static_cast<int>(len)}
 {
   open_dir.mutex = this->mutex;
   SET_HANDLER(&StripeSM::aggWrite);
diff --git a/src/iocore/cache/StripeSM.h b/src/iocore/cache/StripeSM.h
index 685942c49d..e24b89e497 100644
--- a/src/iocore/cache/StripeSM.h
+++ b/src/iocore/cache/StripeSM.h
@@ -168,7 +168,7 @@ public:
    *
    * @see START_POS
    */
-  StripeSM(CacheDisk *disk, off_t blocks, off_t dir_skip);
+  StripeSM(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size = 
-1);
 
   Queue<CacheVC, Continuation::Link_link> &get_pending_writers();
 

Reply via email to