Ticket #28424: ChurnSim.java

File ChurnSim.java, 1.9 KB (added by akwizgran, 3 months ago)
Line 
1import java.util.ArrayList;
2import java.util.List;
3import java.util.Random;
4
5import static java.util.Collections.sort;
6
7public class ChurnSim {
8
9        // Simulation parameters
10        private static final int NUM_RUNS = 10 * 1000;
11        private static final double REPLACEMENT_PROBABILITY = 0.01;
12
13        // System parameters
14        private static final int NUM_REPLICAS = 2;
15        private static final int NUM_DIRS = 3000;
16        private static final int SPREAD_STORE = 4;
17        private static final int SPREAD_FETCH = 3;
18
19        private final Random random = new Random();
20        private final List<Dir> dirs = new ArrayList<>();
21        private final List<Dir> stored = new ArrayList<>();
22
23        private ChurnSim() {
24                for (int i = 0; i < NUM_DIRS; i++) {
25                        dirs.add(new Dir(random.nextDouble()));
26                }
27                sort(dirs);
28                for (int i = 0; i < SPREAD_STORE; i++) {
29                        stored.add(dirs.get(i));
30                }
31        }
32
33        private void churn() {
34                for (int i = 0; i < NUM_DIRS; i++) {
35                        if (random.nextDouble() < REPLACEMENT_PROBABILITY) {
36                                dirs.set(i, new Dir(random.nextDouble()));
37                        }
38                }
39                sort(dirs);
40        }
41
42        private boolean canFail() {
43                for (int i = 0; i < SPREAD_FETCH; i++) {
44                        if (!stored.contains(dirs.get(i))) return true;
45                }
46                return false;
47        }
48
49        public static void main(String[] args) {
50                for (int run = 0; run < NUM_RUNS; run++) {
51                        ChurnSim[] sims = new ChurnSim[NUM_REPLICAS];
52                        for (int i = 0; i < NUM_REPLICAS; i++) {
53                                sims[i] = new ChurnSim();
54                                if (sims[i].canFail()) throw new AssertionError();
55                        }
56                        int round = 1;
57                        while (true) {
58                                boolean allCanFail = true;
59                                for (int i = 0; i < NUM_REPLICAS; i++) {
60                                        sims[i].churn();
61                                        if (!sims[i].canFail()) allCanFail = false;
62                                }
63                                if (allCanFail) {
64                                        System.out.println(round);
65                                        break;
66                                }
67                                round++;
68                        }
69                }
70        }
71
72        private static class Dir implements Comparable<Dir> {
73
74                private final double position;
75
76                private Dir(double position) {
77                        this.position = position;
78                }
79
80                @Override
81                public int compareTo(Dir d) {
82                        return Double.compare(position, d.position);
83                }
84        }
85}