http_static: add "http static cache clear" CLI 55/22755/2
authorDave Barach <dave@barachs.net>
Tue, 15 Oct 2019 18:52:53 +0000 (14:52 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 17 Oct 2019 14:30:56 +0000 (14:30 +0000)
Useful to force content reloads

Type: feature

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ieecb018bec61a1624574660842d7d92cd84520f9

src/plugins/http_static/static_server.c

index 610ab78..16136d2 100644 (file)
@@ -1656,6 +1656,81 @@ VLIB_CLI_COMMAND (http_show_static_server_command, static) =
 };
 /* *INDENT-ON* */
 
+static clib_error_t *
+http_clear_static_cache_command_fn (vlib_main_t * vm,
+                                   unformat_input_t * input,
+                                   vlib_cli_command_t * cmd)
+{
+  http_static_server_main_t *hsm = &http_static_server_main;
+  file_data_cache_t *dp;
+  u32 free_index;
+  u32 busy_items = 0;
+  BVT (clib_bihash_kv) kv;
+
+  if (hsm->www_root == 0)
+    return clib_error_return (0, "Static server disabled");
+
+  http_static_server_sessions_reader_lock ();
+
+  /* Walk the LRU list to find active entries */
+  free_index = hsm->last_index;
+  while (free_index != ~0)
+    {
+      dp = pool_elt_at_index (hsm->cache_pool, free_index);
+      free_index = dp->prev_index;
+      /* Which could be in use... */
+      if (dp->inuse)
+       {
+         busy_items++;
+         free_index = dp->next_index;
+         continue;
+       }
+      kv.key = (u64) (dp->filename);
+      kv.value = ~0ULL;
+      if (BV (clib_bihash_add_del) (&hsm->name_to_data, &kv,
+                                   0 /* is_add */ ) < 0)
+       {
+         clib_warning ("BUG: cache clear delete '%s' FAILED!", dp->filename);
+       }
+
+      lru_remove (hsm, dp);
+      hsm->cache_size -= vec_len (dp->data);
+      hsm->cache_evictions++;
+      vec_free (dp->filename);
+      vec_free (dp->data);
+      if (hsm->debug_level > 1)
+       clib_warning ("pool put index %d", dp - hsm->cache_pool);
+      pool_put (hsm->cache_pool, dp);
+      free_index = hsm->last_index;
+    }
+  http_static_server_sessions_reader_unlock ();
+  if (busy_items > 0)
+    vlib_cli_output (vm, "Note: %d busy items still in cache...", busy_items);
+  else
+    vlib_cli_output (vm, "Cache cleared...");
+  return 0;
+}
+
+/*?
+ * Clear the static http server cache, to force the server to
+ * reload content from backing files
+ *
+ * @cliexpar
+ * This command clear the static http server cache
+ * @clistart
+ * clear http static cache
+ * @cliend
+ * @cliexcmd{clear http static cache}
+?*/
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (clear_http_static_cache_command, static) =
+{
+  .path = "clear http static cache",
+  .short_help = "clear http static cache",
+  .function = http_clear_static_cache_command_fn,
+};
+/* *INDENT-ON* */
+
 static clib_error_t *
 http_static_server_main_init (vlib_main_t * vm)
 {