You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2019/09/25 13:43:04 UTC

[trafficserver] 04/05: Add example plugin to show how to use TSRedoCacheLookup.

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

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

commit f04a98b16f5dacdf3db66c9e50822ca851274986
Author: David Calavera <da...@gmail.com>
AuthorDate: Thu Sep 5 11:47:20 2019 -0700

    Add example plugin to show how to use TSRedoCacheLookup.
    
    Signed-off-by: David Calavera <da...@gmail.com>
---
 plugins/Makefile.am                                |   1 +
 .../experimental/redo_cache_lookup/Makefile.inc    |  27 +++++
 plugins/experimental/redo_cache_lookup/README.md   |  11 ++
 .../redo_cache_lookup/redo_cache_lookup.cc         | 111 +++++++++++++++++++++
 4 files changed, 150 insertions(+)

diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 9818f9c..0f41f43 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -71,6 +71,7 @@ include experimental/memcache/Makefile.inc
 include experimental/metalink/Makefile.inc
 include experimental/money_trace/Makefile.inc
 include experimental/mp4/Makefile.inc
+include experimental/redo_cache_lookup/Makefile.inc
 include experimental/server_push_preload/Makefile.inc
 include experimental/slice/Makefile.inc
 include experimental/sslheaders/Makefile.inc
diff --git a/plugins/experimental/redo_cache_lookup/Makefile.inc b/plugins/experimental/redo_cache_lookup/Makefile.inc
new file mode 100644
index 0000000..316d6db
--- /dev/null
+++ b/plugins/experimental/redo_cache_lookup/Makefile.inc
@@ -0,0 +1,27 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+pkglib_LTLIBRARIES += experimental/redo_cache_lookup/redo_cache_lookup.la
+
+experimental_redo_cache_lookup_redo_cache_lookup_la_SOURCES = \
+  experimental/redo_cache_lookup/redo_cache_lookup.cc
+
+experimental_redo_cache_lookup_redo_cache_lookup_la_LDFLAGS = \
+  $(AM_LDFLAGS)
+
+experimental_redo_cache_lookup_redo_cache_lookup_la_LIBADD = \
+  $(top_builddir)/src/tscpp/api/libtscppapi.la
+
diff --git a/plugins/experimental/redo_cache_lookup/README.md b/plugins/experimental/redo_cache_lookup/README.md
new file mode 100644
index 0000000..7ad5dda
--- /dev/null
+++ b/plugins/experimental/redo_cache_lookup/README.md
@@ -0,0 +1,11 @@
+# Redo Cache Lookup Plugin
+
+This plugin shows how to use the experimental `TSHttpTxnRedoCacheLookup` api. It works by checking the cache for a fallback url if the cache lookup failed for any given url.
+
+## Configuration
+
+Add this plugin to `plugin.config` with the `--fallback` option:
+
+```
+redo_cache_lookup.so --fallback http://example.com/fallback_url
+```
\ No newline at end of file
diff --git a/plugins/experimental/redo_cache_lookup/redo_cache_lookup.cc b/plugins/experimental/redo_cache_lookup/redo_cache_lookup.cc
new file mode 100644
index 0000000..b294309
--- /dev/null
+++ b/plugins/experimental/redo_cache_lookup/redo_cache_lookup.cc
@@ -0,0 +1,111 @@
+/** @file
+
+  A plugin to redo cache lookups with a fallback if cache lookups fail for specific urls.
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+#include <iostream>
+#include <regex>
+#include <set>
+#include <sstream>
+#include <getopt.h>
+
+#include <ts/ts.h>
+#include <ts/experimental.h>
+#include "tscpp/api/GlobalPlugin.h"
+#include "tscpp/api/utils.h"
+
+#define PLUGIN_NAME "redo_cache_lookup"
+
+using namespace atscppapi;
+
+namespace
+{
+GlobalPlugin *plugin;
+}
+
+class RedoCacheLookupPlugin : public GlobalPlugin
+{
+public:
+  RedoCacheLookupPlugin(const char *fallback) : fallback(fallback)
+  {
+    TSDebug(PLUGIN_NAME, "registering transaction hooks");
+    RedoCacheLookupPlugin::registerHook(HOOK_CACHE_LOOKUP_COMPLETE);
+  }
+
+  void
+  handleReadCacheLookupComplete(Transaction &transaction) override
+  {
+    Transaction::CacheStatus status = transaction.getCacheStatus();
+
+    if (status == Transaction::CacheStatus::CACHE_LOOKUP_NONE || status == Transaction::CacheStatus::CACHE_LOOKUP_SKIPED ||
+        status == Transaction::CacheStatus::CACHE_LOOKUP_MISS) {
+      TSDebug(PLUGIN_NAME, "rewinding to check for fallback url: %s", fallback);
+      TSHttpTxn txnp = static_cast<TSHttpTxn>(transaction.getAtsHandle());
+      TSHttpTxnRedoCacheLookup(txnp, fallback, strlen(fallback));
+    }
+
+    transaction.resume();
+  }
+
+private:
+  const char *fallback;
+};
+
+void
+TSPluginInit(int argc, const char *argv[])
+{
+  TSDebug(PLUGIN_NAME, "Init");
+  if (!RegisterGlobalPlugin("RedoCacheLookupPlugin", PLUGIN_NAME, "dev@trafficserver.apache.org")) {
+    return;
+  }
+
+  const char *fallback = nullptr;
+
+  // Read options from plugin.config
+  static const struct option longopts[] = {{"fallback", required_argument, nullptr, 'f'}};
+
+  int opt = 0;
+
+  while (opt >= 0) {
+    opt = getopt_long(argc, const_cast<char *const *>(argv), "f:", longopts, nullptr);
+    switch (opt) {
+    case 'f':
+      fallback = optarg;
+      break;
+    case -1:
+    case '?':
+      break;
+    default:
+      TSDebug(PLUGIN_NAME, "Unexpected option: %i", opt);
+      TSError("[%s] Unexpected options error.", PLUGIN_NAME);
+      return;
+    }
+  }
+
+  if (nullptr == fallback) {
+    TSDebug(PLUGIN_NAME, "Missing fallback option.");
+    TSError("[%s] Missing fallback option", PLUGIN_NAME);
+    return;
+  }
+  TSDebug(PLUGIN_NAME, "Initialized with fallback: %s", fallback);
+
+  plugin = new RedoCacheLookupPlugin(fallback);
+}