You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by James Peach <jp...@apache.org> on 2015/10/23 02:09:55 UTC

Re: trafficserver git commit: TS-315: Add switch to disable config file generation/runtime behavior changing

Hey Bryan,

I think that proxy.config.disable_configuration_modification should prevent rewriting the config, but you should still be able to update proxy.config.disable_configuration_modification out of band and have it update without a restart. Apart from that, disabling the update threads prevents proxy.node.config.reconfigure_required working correctly.


> On Oct 22, 2015, at 4:35 PM, bcall@apache.org wrote:
> 
> Repository: trafficserver
> Updated Branches:
>  refs/heads/master 3ce7dfa06 -> 3e7504eec
> 
> 
> TS-315: Add switch to disable config file generation/runtime behavior changing
> 
> 
> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/3e7504ee
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/3e7504ee
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/3e7504ee
> 
> Branch: refs/heads/master
> Commit: 3e7504eec85bd69c91d694591968369d16ffe1c3
> Parents: 3ce7dfa
> Author: Bryan Call <bc...@apache.org>
> Authored: Thu Oct 22 16:33:35 2015 -0700
> Committer: Bryan Call <bc...@apache.org>
> Committed: Thu Oct 22 16:33:56 2015 -0700
> 
> ----------------------------------------------------------------------
> lib/records/RecLocal.cc   | 11 ++++++++---
> lib/records/RecProcess.cc | 17 ++++++++++++-----
> mgmt/RecordsConfig.cc     |  3 ++-
> mgmt/api/TSControlMain.cc |  9 +++++++++
> 4 files changed, 31 insertions(+), 9 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/3e7504ee/lib/records/RecLocal.cc
> ----------------------------------------------------------------------
> diff --git a/lib/records/RecLocal.cc b/lib/records/RecLocal.cc
> index c97f93e..8846691 100644
> --- a/lib/records/RecLocal.cc
> +++ b/lib/records/RecLocal.cc
> @@ -209,9 +209,14 @@ RecLocalInitMessage()
> int
> RecLocalStart(FileManager *configFiles)
> {
> -  ink_thread_create(sync_thr, configFiles);
> -  ink_thread_create(config_update_thr, NULL);
> -
> +  RecInt disable_modification = 0;
> +  RecGetRecordInt("proxy.config.disable_configuration_modification", &disable_modification);
> +  if (disable_modification == 1) {
> +    RecDebug(DL_Debug, "Disable configuration modification");
> +  } else {
> +    ink_thread_create(sync_thr, configFiles);
> +    ink_thread_create(config_update_thr, NULL);
> +  }

This should start the threads but sync_thr() should check the configuration.

>   return REC_ERR_OKAY;
> }
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/3e7504ee/lib/records/RecProcess.cc
> ----------------------------------------------------------------------
> diff --git a/lib/records/RecProcess.cc b/lib/records/RecProcess.cc
> index 5cefe0f..ed95d6d 100644
> --- a/lib/records/RecProcess.cc
> +++ b/lib/records/RecProcess.cc
> @@ -491,15 +491,22 @@ RecProcessStart(void)
> 
>   Debug("statsproc", "Starting sync continuations:");
>   raw_stat_sync_cont *rssc = new raw_stat_sync_cont(new_ProxyMutex());
> -  Debug("statsproc", "\traw-stat syncer");
> +  Debug("statsproc", "raw-stat syncer");
>   raw_stat_sync_cont_event = eventProcessor.schedule_every(rssc, HRTIME_MSECONDS(g_rec_raw_stat_sync_interval_ms), ET_TASK);
> 
> -  config_update_cont *cuc = new config_update_cont(new_ProxyMutex());
> -  Debug("statsproc", "\tconfig syncer");
> -  config_update_cont_event = eventProcessor.schedule_every(cuc, HRTIME_MSECONDS(g_rec_config_update_interval_ms), ET_TASK);
> +  RecInt disable_modification = 0;
> +  RecGetRecordInt("proxy.config.disable_configuration_modification", &disable_modification);
> +  // Schedule continuation to call the configuration callbacks if we are allowed to modify configuration in RAM
> +  if (disable_modification == 1) {
> +    Debug("statsproc", "Disabled configuration modification");
> +  } else {
> +    config_update_cont *cuc = new config_update_cont(new_ProxyMutex());
> +    Debug("statsproc", "config syncer");
> +    config_update_cont_event = eventProcessor.schedule_every(cuc, HRTIME_MSECONDS(g_rec_config_update_interval_ms), ET_TASK);
> +  }

This should always start the syncer, but the syncer should check the config and decide to do nothing.

>   sync_cont *sc = new sync_cont(new_ProxyMutex());
> -  Debug("statsproc", "\tremote syncer");
> +  Debug("statsproc", "remote syncer");
>   sync_cont_event = eventProcessor.schedule_every(sc, HRTIME_MSECONDS(g_rec_remote_sync_interval_ms), ET_TASK);
> 
>   g_started = true;
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/3e7504ee/mgmt/RecordsConfig.cc
> ----------------------------------------------------------------------
> diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
> index 66c5ee6..b8bced0 100644
> --- a/mgmt/RecordsConfig.cc
> +++ b/mgmt/RecordsConfig.cc
> @@ -1069,7 +1069,8 @@ static const RecordElement RecordsConfig[] =
>   ,
>   {RECT_CONFIG, "proxy.config.hostdb.host_file.interval", RECD_INT, "86400", RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
>   ,
> -
> +  {RECT_CONFIG, "proxy.config.disable_configuration_modification", RECD_INT, "0", RECU_RESTART_TS, RR_NULL, RECC_NULL, "[0-1]", RECA_NULL}
> +  ,
>   //##########################################################################
>   //#
>   //# HTTP
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/3e7504ee/mgmt/api/TSControlMain.cc
> ----------------------------------------------------------------------
> diff --git a/mgmt/api/TSControlMain.cc b/mgmt/api/TSControlMain.cc
> index 6225773..3aafd07 100644
> --- a/mgmt/api/TSControlMain.cc
> +++ b/mgmt/api/TSControlMain.cc
> @@ -48,6 +48,8 @@ static InkHashTable *accepted_con; // a list of all accepted client connections
> 
> static TSMgmtError handle_control_message(int fd, void *msg, size_t msglen);
> 
> +static RecInt disable_modification = 0;

This doesn't need to be global, it (and the record check) should be pushed down into handle_record_set().

> +
> /*********************************************************************
>  * create_client
>  *
> @@ -140,6 +142,8 @@ ts_ctrl_main(void *arg)
>   int fds_ready;                       // stores return value for select
>   struct timeval timeout;
> 
> +  RecGetRecordInt("proxy.config.disable_configuration_modification", &disable_modification);
> +
>   // loops until TM dies; waits for and processes requests from clients
>   while (1) {
>     // LINUX: to prevent hard-spin of CPU,  reset timeout on each loop
> @@ -1195,6 +1199,11 @@ handle_control_message(int fd, void *req, size_t reqlen)
>     goto fail;
>   }
> 
> +  if (optype == RECORD_SET && disable_modification == 1) {
> +    Debug("ts_main", "Trying to set a record when disable configuration modification is on, returning permission denied");
> +    return send_mgmt_error(fd, optype, TS_ERR_PERMISSION_DENIED);
> +  }
> +
>   if (handlers[optype].handler == NULL) {
>     goto fail;
>   }
>