summaryrefslogtreecommitdiffstats
path: root/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java
blob: b357a3e671838940040ec137a88ccb5012138ee1 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.search.test;

import com.yahoo.config.model.api.ModelContext;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.deploy.TestProperties;
import com.yahoo.config.model.test.MockRoot;
import com.yahoo.searchlib.TranslogserverConfig;
import com.yahoo.vespa.config.search.core.ProtonConfig;
import com.yahoo.vespa.defaults.Defaults;
import com.yahoo.vespa.model.Host;
import com.yahoo.vespa.model.HostResource;
import com.yahoo.vespa.model.content.Redundancy;
import com.yahoo.vespa.model.search.NodeSpec;
import com.yahoo.vespa.model.search.SearchNode;
import com.yahoo.vespa.model.search.TransactionLogServer;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;

/**
 * Unit tests for search node.
 *
 * @author geirst
 */
public class SearchNodeTest {

    private void assertBaseDir(String expected, SearchNode node) {
        ProtonConfig.Builder builder = new ProtonConfig.Builder();
        node.getConfig(builder);
        ProtonConfig cfg = new ProtonConfig(builder);
        assertEquals(expected, cfg.basedir());
    }

    private void prepare(MockRoot root, SearchNode node, Boolean useFsync) {
        Host host = new Host(root, "mockhost");
        TransactionLogServer tls = new TransactionLogServer(root, "mycluster", useFsync);
        tls.setHostResource(new HostResource(host));
        tls.setBasePort(100);
        tls.initService(root.getDeployState());
        node.setTls(tls);
        node.setHostResource(new HostResource(host));
        node.setBasePort(200);
        node.initService(root.getDeployState());
        root.freezeModelTopology();
    }

    private static SearchNode createSearchNode(MockRoot root, String name, int distributionKey, NodeSpec nodeSpec,
                                               boolean flushOnShutDown, boolean isHosted, ModelContext.FeatureFlags featureFlags) {
        return SearchNode.create(root, name, distributionKey, nodeSpec, "mycluster", null, flushOnShutDown,
                Optional.empty(), Optional.empty(), isHosted, 0.0, new Redundancy(1,1,1,1,1), featureFlags);
    }

    private static SearchNode createSearchNode(MockRoot root) {
        return createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), true, true, new TestProperties());
    }

    @Test
    void requireThatSyncIsHonoured() {
        assertTrue(getTlsConfig(new TestProperties(), null).usefsync());
        assertTrue(getTlsConfig(new TestProperties(), true).usefsync());
        assertFalse(getTlsConfig(new TestProperties(), false).usefsync());
    }

    @Test
    void requireThatBasedirIsCorrectForElasticMode() {
        MockRoot root = new MockRoot("");
        SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false, root.getDeployState().isHosted(), new TestProperties());
        prepare(root, node, true);
        assertBaseDir(Defaults.getDefaults().underVespaHome("var/db/vespa/search/cluster.mycluster/n3"), node);
    }

    @Test
    void requireThatPreShutdownCommandIsEmptyWhenNotActivated() {
        MockRoot root = new MockRoot("");
        SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false, root.getDeployState().isHosted(), new TestProperties());
        node.setHostResource(new HostResource(new Host(node, "mynbode")));
        node.initService(root.getDeployState());
        assertFalse(node.getPreShutdownCommand().isPresent());
    }

    @Test
    void requireThatPreShutdownCommandUsesPrepareRestartWhenActivated() {
        MockRoot root = new MockRoot("");
        SearchNode node = createSearchNode(root, "mynode2", 4, new NodeSpec(7, 5), true, root.getDeployState().isHosted(), new TestProperties());
        node.setHostResource(new HostResource(new Host(node, "mynbode2")));
        node.initService(root.getDeployState());
        assertTrue(node.getPreShutdownCommand().isPresent());
        assertTrue(node.getPreShutdownCommand().get().contains("vespa-proton-cmd " + node.getRpcPort() + " prepareRestart"));
    }

    private void verifyCodePlacement(boolean hugePages) {
        MockRoot root = new MockRoot("");
        SearchNode node = createSearchNode(root, "mynode2", 4, new NodeSpec(7, 5), true, false, new TestProperties().loadCodeAsHugePages(hugePages));
        node.setHostResource(new HostResource(new Host(node, "mynbode2")));
        node.initService(root.getDeployState());
        assertEquals(hugePages, node.getEnvVars().get("VESPA_LOAD_CODE_AS_HUGEPAGES") != null);
    }

    @Test
    void requireThatCodePageTypeCanBeControlled() {
        verifyCodePlacement(true);
        verifyCodePlacement(false);
    }

    private void verifySharedStringRepoReclaim(boolean sharedStringRepoNoReclaim) {
        MockRoot root = new MockRoot("");
        SearchNode node = createSearchNode(root, "mynode2", 4, new NodeSpec(7, 5), true, false, new TestProperties().sharedStringRepoNoReclaim(sharedStringRepoNoReclaim));
        node.setHostResource(new HostResource(new Host(node, "mynbode2")));
        node.initService(root.getDeployState());
        assertEquals(sharedStringRepoNoReclaim, node.getEnvVars().get("VESPA_SHARED_STRING_REPO_NO_RECLAIM") != null);
    }

    @Test
    void requireThatSharedRepoReclaimCanBeControlled() {
        verifySharedStringRepoReclaim(true);
        verifySharedStringRepoReclaim(false);
    }

    private MockRoot createRoot(ModelContext.Properties properties) {
        return new MockRoot("", new DeployState.Builder().properties(properties).build());
    }

    private TranslogserverConfig getTlsConfig(ModelContext.Properties properties, Boolean useFsync) {
        MockRoot root = createRoot(properties);
        SearchNode node = createSearchNode(root);
        prepare(root, node, useFsync);
        TranslogserverConfig.Builder tlsBuilder = new TranslogserverConfig.Builder();
        node.getConfig(tlsBuilder);
        return tlsBuilder.build();
    }

}