summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-02-16 15:17:09 +0200
committerLars Wirzenius <liw@liw.fi>2019-02-16 16:07:57 +0200
commitb49c7cb1c42f21ca9a1eeeeb9621e05d87ba5887 (patch)
treef8ca3fb3987ed1ec41354c8e6b83bc9f94aaade6
parent4319710b976d951095e4f02431e2bea7c1bce58d (diff)
downloadmuck-poc-b49c7cb1c42f21ca9a1eeeeb9621e05d87ba5887.tar.gz
Add: benchmark-log to benchmark Ick log file storage
-rwxr-xr-xbenchmark-log50
-rwxr-xr-xdummy-logger121
2 files changed, 171 insertions, 0 deletions
diff --git a/benchmark-log b/benchmark-log
new file mode 100755
index 0000000..5443b35
--- /dev/null
+++ b/benchmark-log
@@ -0,0 +1,50 @@
+#!/bin/sh
+# Copyright (C) 2019 Lars Wirzenius
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+set -eu
+
+N="$1"
+
+rm -rf tmp
+mkdir tmp
+mkdir tmp/store
+
+token="$(./create-token < test-key)"
+
+cat > tmp/conf <<EOF
+{
+ "log": "tmp/log",
+ "pid": "tmp/pid",
+ "store": "tmp/store",
+ "signing-key-filename": "test-key.pub"
+}
+EOF
+
+cat > tmp/data <<EOF
+{
+ "foo": "bar"
+}
+EOF
+
+stop() {
+ kill "$(cat tmp/pid)"
+}
+trap stop EXIT
+
+/usr/sbin/daemonize -o tmp.out -e tmp.err -c . "$(pwd)/muck_poc" tmp/conf
+sleep 2
+
+./dummy-logger http://127.0.0.1:12765 "$token" "$N"
+
diff --git a/dummy-logger b/dummy-logger
new file mode 100755
index 0000000..10d08f7
--- /dev/null
+++ b/dummy-logger
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+# Copyright (C) 2019 Lars Wirzenius
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import copy
+import json
+import logging
+import os
+import sys
+import time
+
+import requests
+
+
+def generate_snippets(n):
+ for i in range(n):
+ yield 'log line {}\n'.format(i)
+
+def full_log(n):
+ return ''.join(generate_snippets(n))
+
+def store_snippet(url, token, i, snippet):
+ url = '{}/res'.format(url)
+ obj = {
+ '_type': 'snippet',
+ 'seq': i,
+ 'text': snippet,
+ }
+ headers = {
+ 'Authorization': 'Bearer {}'.format(token),
+ 'Content-Type': 'application/json',
+ }
+ r = requests.post(url, headers=headers, data=json.dumps(obj))
+ assert r.ok
+
+
+def get_snippet(url, token, rid):
+ url = '{}/res'.format(url)
+ headers = {
+ 'Authorization': 'Bearer {}'.format(token),
+ 'Content-Type': 'application/json',
+ 'Muck-Id': rid,
+ }
+ r = requests.get(url, headers=headers)
+ assert r.ok
+ return r.json()
+
+
+def get_snippet_ids(url, token):
+ search = '{}/search'.format(url)
+ body = {
+ 'cond': [
+ {
+ "where": "data",
+ "field": "_type",
+ "pattern": "snippet",
+ "op": "=="
+ },
+ ],
+ }
+ headers = {
+ 'Authorization': 'Bearer {}'.format(token),
+ 'Content-Type': 'application/json',
+ }
+ r = requests.get(search, headers=headers, data=json.dumps(body))
+ assert r.ok
+
+ obj = r.json()
+ return obj['resources']
+
+def get_full_log(url, token, ids):
+ snippets = [get_snippet(url, token, rid) for rid in ids]
+ snippets.sort(key=lambda o: o['seq'])
+ return ''.join(o['text'] for o in snippets)
+
+def report(msg, started):
+ now = time.time()
+ duration = now - started
+ print(msg)
+ return duration
+
+url = sys.argv[1]
+token = sys.argv[2]
+N = int(sys.argv[3])
+
+started = time.time()
+_ = report('creating snippets', started)
+for i, snippet in enumerate(generate_snippets(N)):
+ store_snippet(url, token, i, snippet)
+
+creation_secs = report('getting snippets', started)
+ids = get_snippet_ids(url, token)
+
+get_snippets_secs = report('getting full log', started)
+
+log = get_full_log(url, token, ids)
+get_log_secs = report('checking', started)
+
+expected = full_log(N)
+if expected != log:
+ print('ERROR: actual log differs from expected')
+ print('actual:')
+ print(repr(log))
+ sys.exit(1)
+
+print('OK')
+print('%.0f' % creation_secs, 'creation time')
+print('%.0f' % get_snippets_secs, 'list snippets')
+print('%.0f' % get_log_secs, 'assemble log')