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 2172e45 This adds a new callback to remap APIs: TSRemapConfigReload
2172e45 is described below
commit 2172e45780bbd3023a618f2d2810b42eb3fb4d5e
Author: Leif Hedstrom <[email protected]>
AuthorDate: Wed May 2 14:11:56 2018 -0600
This adds a new callback to remap APIs: TSRemapConfigReload
The purpose of this is to send a notification to every remap plugin
(if they implement this callback) that a remap.config is about to
be reloaded. This can be useful for some plugin that needs to know
that it's about to get instantiated one or numerous times.
This new callback is optional, so this should be a compatible
change. It takes no arguments, and has no return value.
Once this has landed, I'll update the s3_auth plugin with an example
how this new callback can be useful. But tldr; this plugin has a
little config state cache, which has to be reset whenever the remap
rules are reloaded.
---
doc/developer-guide/api/functions/TSRemap.en.rst | 8 +++++++-
proxy/ReverseProxy.cc | 5 ++---
proxy/api/ts/remap.h | 8 ++++++++
proxy/http/remap/RemapConfig.cc | 21 +++++++++++++++------
proxy/http/remap/RemapPluginInfo.cc | 17 +++++++++++++++++
proxy/http/remap/RemapPluginInfo.h | 4 ++++
6 files changed, 53 insertions(+), 10 deletions(-)
diff --git a/doc/developer-guide/api/functions/TSRemap.en.rst
b/doc/developer-guide/api/functions/TSRemap.en.rst
index 1eb3f579..77b80f8 100644
--- a/doc/developer-guide/api/functions/TSRemap.en.rst
+++ b/doc/developer-guide/api/functions/TSRemap.en.rst
@@ -30,6 +30,7 @@ Synopsis
`#include <ts/remap.h>`
.. function:: TSReturnCode TSRemapInit(TSRemapInterface * api_info, char *
errbuf, int errbuf_size)
+.. function:: void TSRemapConfigReload(void)
.. function:: void TSRemapDone(void)
.. function:: TSRemapStatus TSRemapDoRemap(void * ih, TSHttpTxn rh,
TSRemapRequestInfo * rri)
.. function:: TSReturnCode TSRemapNewInstance(int argc, char * argv[], void **
ih, char * errbuf, int errbuf_size)
@@ -57,12 +58,17 @@ the remap plugin.
A remap plugin may be invoked for different remap rules. Traffic Server
will call the entry point each time a plugin is specified in a remap
rule. When a remap plugin instance is no longer required, Traffic Server
-will call :func:`TSRemapDeleteInstance`.
+will call :func:`TSRemapDeleteInstance`. At that point, it's safe to remove
+any data or continuations associated with that instance.
:func:`TSRemapDoRemap` is called for each HTTP transaction. This is a mandatory
entry point. In this function, the remap plugin may examine and modify
the HTTP transaction.
+:func:`TSRemapConfigReload` is called once for every remap plugin just before
the
+remap configuration file (:file:`remap.config`) is reloaded. This is an
optional
+entry point, which takes no arguments and has no return value.
+
Types
=====
diff --git a/proxy/ReverseProxy.cc b/proxy/ReverseProxy.cc
index 6203dda..3d7e174 100644
--- a/proxy/ReverseProxy.cc
+++ b/proxy/ReverseProxy.cc
@@ -44,8 +44,8 @@
// Global Ptrs
static Ptr<ProxyMutex> reconfig_mutex;
-UrlRewrite *rewrite_table = nullptr;
-remap_plugin_info *remap_pi_list; // We never reload the remap plugins, just
append to 'em.
+UrlRewrite *rewrite_table = nullptr;
+remap_plugin_info *remap_pi_list = nullptr; // We never reload the remap
plugins, just append to 'em.
// Tokens for the Callback function
#define FILE_CHANGED 0
@@ -58,7 +58,6 @@ remap_plugin_info *remap_pi_list; // We never reload the
remap plugins, just app
//
// Begin API Functions
//
-
int
init_reverse_proxy()
{
diff --git a/proxy/api/ts/remap.h b/proxy/api/ts/remap.h
index 70847bd..edc1c23 100644
--- a/proxy/api/ts/remap.h
+++ b/proxy/api/ts/remap.h
@@ -88,6 +88,14 @@ typedef enum {
*/
tsapi TSReturnCode TSRemapInit(TSRemapInterface *api_info, char *errbuf, int
errbuf_size);
+/* This gets called everytime remap.config is reloaded. This is complementary
+ to TSRemapInit() which gets called when the plugin is first loaded. You can
+ not fail, or cause reload to stop here, it's merely a notification.
+ Optional function.
+ Return: none
+*/
+tsapi void TSRemapConfigReload(void);
+
/* Remap new request
Mandatory interface function.
Remap API plugin can/should use SDK API function calls inside this function!
diff --git a/proxy/http/remap/RemapConfig.cc b/proxy/http/remap/RemapConfig.cc
index 0b508e9..f082374 100644
--- a/proxy/http/remap/RemapConfig.cc
+++ b/proxy/http/remap/RemapConfig.cc
@@ -796,13 +796,17 @@ remap_load_plugin(const char **argv, int argc,
url_mapping *mp, char *errbuf, in
snprintf(errbuf, errbufsize, "Can't load plugin \"%s\" - %s", c, err ?
err : "Unknown dlopen() error");
return -4;
}
- pi->fp_tsremap_init = (remap_plugin_info::_tsremap_init
*)dlsym(pi->dlh, TSREMAP_FUNCNAME_INIT);
- pi->fp_tsremap_done = (remap_plugin_info::_tsremap_done
*)dlsym(pi->dlh, TSREMAP_FUNCNAME_DONE);
- pi->fp_tsremap_new_instance = (remap_plugin_info::_tsremap_new_instance
*)dlsym(pi->dlh, TSREMAP_FUNCNAME_NEW_INSTANCE);
+ pi->fp_tsremap_init = reinterpret_cast<remap_plugin_info::_tsremap_init
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_INIT));
+ pi->fp_tsremap_config_reload =
+ reinterpret_cast<remap_plugin_info::_tsremap_config_reload
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_CONFIG_RELOAD));
+ pi->fp_tsremap_done = reinterpret_cast<remap_plugin_info::_tsremap_done
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_DONE));
+ pi->fp_tsremap_new_instance =
+ reinterpret_cast<remap_plugin_info::_tsremap_new_instance
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_NEW_INSTANCE));
pi->fp_tsremap_delete_instance =
- (remap_plugin_info::_tsremap_delete_instance *)dlsym(pi->dlh,
TSREMAP_FUNCNAME_DELETE_INSTANCE);
- pi->fp_tsremap_do_remap = (remap_plugin_info::_tsremap_do_remap
*)dlsym(pi->dlh, TSREMAP_FUNCNAME_DO_REMAP);
- pi->fp_tsremap_os_response = (remap_plugin_info::_tsremap_os_response
*)dlsym(pi->dlh, TSREMAP_FUNCNAME_OS_RESPONSE);
+ reinterpret_cast<remap_plugin_info::_tsremap_delete_instance
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_DELETE_INSTANCE));
+ pi->fp_tsremap_do_remap =
reinterpret_cast<remap_plugin_info::_tsremap_do_remap *>(dlsym(pi->dlh,
TSREMAP_FUNCNAME_DO_REMAP));
+ pi->fp_tsremap_os_response =
+ reinterpret_cast<remap_plugin_info::_tsremap_os_response
*>(dlsym(pi->dlh, TSREMAP_FUNCNAME_OS_RESPONSE));
if (!pi->fp_tsremap_init) {
snprintf(errbuf, errbufsize, R"(Can't find "%s" function in remap
plugin "%s")", TSREMAP_FUNCNAME_INIT, c);
@@ -1418,6 +1422,11 @@ remap_parse_config(const char *path, UrlRewrite *rewrite)
{
BUILD_TABLE_INFO bti;
+ // If this happens to be a config reload, the list of loaded remap plugins
is non-empty, and we
+ // can signal all these plugins that a reload has begun.
+ if (remap_pi_list) {
+ remap_pi_list->indicate_reload();
+ }
bti.rewrite = rewrite;
return remap_parse_config_bti(path, &bti);
}
diff --git a/proxy/http/remap/RemapPluginInfo.cc
b/proxy/http/remap/RemapPluginInfo.cc
index 9b48c48..8e36374 100644
--- a/proxy/http/remap/RemapPluginInfo.cc
+++ b/proxy/http/remap/RemapPluginInfo.cc
@@ -31,6 +31,7 @@ remap_plugin_info::remap_plugin_info(char *_path)
path_size(0),
dlh(nullptr),
fp_tsremap_init(nullptr),
+ fp_tsremap_config_reload(nullptr),
fp_tsremap_done(nullptr),
fp_tsremap_new_instance(nullptr),
fp_tsremap_delete_instance(nullptr),
@@ -107,3 +108,19 @@ remap_plugin_info::delete_my_list()
delete this;
}
+
+//
+// Tell all plugins (that so wish) that remap.config is being reloaded
+//
+void
+remap_plugin_info::indicate_reload()
+{
+ remap_plugin_info *p = this;
+
+ while (p) {
+ if (p->fp_tsremap_config_reload) {
+ p->fp_tsremap_config_reload();
+ }
+ p = p->next;
+ }
+}
diff --git a/proxy/http/remap/RemapPluginInfo.h
b/proxy/http/remap/RemapPluginInfo.h
index ad64ac2..92fdf91 100644
--- a/proxy/http/remap/RemapPluginInfo.h
+++ b/proxy/http/remap/RemapPluginInfo.h
@@ -28,6 +28,7 @@
#include "api/ts/remap.h"
#define TSREMAP_FUNCNAME_INIT "TSRemapInit"
+#define TSREMAP_FUNCNAME_CONFIG_RELOAD "TSRemapConfigReload"
#define TSREMAP_FUNCNAME_DONE "TSRemapDone"
#define TSREMAP_FUNCNAME_NEW_INSTANCE "TSRemapNewInstance"
#define TSREMAP_FUNCNAME_DELETE_INSTANCE "TSRemapDeleteInstance"
@@ -43,6 +44,7 @@ class remap_plugin_info
{
public:
typedef TSReturnCode _tsremap_init(TSRemapInterface *api_info, char *errbuf,
int errbuf_size);
+ typedef void _tsremap_config_reload();
typedef void _tsremap_done(void);
typedef TSReturnCode _tsremap_new_instance(int argc, char *argv[], void
**ih, char *errbuf, int errbuf_size);
typedef void _tsremap_delete_instance(void *);
@@ -54,6 +56,7 @@ public:
int path_size;
void *dlh; /* "handle" for the dynamic library */
_tsremap_init *fp_tsremap_init;
+ _tsremap_config_reload *fp_tsremap_config_reload;
_tsremap_done *fp_tsremap_done;
_tsremap_new_instance *fp_tsremap_new_instance;
_tsremap_delete_instance *fp_tsremap_delete_instance;
@@ -66,6 +69,7 @@ public:
remap_plugin_info *find_by_path(char *_path);
void add_to_list(remap_plugin_info *pi);
void delete_my_list();
+ void indicate_reload();
};
/**
--
To stop receiving notification emails like this one, please contact
[email protected].