Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 May 2019 23:52:58 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Peter Eriksson <pen@lysator.liu.se>
Cc:        "freebsd-fs@freebsd.org" <freebsd-fs@FreeBSD.org>
Subject:   Re: test hash functions for fsid
Message-ID:  <YQBPR0101MB2260AA6B2642A5DDE49D4A35DD320@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>
In-Reply-To: <D27D3F7A-22B3-4EDA-AD61-1B95366D1A2D@lysator.liu.se>
References:  <YQBPR0101MB2260D82BAE348FB82902508CDD320@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>, <D27D3F7A-22B3-4EDA-AD61-1B95366D1A2D@lysator.liu.se>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Peter wrote:
>Here’s the output from a couple of our servers (filur00 with around 24289 zfs >filesystems, balur01 with about 72350 zfs filesystems, filur04 about 7500 zfs >filesystems):
>
>
>Lpeter86@filur00:~ % ./testhash
>H1: max=24290 min=0
>H2: max=24290 min=0
>H3: max=24290 min=0
>H4: max=24290 min=0
>
>Lpeter86@balur01:~ % /tmp/testhash
>H1: max=73343 min=0
>H2: max=73343 min=0
>H3: max=73343 min=0
>H4: max=73343 min=0
>
>Lpeter86@filur04:~ % /tmp/testhash
>H1: max=7560 min=0
>H2: max=7560 min=0
>H3: max=7560 min=0
>H4: max=7560 min=0
>
I'll admit when I first looked at this, I was baffled;-)
Turns out the f_fsid field is just zeros when getmntinfo() is run by non-root.
Please do this again as "root". I have attached a slightly modified version
with an additional trivial hash and it calculates variance.

Thanks for doing this, rick


[-- Attachment #2 --]
#include <stdio.h>
#include <err.h>
#include <sys/param.h>
#include <sys/fnv_hash.h>
#include <sys/hash.h>
#include <sys/mount.h>

int
main(int argc, char *argv[])
{
	int h1[256], h2[256], h3[256], h4[256], h5[256], i, max, min, num;
	struct statfs *mntbufp;
	float ave, vari, totvari;

	for (i = 0; i < 256; i++) {
		h1[i] = 0;
		h2[i] = 0;
		h3[i] = 0;
		h4[i] = 0;
		h5[i] = 0;
	}
	num = getmntinfo(&mntbufp, MNT_NOWAIT);
	if (num == 0)
		errx(1, "Must be run as root");
	for (i = 0; i < num; i++) {
		h1[fnv_32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), 0) % 256]++;
		h2[fnv_32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), FNV1_32_INIT) % 256]++;
		h3[hash32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), 0) % 256]++;
		h4[hash32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), HASHINIT) % 256]++;
		h5[mntbufp[i].f_fsid.val[0] % 256]++;
	}
	ave = (float)num / 256.0;
	min = 10000000;
	max = 0;
	totvari = 0.0;
	for (i = 0; i < 256; i++) {
		if (h1[i] > max)
			max = h1[i];
		if (h1[i] < min)
			min = h1[i];
		if ((float)h1[i] > ave)
			vari = (float)h1[i] - ave;
		else
			vari = ave - (float)h1[i];
		totvari += vari;
	}
	printf("H1: max=%d min=%d totvari=%f\n", max, min, totvari);
	min = 10000000;
	max = 0;
	totvari = 0.0;
	for (i = 0; i < 256; i++) {
		if (h2[i] > max)
			max = h2[i];
		if (h2[i] < min)
			min = h2[i];
		if ((float)h2[i] > ave)
			vari = (float)h2[i] - ave;
		else
			vari = ave - (float)h2[i];
		totvari += vari;
	}
	printf("H2: max=%d min=%d totvari=%f\n", max, min, totvari);
	min = 10000000;
	max = 0;
	totvari = 0.0;
	for (i = 0; i < 256; i++) {
		if (h3[i] > max)
			max = h3[i];
		if (h3[i] < min)
			min = h3[i];
		if ((float)h3[i] > ave)
			vari = (float)h3[i] - ave;
		else
			vari = ave - (float)h3[i];
		totvari += vari;
	}
	printf("H3: max=%d min=%d totvari=%f\n", max, min, totvari);
	min = 10000000;
	max = 0;
	totvari = 0.0;
	for (i = 0; i < 256; i++) {
		if (h4[i] > max)
			max = h4[i];
		if (h4[i] < min)
			min = h4[i];
		if ((float)h4[i] > ave)
			vari = (float)h4[i] - ave;
		else
			vari = ave - (float)h4[i];
		totvari += vari;
	}
	printf("H4: max=%d min=%d totvari=%f\n", max, min, totvari);
	min = 10000000;
	max = 0;
	totvari = 0.0;
	for (i = 0; i < 256; i++) {
		if (h5[i] > max)
			max = h5[i];
		if (h5[i] < min)
			min = h5[i];
		if ((float)h5[i] > ave)
			vari = (float)h5[i] - ave;
		else
			vari = ave - (float)h5[i];
		totvari += vari;
	}
	printf("H5: max=%d min=%d totvari=%f\n", max, min, totvari);
}

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YQBPR0101MB2260AA6B2642A5DDE49D4A35DD320>