From b49c7cb1c42f21ca9a1eeeeb9621e05d87ba5887 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 16 Feb 2019 15:17:09 +0200 Subject: Add: benchmark-log to benchmark Ick log file storage --- benchmark-log | 50 ++++++++++++++++++++++++ dummy-logger | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100755 benchmark-log create mode 100755 dummy-logger 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 . + +set -eu + +N="$1" + +rm -rf tmp +mkdir tmp +mkdir tmp/store + +token="$(./create-token < test-key)" + +cat > tmp/conf < tmp/data <. + + +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') -- cgit v1.2.1