aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/vespa/model/content/DistributionBitCalculator.java
blob: 3014d27376d117528c6505314fd722eb603cc9d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.content;

import com.yahoo.vespa.model.content.cluster.ContentCluster;

public class DistributionBitCalculator {

    public static int getDistributionBits(int nodes, ContentCluster.DistributionMode mode) {
        if (mode == ContentCluster.DistributionMode.STRICT) {
            if (nodes < 5) {
                return 8; // Require few buckets in small clusters to ease testing
            } else if (nodes < 15) {
                return 16;
            } else if (nodes < 200) {
                return 21;
            } else if (nodes < 800) {
                return 25;
            } else if (nodes < 1500) {
                return 28;
            } else if (nodes < 5000) {
                return 30;
            } else {
                return 32;
            }
        } else if (mode == ContentCluster.DistributionMode.LOOSE) {
            if (nodes < 5) {
                return 8;
            } else if (nodes < 200) {
                return 16;
            } else {
                return 24;
            }
        } else if (mode == ContentCluster.DistributionMode.LEGACY) {
            if (nodes <= 2) {             // min 128 buckets/node
                return 8;
            } else if (nodes <= 6) {      // min 5462 buckets/node
                return 14;
            } else if (nodes <= 8) {      // min 9362 buckets/node
                return 16;
            } else if (nodes <= 10) {     // min 14563 buckets/node
                return 17;
            } else if (nodes <= 12) {     // min 23832 buckets/node
                return 18;
            } else if (nodes <= 20) {     // min 40329 buckets/node
                return 19;
            } else if (nodes <= 32) {     // min 49933 buckets/node
                return 20;
            } else if (nodes <= 64) {     // min 63550 buckets/node
                return 21;
            } else if (nodes <= 100) {    // min 64528 buckets/node
                return 22;
            } else if (nodes <= 256) {    // min 83056 buckets/node
                return 23;
            } else if (nodes <= 350) {    // min 65281 buckets/node
                return 24;
            } else if (nodes <= 500) {    // min 95597 buckets/node
                return 25;
            } else if (nodes <= 1024) {   // min 133950 buckets/node
                return 26;
            } else if (nodes <= 2048) {   // min 130944 buckets/node
                return 27;
            } else if (nodes <= 4096) {   // min 130008 buckets/node
                return 28;
            } else if (nodes <= 8192) {   // min 131040 buckets/node
                return 29;
            } else if (nodes <= 16384) {   // min 131056 buckets/node
                return 30;
            } else if (nodes <= 32768) {   // min 131064 buckets/node
                return 31;
            } else {                       // min 131068 buckets/node
                return 32;
            }
        } else {
            throw new IllegalArgumentException("We don't know how to handle mode " + mode);
        }
    }
}