diff --git a/frameworks/ring/Dockerfile b/frameworks/ring/Dockerfile new file mode 100644 index 000000000..f0141279c --- /dev/null +++ b/frameworks/ring/Dockerfile @@ -0,0 +1,10 @@ +FROM docker.io/library/clojure:tools-deps-trixie-slim + +WORKDIR /app + +COPY deps.edn ./ +RUN clojure -X:deps prep + +COPY src ./src + +CMD ["clojure", "-M", "-m", "httparena.ring.core"] diff --git a/frameworks/ring/deps.edn b/frameworks/ring/deps.edn new file mode 100644 index 000000000..f615785f3 --- /dev/null +++ b/frameworks/ring/deps.edn @@ -0,0 +1,10 @@ +{:paths ["src"] + :deps {org.clojure/clojure {:mvn/version "1.12.5"} + org.clojure/data.json {:mvn/version "2.5.2"} + hikari-cp/hikari-cp {:mvn/version "4.1.0"} + com.github.seancorfield/next.jdbc {:mvn/version "1.3.1118"} + org.postgresql/postgresql {:mvn/version "42.7.13"} + ring/ring-core {:mvn/version "1.15.5"} + ring/ring-jetty-adapter {:mvn/version "1.15.5"}} + :aliases {:test {:extra-paths ["test"] + :main-opts ["-m" "httparena.ring.core-test"]}}} diff --git a/frameworks/ring/meta.json b/frameworks/ring/meta.json new file mode 100644 index 000000000..dff524079 --- /dev/null +++ b/frameworks/ring/meta.json @@ -0,0 +1,21 @@ +{ + "display_name": "ring", + "language": "Clojure", + "type": "emerging", + "mode": "standard", + "engine": "Jetty", + "description": "Ring application using the official Ring Jetty adapter and standard Ring middleware.", + "repo": "https://github.com/ring-clojure/ring", + "maintainers": [], + "enabled": true, + "tests": [ + "baseline", + "pipelined", + "limited-conn", + "json", + "json-comp", + "upload", + "static", + "async-db" + ] +} diff --git a/frameworks/ring/src/httparena/ring/core.clj b/frameworks/ring/src/httparena/ring/core.clj new file mode 100644 index 000000000..da650c609 --- /dev/null +++ b/frameworks/ring/src/httparena/ring/core.clj @@ -0,0 +1,256 @@ +(ns httparena.ring.core + (:gen-class) + (:require + [clojure.data.json :as json] + [clojure.java.io :as io] + [clojure.string :as str] + [hikari-cp.core :as hikari] + [next.jdbc :as jdbc] + [next.jdbc.result-set :as rs] + [ring.adapter.jetty :as jetty] + [ring.middleware.params :as params] + [ring.util.response :as response]) + (:import + [java.io InputStream OutputStream] + [java.net URI] + [org.eclipse.jetty.server Server] + [org.eclipse.jetty.server.handler.gzip GzipHandler] + [org.eclipse.jetty.util VirtualThreads] + [org.eclipse.jetty.util.thread QueuedThreadPool] + [org.postgresql.util PGobject])) + +(set! *warn-on-reflection* true) + +(def json-content-type "application/json") +(def static-root "/data/static") +(def async-db-query + "SELECT id, name, category, price, quantity, active, tags, rating_score, rating_count + FROM items + WHERE price BETWEEN ? AND ? + LIMIT ?") +(def static-content-types + {"css" "text/css" + "js" "application/javascript" + "html" "text/html" + "woff2" "font/woff2" + "svg" "image/svg+xml" + "webp" "image/webp" + "json" "application/json"}) + +(defn parse-long-safe [value] + (or (some-> value str str/trim not-empty parse-long) + 0)) + +(defn parse-int [value default] + (try + (if (some? value) + (Integer/parseInt (str value)) + default) + (catch NumberFormatException _ + default))) + +(defn database-max-conn [] + (max 1 (parse-int (System/getenv "DATABASE_MAX_CONN") 256))) + +(defn database-url->hikari-options [database-url] + (let [uri (URI. database-url) + scheme (.getScheme uri) + host (.getHost uri) + port (.getPort uri) + path (.getRawPath uri) + query-string (.getRawQuery uri) + [username password] (str/split (or (.getUserInfo uri) "") #":" 2)] + (when-not (and (#{"postgres" "postgresql"} scheme) + (seq host) + (seq path) + (seq username) + (some? password)) + (throw (ex-info "invalid DATABASE_URL" {:scheme scheme}))) + {:jdbc-url (str "jdbc:postgresql://" host + (when-not (= -1 port) (str ":" port)) + path + (when query-string (str "?" query-string))) + :username username + :password password + :maximum-pool-size (database-max-conn)})) + +(defn load-dataset [path] + (when (.exists (io/file path)) + (json/read-str (slurp path) :key-fn keyword))) + +(defonce dataset + (delay (load-dataset "/data/dataset.json"))) + +(defonce datasource (atom nil)) + +(defn compute-json-items [items multiplier] + (mapv (fn [{:keys [price quantity] :as item}] + (assoc item :total (* price quantity multiplier))) + items)) + +(defn request-sum [request] + (let [params (:params request) + a (parse-long-safe (get params "a")) + b (parse-long-safe (get params "b")) + body (if (= :post (:request-method request)) + (parse-long-safe (slurp (:body request))) + 0)] + (+ a b body))) + +(defn count-stream-bytes [^InputStream in] + (with-open [^InputStream stream in] + (.transferTo stream (OutputStream/nullOutputStream)))) + +(defn text-response [status body] + {:status status + :headers {"content-type" "text/plain"} + :body body}) + +(defn json-response [status body] + {:status status + :headers {"Content-Type" json-content-type} + :body (json/write-str body)}) + +(defn empty-response [] + (json-response 200 {:items [] + :count 0})) + +(defn tags->vector [tags] + (cond + (instance? PGobject tags) (json/read-str (.getValue ^PGobject tags)) + (string? tags) (json/read-str tags) + (sequential? tags) (vec tags) + :else (throw (ex-info "unexpected tags value" {:type (type tags)})))) + +(defn rows->items [rows] + (mapv (fn [{:keys [id name category price quantity active tags rating_score rating_count]}] + {:id id + :name name + :category category + :price price + :quantity quantity + :active active + :tags (tags->vector tags) + :rating {:score rating_score + :count rating_count}}) + rows)) + +(defn datasource! [] + (or @datasource + (locking datasource + (or @datasource + (try + (let [database (hikari/make-datasource + (database-url->hikari-options + (System/getenv "DATABASE_URL")))] + (reset! datasource database)) + (catch Exception _ + nil)))))) + +(defn close-datasource! [] + (when-let [database @datasource] + (hikari/close-datasource database) + (reset! datasource nil))) + +(defn async-db-handler [request] + (let [params (:params request) + min-price (parse-int (get params "min") 10) + max-price (parse-int (get params "max") 50) + limit (-> (parse-int (get params "limit") 50) + (max 1) + (min 50))] + (if-let [database (datasource!)] + (try + (let [rows (jdbc/execute! database + [async-db-query min-price max-price limit] + {:builder-fn rs/as-unqualified-lower-maps}) + items (rows->items rows)] + (json-response 200 {:items items + :count (count items)})) + (catch Exception _ + (empty-response))) + (empty-response)))) + +(defn static-filename [uri] + (when (str/starts-with? uri "/static/") + (let [filename (subs uri 8)] + (when (and (not (str/blank? filename)) + (not (str/includes? filename "/")) + (not (str/includes? filename ".."))) + filename)))) + +(defn static-content-type [filename] + (let [extension (some-> filename (str/split #"\.") last str/lower-case)] + (get static-content-types extension "application/octet-stream"))) + +(defn static-response [uri] + (when-let [filename (static-filename uri)] + (if-let [file-response (response/file-response filename {:root static-root + :index-files? false})] + (response/content-type file-response (static-content-type filename)) + (text-response 404 "not found")))) + +(defn json-endpoint-response [request item-count] + (if-let [source @dataset] + (let [items (take (min 50 (parse-long-safe item-count)) source) + multiplier (parse-long-safe (get (:params request) "m" 1))] + (json-response 200 {:items (compute-json-items items multiplier) + :count (count items)})) + (text-response 500 "dataset.json not available"))) + +(defn method-not-allowed-response [] + (text-response 405 "method not allowed")) + +(defn app [request] + (let [uri (:uri request) + method (:request-method request)] + (cond + (str/starts-with? uri "/static/") + (if (= :get method) + (or (static-response uri) + (text-response 404 "not found")) + (method-not-allowed-response)) + + :else + (if-let [[_ item-count] (re-matches #"/json/(\d+)" uri)] + (if (= :get method) + (json-endpoint-response request item-count) + (method-not-allowed-response)) + (case uri + "/baseline11" (case method + (:get :post) (text-response 200 (str (request-sum request))) + (method-not-allowed-response)) + "/async-db" (if (= :get method) + (async-db-handler request) + (method-not-allowed-response)) + "/upload" (if (= :post method) + (text-response 200 (str (count-stream-bytes (:body request)))) + (method-not-allowed-response)) + "/pipeline" (if (= :get method) + (text-response 200 "ok") + (method-not-allowed-response)) + (text-response 404 "not found")))))) + +(def handler + (params/wrap-params app)) + +(defn virtual-thread-pool [] + (doto (QueuedThreadPool.) + (.setVirtualThreadsExecutor (VirtualThreads/getDefaultVirtualThreadsExecutor)))) + +(defn -main [& _args] + (when-not (vector? @dataset) + (throw (ex-info "dataset.json must contain a JSON array" + {:path "/data/dataset.json"}))) + (.addShutdownHook (Runtime/getRuntime) (Thread. ^Runnable close-datasource!)) + (jetty/run-jetty handler + {:host "0.0.0.0" + :configurator (fn [^Server server] + (let [gzip-handler (doto (GzipHandler.) + (.setExcludedPaths + (into-array String ["/static/*"])) + (.setHandler (.getHandler server)))] + (.setHandler server gzip-handler))) + :join? true + :port 8080 + :thread-pool (virtual-thread-pool)})) diff --git a/frameworks/ring/test/httparena/ring/core_test.clj b/frameworks/ring/test/httparena/ring/core_test.clj new file mode 100644 index 000000000..858ef8b32 --- /dev/null +++ b/frameworks/ring/test/httparena/ring/core_test.clj @@ -0,0 +1,128 @@ +(ns httparena.ring.core-test + (:require + [clojure.data.json :as json] + [clojure.test :as test :refer [are deftest is]] + [hikari-cp.core :as hikari] + [httparena.ring.core :as core] + [next.jdbc :as jdbc])) + +(def dataset + [{:id 1 + :name "Alpha" + :category "tools" + :price 2 + :quantity 4 + :active true + :tags ["new"] + :rating {:score 5 :count 6}} + {:id 2 + :name "Beta" + :category "tools" + :price 3 + :quantity 5 + :active false + :tags ["sale"] + :rating {:score 7 :count 8}}]) + +(deftest json-route-computes-request-specific-totals + (with-redefs [core/dataset (delay dataset)] + (is (= {:items [{:id 1 + :name "Alpha" + :category "tools" + :price 2 + :quantity 4 + :active true + :tags ["new"] + :rating {:score 5 :count 6} + :total 24}] + :count 1} + (json/read-str (:body (core/app {:request-method :get + :uri "/json/1" + :params {"m" "3"}})) + :key-fn keyword))))) + +(deftest declared-routes-reject-unsupported-methods + (are [request] (= 405 (:status (core/app request))) + {:request-method :post :uri "/json/1" :params {}} + {:request-method :post :uri "/async-db" :params {}} + {:request-method :get :uri "/upload" :params {}} + {:request-method :post :uri "/pipeline" :params {}} + {:request-method :post :uri "/static/app.js" :params {}})) + +(deftest converts-postgres-uri-for-hikari + (is (= {:jdbc-url "jdbc:postgresql://localhost:5432/benchmark?ApplicationName=proof" + :username "bench name" + :password "p:a@ss" + :maximum-pool-size 256} + (core/database-url->hikari-options + "postgres://bench%20name:p%3Aa%40ss@localhost:5432/benchmark?ApplicationName=proof")))) + +(deftest async-db-falls-back-through-the-ring-handler + (with-redefs [core/datasource! (constantly nil)] + (is (= {:status 200 + :headers {"Content-Type" "application/json"} + :body {"items" [] "count" 0}} + (update (core/handler {:uri "/async-db" + :request-method :get + :query-string "min=10&max=50&limit=50"}) + :body + json/read-str))))) + +(deftest datasource-creation-retries-after-failure + (let [attempts (atom 0) + database ::database + original @core/datasource] + (try + (reset! core/datasource nil) + (with-redefs [core/database-url->hikari-options (constantly {}) + hikari/make-datasource (fn [_] + (if (= 1 (swap! attempts inc)) + (throw (ex-info "unavailable" {})) + database))] + (is (= [nil database database] + [(core/datasource!) + (core/datasource!) + (core/datasource!)]))) + (finally + (reset! core/datasource original))))) + +(deftest database-query-failure-falls-back-through-the-ring-handler + (with-redefs [core/datasource! (constantly ::database) + jdbc/execute! (fn [& _] + (throw (ex-info "query failed" {})))] + (is (= {"items" [] "count" 0} + (json/read-str (:body (core/handler {:uri "/async-db" + :request-method :get + :query-string "min=10&max=50&limit=50"}))))))) + +(deftest database-mapping-failure-falls-back-through-the-ring-handler + (with-redefs [core/datasource! (constantly ::database) + jdbc/execute! (constantly [{:id 1 :tags nil}])] + (is (= {"items" [] "count" 0} + (json/read-str (:body (core/handler {:uri "/async-db" + :request-method :get + :query-string "min=10&max=50&limit=50"}))))))) + +(deftest maps-database-rows-with-nested-rating + (is (= [{:id 1 + :name "widget" + :category "tools" + :price 10 + :quantity 2 + :active true + :tags ["sale"] + :rating {:score 4 :count 9}}] + (core/rows->items [{:id 1 + :name "widget" + :category "tools" + :price 10 + :quantity 2 + :active true + :tags "[\"sale\"]" + :rating_score 4 + :rating_count 9}])))) + +(defn -main [& _args] + (let [results (test/run-tests 'httparena.ring.core-test)] + (when (pos? (+ (:fail results) (:error results))) + (throw (ex-info "tests failed" results))))) diff --git a/site/data/frameworks.json b/site/data/frameworks.json index 82f629b24..79b0a35d5 100644 --- a/site/data/frameworks.json +++ b/site/data/frameworks.json @@ -669,6 +669,14 @@ "engine": "robaho-httpserver", "mode": "standard" }, + "ring": { + "dir": "ring", + "description": "Ring application using the official Ring Jetty adapter and standard Ring middleware.", + "repo": "https://github.com/ring-clojure/ring", + "type": "emerging", + "engine": "Jetty", + "mode": "standard" + }, "ring-jetty9-adapter": { "dir": "ring-jetty9-adapter", "description": "Ring application using the Sunng ring-jetty9-adapter on modern Jetty.", diff --git a/site/data/results/ring.json b/site/data/results/ring.json new file mode 100644 index 000000000..210ce1038 --- /dev/null +++ b/site/data/results/ring.json @@ -0,0 +1,320 @@ +{ + "framework": "ring", + "results": { + "async-db-1024": { + "framework": "ring", + "language": "Clojure", + "rps": 57646, + "avg_latency": "16.20ms", + "p99_latency": "90.20ms", + "cpu": "6488.3%", + "memory": "4.9GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "222.58MB/s", + "input_bw": "3.85MB/s", + "reconnects": 22696, + "status_2xx": 576463, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 882349, + "avg_latency": "1.82ms", + "p99_latency": "7.40ms", + "cpu": "6237.2%", + "memory": "8.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "125.34MB/s", + "input_bw": "68.16MB/s", + "reconnects": 0, + "status_2xx": 4411745, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-512": { + "framework": "ring", + "language": "Clojure", + "rps": 882969, + "avg_latency": "523us", + "p99_latency": "3.75ms", + "cpu": "6440.0%", + "memory": "5.3GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "125.43MB/s", + "input_bw": "68.21MB/s", + "reconnects": 0, + "status_2xx": 4414849, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 83732, + "avg_latency": "21.41ms", + "p99_latency": "103.70ms", + "cpu": "6331.4%", + "memory": "4.7GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "293.91MB/s", + "input_bw": "3.99MB/s", + "reconnects": 15588, + "status_2xx": 418661, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-16384": { + "framework": "ring", + "language": "Clojure", + "rps": 47179, + "avg_latency": "71.62ms", + "p99_latency": "453.10ms", + "cpu": "6221.1%", + "memory": "6.9GiB", + "connections": 16384, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "67.95MB/s", + "input_bw": "3.51MB/s", + "reconnects": 7178, + "status_2xx": 235896, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 45606, + "avg_latency": "33.20ms", + "p99_latency": "159.20ms", + "cpu": "6428.2%", + "memory": "5.7GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "65.72MB/s", + "input_bw": "3.39MB/s", + "reconnects": 8089, + "status_2xx": 228033, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-512": { + "framework": "ring", + "language": "Clojure", + "rps": 45410, + "avg_latency": "10.14ms", + "p99_latency": "50.80ms", + "cpu": "6405.4%", + "memory": "3.4GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "65.46MB/s", + "input_bw": "3.38MB/s", + "reconnects": 9009, + "status_2xx": 227051, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "limited-conn-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 548206, + "avg_latency": "812us", + "p99_latency": "4.00ms", + "cpu": "5533.0%", + "memory": "6.3GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "77.88MB/s", + "input_bw": "42.35MB/s", + "reconnects": 274089, + "status_2xx": 2741030, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "limited-conn-512": { + "framework": "ring", + "language": "Clojure", + "rps": 519223, + "avg_latency": "377us", + "p99_latency": "3.01ms", + "cpu": "5422.3%", + "memory": "4.8GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "73.75MB/s", + "input_bw": "40.11MB/s", + "reconnects": 259600, + "status_2xx": 2596119, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "pipelined-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 1753370, + "avg_latency": "17.71ms", + "p99_latency": "64.80ms", + "cpu": "6404.7%", + "memory": "6.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "249.08MB/s", + "reconnects": 0, + "status_2xx": 8766851, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "pipelined-512": { + "framework": "ring", + "language": "Clojure", + "rps": 1724954, + "avg_latency": "4.38ms", + "p99_latency": "21.30ms", + "cpu": "6415.9%", + "memory": "3.5GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "245.02MB/s", + "reconnects": 0, + "status_2xx": 8624773, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-1024": { + "framework": "ring", + "language": "Clojure", + "rps": 187672, + "avg_latency": "45.03ms", + "p99_latency": "1.04s", + "cpu": "6530.8%", + "memory": "1.9GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "11.14GB", + "reconnects": 0, + "status_2xx": 957136, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-4096": { + "framework": "ring", + "language": "Clojure", + "rps": 186734, + "avg_latency": "133.78ms", + "p99_latency": "1.98s", + "cpu": "6430.8%", + "memory": "3.0GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "11.09GB", + "reconnects": 0, + "status_2xx": 952212, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-6800": { + "framework": "ring", + "language": "Clojure", + "rps": 184285, + "avg_latency": "113.84ms", + "p99_latency": "2.00s", + "cpu": "6443.7%", + "memory": "3.7GiB", + "connections": 6800, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "10.94GB", + "reconnects": 0, + "status_2xx": 939774, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "upload-256": { + "framework": "ring", + "language": "Clojure", + "rps": 2812, + "avg_latency": "83.63ms", + "p99_latency": "306.10ms", + "cpu": "4430.7%", + "memory": "1.1GiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "423.48KB/s", + "input_bw": "22.30GB/s", + "reconnects": 2783, + "status_2xx": 14146, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "upload-32": { + "framework": "ring", + "language": "Clojure", + "rps": 2606, + "avg_latency": "12.25ms", + "p99_latency": "34.30ms", + "cpu": "2491.3%", + "memory": "1.0GiB", + "connections": 32, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "392.34KB/s", + "input_bw": "20.67GB/s", + "reconnects": 2607, + "status_2xx": 13031, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + } + } +} diff --git a/site/static/logs/async-db/1024/ring.log b/site/static/logs/async-db/1024/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/async-db/1024/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/baseline/4096/ring.log b/site/static/logs/baseline/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/baseline/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/baseline/512/ring.log b/site/static/logs/baseline/512/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/baseline/512/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/json-comp/16384/ring.log b/site/static/logs/json-comp/16384/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/json-comp/16384/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/json-comp/4096/ring.log b/site/static/logs/json-comp/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/json-comp/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/json-comp/512/ring.log b/site/static/logs/json-comp/512/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/json-comp/512/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/json/4096/ring.log b/site/static/logs/json/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/json/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/limited-conn/4096/ring.log b/site/static/logs/limited-conn/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/limited-conn/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/limited-conn/512/ring.log b/site/static/logs/limited-conn/512/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/limited-conn/512/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/pipelined/4096/ring.log b/site/static/logs/pipelined/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/pipelined/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/pipelined/512/ring.log b/site/static/logs/pipelined/512/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/pipelined/512/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/static/1024/ring.log b/site/static/logs/static/1024/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/static/1024/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/static/4096/ring.log b/site/static/logs/static/4096/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/static/4096/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/static/6800/ring.log b/site/static/logs/static/6800/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/static/6800/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/upload/256/ring.log b/site/static/logs/upload/256/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/upload/256/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. diff --git a/site/static/logs/upload/32/ring.log b/site/static/logs/upload/32/ring.log new file mode 100644 index 000000000..ca183d220 --- /dev/null +++ b/site/static/logs/upload/32/ring.log @@ -0,0 +1,3 @@ +SLF4J(W): No SLF4J providers were found. +SLF4J(W): Defaulting to no-operation (NOP) logger implementation +SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.