Skip to content

Commit a882e61

Browse files
authored
[consumer] Fixed NPE in ChangelogClientConfig (#1683)
1 parent e9c05ff commit a882e61

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

clients/da-vinci-client/src/main/java/com/linkedin/davinci/consumer/ChangelogClientConfig.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import com.linkedin.venice.client.store.ClientConfig;
55
import com.linkedin.venice.controllerapi.D2ControllerClient;
66
import com.linkedin.venice.schema.SchemaReader;
7+
import java.util.Objects;
78
import java.util.Properties;
9+
import javax.annotation.Nonnull;
810
import org.apache.avro.specific.SpecificRecord;
911

1012

1113
public class ChangelogClientConfig<T extends SpecificRecord> {
12-
private Properties consumerProperties;
14+
private @Nonnull Properties consumerProperties = new Properties();
1315
private SchemaReader schemaReader;
1416
private String viewName;
1517
private Boolean isBeforeImageView = false;
@@ -67,11 +69,12 @@ public String getStoreName() {
6769
return innerClientConfig.getStoreName();
6870
}
6971

70-
public ChangelogClientConfig<T> setConsumerProperties(Properties consumerProperties) {
71-
this.consumerProperties = consumerProperties;
72+
public ChangelogClientConfig<T> setConsumerProperties(@Nonnull Properties consumerProperties) {
73+
this.consumerProperties = Objects.requireNonNull(consumerProperties);
7274
return this;
7375
}
7476

77+
@Nonnull
7578
public Properties getConsumerProperties() {
7679
return consumerProperties;
7780
}

clients/da-vinci-client/src/test/java/com/linkedin/davinci/consumer/VeniceChangelogConsumerImplTest.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import static org.mockito.Mockito.mock;
99
import static org.mockito.Mockito.times;
1010
import static org.mockito.Mockito.verify;
11+
import static org.testng.Assert.assertFalse;
12+
import static org.testng.Assert.assertNotNull;
13+
import static org.testng.Assert.assertThrows;
14+
import static org.testng.Assert.assertTrue;
1115

1216
import com.linkedin.avroutil1.compatibility.AvroCompatibilityHelper;
1317
import com.linkedin.davinci.consumer.stats.BasicConsumerStats;
@@ -65,6 +69,7 @@
6569
import java.util.HashSet;
6670
import java.util.List;
6771
import java.util.Map;
72+
import java.util.Properties;
6873
import java.util.Set;
6974
import java.util.concurrent.CompletableFuture;
7075
import java.util.concurrent.ConcurrentHashMap;
@@ -104,6 +109,19 @@ public void setUp() {
104109
valueSerializer = FastSerializerDeserializerFactory.getFastAvroGenericSerializer(valueSchema);
105110
}
106111

112+
@Test
113+
public void testConfig() {
114+
ChangelogClientConfig config = new ChangelogClientConfig();
115+
assertNotNull(config.getConsumerProperties());
116+
assertTrue(config.getConsumerProperties().isEmpty());
117+
assertThrows(NullPointerException.class, () -> config.setConsumerProperties(null));
118+
Properties newProps = new Properties();
119+
newProps.setProperty("foo", "bar");
120+
config.setConsumerProperties(newProps);
121+
assertNotNull(config.getConsumerProperties());
122+
assertFalse(config.getConsumerProperties().isEmpty());
123+
}
124+
107125
@Test
108126
public void testConsumeBeforeAndAfterImage() throws ExecutionException, InterruptedException {
109127
D2ControllerClient d2ControllerClient = mock(D2ControllerClient.class);
@@ -394,7 +412,7 @@ public void testBootstrapState() {
394412
0);
395413
doReturn(currentTimestamp).when(veniceChangelogConsumer).getSubscribeTime();
396414
veniceChangelogConsumer.maybeUpdatePartitionToBootstrapMap(message, pubSubTopicPartition);
397-
Assert.assertFalse(bootstrapStateMap.get(0));
415+
assertFalse(bootstrapStateMap.get(0));
398416
kafkaMessageEnvelope.producerMetadata.messageTimestamp = currentTimestamp - TimeUnit.SECONDS.toMillis(30);
399417
veniceChangelogConsumer.maybeUpdatePartitionToBootstrapMap(message, pubSubTopicPartition);
400418
Assert.assertTrue(bootstrapStateMap.get(0));
@@ -453,7 +471,7 @@ public void testConsumeAfterImage() throws ExecutionException, InterruptedExcept
453471
prepareVersionTopicRecordsToBePolled(5L, 15L, mockPubSubConsumer, oldVersionTopic, 0, true);
454472
pubSubMessages =
455473
(List<PubSubMessage<String, ChangeEvent<Utf8>, VeniceChangeCoordinate>>) veniceChangelogConsumer.poll(100);
456-
Assert.assertFalse(pubSubMessages.isEmpty());
474+
assertFalse(pubSubMessages.isEmpty());
457475
Assert.assertEquals(pubSubMessages.size(), 10);
458476
for (int i = 5; i < 15; i++) {
459477
PubSubMessage<String, ChangeEvent<Utf8>, VeniceChangeCoordinate> pubSubMessage = pubSubMessages.get(i - 5);
@@ -526,7 +544,7 @@ public void testConsumeAfterImageWithCompaction() throws ExecutionException, Int
526544

527545
prepareVersionTopicRecordsToBePolled(5L, 15L, mockPubSubConsumer, oldVersionTopic, 0, true);
528546
pubSubMessages = new ArrayList<>(veniceChangelogConsumer.poll(100));
529-
Assert.assertFalse(pubSubMessages.isEmpty());
547+
assertFalse(pubSubMessages.isEmpty());
530548
Assert.assertEquals(pubSubMessages.size(), 10);
531549
for (int i = 5; i < 15; i++) {
532550
PubSubMessage<String, ChangeEvent<Utf8>, VeniceChangeCoordinate> pubSubMessage = pubSubMessages.get(i - 5);

gradle/spotbugs/exclude.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<Or>
7676
<Class name="com.linkedin.venice.router.api.TestHostFinder"/>
7777
<Class name="com.linkedin.davinci.StoreBackendTest"/>
78+
<Class name="com.linkedin.davinci.consumer.VeniceChangelogConsumerImplTest"/>
7879
<Class name="com.linkedin.venice.memory.ClassSizeEstimatorTest"/>
7980
<Class name="com.linkedin.venice.controller.server.VeniceControllerAccessManagerTest"/>
8081
<Class name="com.linkedin.venice.sql.SQLUtilsTest"/>

0 commit comments

Comments
 (0)