Skip to content

Commit c933415

Browse files
lukasz-jarocki-sonarsourcesonartech
authored andcommitted
SONAR-23111 api/system/logs now correctly return logs for data center edition
1 parent 8db63c7 commit c933415

File tree

13 files changed

+873
-79
lines changed

13 files changed

+873
-79
lines changed

server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
import org.sonar.server.issue.workflow.FunctionExecutor;
107107
import org.sonar.server.issue.workflow.IssueWorkflow;
108108
import org.sonar.server.l18n.ServerI18n;
109+
import org.sonar.server.log.DistributedServerLogging;
109110
import org.sonar.server.log.ServerLogging;
110111
import org.sonar.server.measure.index.ProjectMeasuresIndexer;
111112
import org.sonar.server.metric.IssueCountMetrics;
@@ -417,7 +418,6 @@ private static void populateLevel4(Container container, Props props) {
417418
new ReportAnalysisFailureNotificationModule(),
418419

419420
// System
420-
ServerLogging.class,
421421
CEQueueStatusImpl.class,
422422

423423
// SonarSource editions
@@ -462,10 +462,12 @@ private static void populateLevel4(Container container, Props props) {
462462

463463
// system info
464464
DbSection.class,
465+
DistributedServerLogging.class,
465466
ProcessInfoProvider.class);
466467
} else {
467468
container.add(
468469
new CeCleaningModule(),
470+
ServerLogging.class,
469471
StandaloneCeDistributedInformation.class);
470472
}
471473
}

server/sonar-process/src/main/java/org/sonar/process/cluster/hz/DistributedAnswer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,12 @@ public void propagateExceptions() {
9090
throw new IllegalStateException("Distributed cluster action timed out in cluster nodes " + timedOutMemberNames);
9191
}
9292
}
93+
94+
/**
95+
* Returns any answer. No guarantees are made on the order. Use this method if you only expect exactly one answer.
96+
* @return the first answer, if any
97+
*/
98+
public Optional<T> getSingleAnswer() {
99+
return answers.values().stream().findFirst();
100+
}
93101
}

server/sonar-process/src/main/java/org/sonar/process/cluster/hz/HazelcastMemberSelectors.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
package org.sonar.process.cluster.hz;
2121

22+
import com.hazelcast.cluster.Member;
2223
import com.hazelcast.cluster.MemberSelector;
2324
import java.util.List;
2425
import org.sonar.process.ProcessId;
@@ -39,4 +40,8 @@ public static MemberSelector selectorForProcessIds(ProcessId... processIds) {
3940
return processIdList.contains(memberProcessId);
4041
};
4142
}
43+
44+
public static MemberSelector selectorForMember(Member member) {
45+
return m -> m.getUuid().equals(member.getUuid());
46+
}
4247
}

server/sonar-process/src/main/java/org/sonar/process/cluster/hz/HazelcastObjects.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ public final class HazelcastObjects {
5353
*/
5454
public static final String SQ_HEALTH_STATE = "sq_health_state";
5555

56+
/**
57+
* Used in the header of HTTP call between the nodes to authenticate requests
58+
*/
59+
public static final String AUTH_SECRET = "AUTH_SECRET";
60+
61+
/**
62+
* The key of replicated map holding the secrets. Used instead of CP Subsystem.
63+
*/
64+
public static final String SECRETS = "SECRETS";
65+
5666
private HazelcastObjects() {
5767
// Holder for clustered objects
5868
}

server/sonar-process/src/test/java/org/sonar/process/cluster/hz/DistributedAnswerTest.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,14 @@
3232

3333
public class DistributedAnswerTest {
3434

35-
36-
private final Member member = newMember(UUID.randomUUID());
35+
private final Member member = newMember(uuidFromInt(9));
3736
private final DistributedAnswer<String> underTest = new DistributedAnswer<>();
3837

3938
@Test
4039
public void getMembers_return_all_members() {
4140
underTest.setAnswer(member, "foo");
42-
underTest.setTimedOut(newMember(UUID.randomUUID()));
43-
underTest.setFailed(newMember(UUID.randomUUID()), new IOException("BOOM"));
41+
underTest.setTimedOut(newMember(uuidFromInt(0)));
42+
underTest.setFailed(newMember(uuidFromInt(1)), new IOException("BOOM"));
4443

4544
assertThat(underTest.getMembers()).hasSize(3);
4645
}
@@ -100,16 +99,16 @@ public void propagateExceptions_does_nothing_if_no_members() {
10099

101100
@Test
102101
public void propagateExceptions_does_nothing_if_no_errors() {
103-
underTest.setAnswer(newMember(UUID.randomUUID()), "bar");
102+
underTest.setAnswer(newMember(uuidFromInt(3)), "bar");
104103

105104
// no errors
106105
underTest.propagateExceptions();
107106
}
108107

109108
@Test
110109
public void propagateExceptions_throws_ISE_if_at_least_one_timeout() {
111-
UUID uuid = UUID.randomUUID();
112-
UUID otherUuid = UUID.randomUUID();
110+
UUID uuid = uuidFromInt(4);
111+
UUID otherUuid = uuidFromInt(5);
113112

114113
underTest.setAnswer(newMember(uuid), "baz");
115114
underTest.setTimedOut(newMember(otherUuid));
@@ -121,8 +120,8 @@ public void propagateExceptions_throws_ISE_if_at_least_one_timeout() {
121120

122121
@Test
123122
public void propagateExceptions_throws_ISE_if_at_least_one_failure() {
124-
UUID foo = UUID.randomUUID();
125-
UUID bar = UUID.randomUUID();
123+
UUID foo = uuidFromInt(0);
124+
UUID bar = uuidFromInt(1);
126125

127126
underTest.setAnswer(newMember(bar), "baz");
128127
underTest.setFailed(newMember(foo), new IOException("BOOM"));
@@ -132,6 +131,22 @@ public void propagateExceptions_throws_ISE_if_at_least_one_failure() {
132131
.hasMessage("Distributed cluster action in cluster nodes " + foo + " (other nodes may have timed out)");
133132
}
134133

134+
@Test
135+
public void getSingleAnswer_returns_first_answer() {
136+
underTest.setAnswer(newMember(uuidFromInt(0)), "foo");
137+
138+
assertThat(underTest.getSingleAnswer()).isNotEmpty();
139+
}
140+
141+
private UUID uuidFromInt(int digit) {
142+
return UUID.fromString("00000000-0000-0000-0000-00000000000" + digit);
143+
}
144+
145+
@Test
146+
public void getSingleAnswer_whenNoAnswer_returnEmptyOptional() {
147+
assertThat(underTest.getSingleAnswer()).isEmpty();
148+
}
149+
135150
private static Member newMember(UUID uuid) {
136151
Member member = mock(Member.class);
137152
when(member.getUuid()).thenReturn(uuid);

server/sonar-process/src/test/java/org/sonar/process/cluster/hz/HazelcastMemberSelectorsTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import com.hazelcast.cluster.Member;
2323
import com.hazelcast.cluster.MemberSelector;
24+
import java.util.UUID;
2425
import org.junit.Test;
2526

2627
import static org.assertj.core.api.Assertions.assertThat;
@@ -62,4 +63,37 @@ public void selecting_web_and_app_nodes() {
6263
when(member.getAttribute(PROCESS_KEY.getKey())).thenReturn(APP.getKey());
6364
assertThat(underTest.select(member)).isTrue();
6465
}
66+
67+
@Test
68+
public void selectorForMember_whenUuidMatches_returnTrue() {
69+
Member member = mock();
70+
Member member2 = mock();
71+
UUID uuid1 = uuidFromInt(0);
72+
when(member.getUuid()).thenReturn(uuid1);
73+
when(member2.getUuid()).thenReturn(uuid1);
74+
75+
MemberSelector underTest = HazelcastMemberSelectors.selectorForMember(member);
76+
boolean found = underTest.select(member2);
77+
78+
assertThat(found).isTrue();
79+
}
80+
81+
private UUID uuidFromInt(int digit) {
82+
return UUID.fromString("00000000-0000-0000-0000-00000000000" + digit);
83+
}
84+
85+
@Test
86+
public void selectorForMember_whenUuidDoesntMatch_returnTrue() {
87+
Member member = mock();
88+
Member member2 = mock();
89+
UUID uuid1 = uuidFromInt(0);
90+
UUID uuid2 = uuidFromInt(1);
91+
when(member.getUuid()).thenReturn(uuid1);
92+
when(member2.getUuid()).thenReturn(uuid2);
93+
94+
MemberSelector underTest = HazelcastMemberSelectors.selectorForMember(member);
95+
boolean found = underTest.select(member2);
96+
97+
assertThat(found).isFalse();
98+
}
6599
}

0 commit comments

Comments
 (0)