static unsigned burst_modulate(unsigned burst, uint64_t available) { unsigned k; /* Modulates the burst rate a bit with the amount of available * disk space */ k = u64log2(available); /* 1MB */ if (k <= 20) return burst; burst = (burst * (k-16)) / 4; /* * Example: * * <= 1MB = rate * 1 * 16MB = rate * 2 * 256MB = rate * 3 * 4GB = rate * 4 * 64GB = rate * 5 * 1TB = rate * 6 */ return burst; }
static void test_u64log2(void) { assert_se(u64log2(0) == 0); assert_se(u64log2(8) == 3); assert_se(u64log2(9) == 3); assert_se(u64log2(15) == 3); assert_se(u64log2(16) == 4); assert_se(u64log2(1024*1024) == 20); assert_se(u64log2(1024*1024+5) == 20); }
static void test_u64log2(void) { log_info("/* %s */", __func__); assert_se(u64log2(0) == 0); assert_se(u64log2(8) == 3); assert_se(u64log2(9) == 3); assert_se(u64log2(15) == 3); assert_se(u64log2(16) == 4); assert_se(u64log2(1024*1024) == 20); assert_se(u64log2(1024*1024+5) == 20); }
/* * initialize the computed parameters for an index */ static ISect* initisect1(ISect *is) { u64int v; is->buckmax = (is->blocksize - IBucketSize) / IEntrySize; is->blocklog = u64log2(is->blocksize); if(is->blocksize != (1 << is->blocklog)){ seterr(ECorrupt, "illegal non-power-of-2 bucket size %d\n", is->blocksize); freeisect(is); return nil; } partblocksize(is->part, is->blocksize); is->tabbase = (PartBlank + HeadSize + is->blocksize - 1) & ~(is->blocksize - 1); if(is->tabbase >= is->blockbase){ seterr(ECorrupt, "index section config table overlaps bucket storage"); freeisect(is); return nil; } is->tabsize = is->blockbase - is->tabbase; v = is->part->size & ~(u64int)(is->blocksize - 1); if(is->blockbase + (u64int)is->blocks * is->blocksize != v){ seterr(ECorrupt, "invalid blocks in index section %s", is->name); /* ZZZ what to do? freeisect(is); return nil; */ } if(is->stop - is->start > is->blocks){ seterr(ECorrupt, "index section overflows available space"); freeisect(is); return nil; } if(is->start > is->stop){ seterr(ECorrupt, "invalid index section range"); freeisect(is); return nil; } return is; }