#!/usr/bin/env python3 '''Stress test for multiple incoming DDNS and outgoing IXFRs''' import random, socket, os from dnstest.utils import * from dnstest.test import Test UPDATE_COUNT = 40 UPDATE_SIZE = 450 chars="qwertyuiopasdfghjklzxcvbnm123456789" def randstr(): return ''.join(random.choice(chars) for _ in range(63)) def flood(server, zone): rr = None updates = [] for i in range(UPDATE_COUNT): update = server.update(zone) for j in range(UPDATE_SIZE): rr = [randstr() + "." + zone[0].name, 3600, "TXT", randstr()] update.add(*rr) update.send() return rr random.seed() t = Test() zone = t.zone_rnd(1, dnssec=False, records=4) master = t.server("knot") # set journal limit for the master master.ixfr_fslimit = "800k" slaves = [t.server("knot") for _ in range(2)] # set journal limit for one of the slaves slaves[0].ixfr_fslimit = "500k" for s in slaves: t.link(zone, master, s, ddns=True, ixfr=True) t.start() for s in slaves + [master]: s.zone_wait(zone) # flood server with updates last_rr = flood(master, zone) # wait for update and ixfr processing t.sleep(10) # restart servers and dig for last change for s in slaves + [master]: s.stop() s.start() s.zone_wait(zone) resp = s.dig(last_rr[0], "TXT") resp.check(rdata = last_rr[3]) # check journal sizes st = os.stat(master.dir + "/" + zone[0].name.lower() + "diff.db") if st.st_size > 1050 * 1024: detail_log("Journal too big, should be max 800k, is: " + str(st.st_size // 1024) + "k") set_err("JOURNAL SIZE OVERFLOW") st = os.stat(slaves[0].dir + "/" + zone[0].name.lower() + "diff.db") if st.st_size > 650 * 1024: detail_log("Journal too big, should be max 500k, is: " + str(st.st_size // 1024) + "k") set_err("JOURNAL SIZE OVERFLOW") t.stop()