Skip to content

Commit 1ac9187

Browse files
committed
address code review
1 parent d512964 commit 1ac9187

File tree

4 files changed

+48
-35
lines changed

4 files changed

+48
-35
lines changed

clients/da-vinci-client/src/main/java/com/linkedin/davinci/blobtransfer/BlobTransferUtil.java

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,14 @@ public class BlobTransferUtil {
2020

2121
/**
2222
* Get a P2P blob transfer manager for DaVinci Client and start it.
23-
* @param p2pTransferPort, the port used by the P2P transfer server and client
23+
* @param p2pTransferServerPort, the port used by the P2P transfer server
24+
* @param p2pTransferClientPort, the port used by the P2P transfer client
2425
* @param baseDir, the base directory of the underlying storage
2526
* @param clientConfig, the client config to start up a transport client
2627
* @param storageMetadataService, the storage metadata service
2728
* @return the blob transfer manager
2829
* @throws Exception
2930
*/
30-
public static BlobTransferManager<Void> getP2PBlobTransferManagerForDVCAndStart(
31-
int p2pTransferPort,
32-
String baseDir,
33-
ClientConfig clientConfig,
34-
StorageMetadataService storageMetadataService,
35-
ReadOnlyStoreRepository readOnlyStoreRepository,
36-
StorageEngineRepository storageEngineRepository,
37-
int maxConcurrentSnapshotUser,
38-
int snapshotRetentionTimeInMin,
39-
int blobTransferMaxTimeoutInMin,
40-
AggVersionedBlobTransferStats aggVersionedBlobTransferStats,
41-
BlobTransferUtils.BlobTransferTableFormat transferSnapshotTableFormat) {
42-
return getP2PBlobTransferManagerForDVCAndStart(
43-
p2pTransferPort,
44-
p2pTransferPort,
45-
baseDir,
46-
clientConfig,
47-
storageMetadataService,
48-
readOnlyStoreRepository,
49-
storageEngineRepository,
50-
maxConcurrentSnapshotUser,
51-
snapshotRetentionTimeInMin,
52-
blobTransferMaxTimeoutInMin,
53-
aggVersionedBlobTransferStats,
54-
transferSnapshotTableFormat);
55-
}
56-
5731
public static BlobTransferManager<Void> getP2PBlobTransferManagerForDVCAndStart(
5832
int p2pTransferServerPort,
5933
int p2pTransferClientPort,

clients/venice-thin-client/src/main/java/com/linkedin/venice/client/store/ClientFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class ClientFactory {
2222
private static Function<ClientConfig, TransportClient> configToTransportClientProviderForTests = null;
2323

2424
// Visible for testing
25-
static void setUnitTestMode() {
25+
public static void setUnitTestMode() {
2626
unitTestMode = true;
2727
}
2828

@@ -33,7 +33,7 @@ static void resetUnitTestMode() {
3333

3434
// Allow for overriding with mock D2Client for unit tests. The caller must release the object to prevent side-effects
3535
// VisibleForTesting
36-
static void setTransportClientProvider(Function<ClientConfig, TransportClient> transportClientProvider) {
36+
public static void setTransportClientProvider(Function<ClientConfig, TransportClient> transportClientProvider) {
3737
if (!unitTestMode) {
3838
throw new VeniceUnsupportedOperationException("setTransportClientProvider in non-unit-test-mode");
3939
}

internal/venice-common/src/main/java/com/linkedin/venice/blobtransfer/DaVinciBlobFinder.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,14 @@ public DaVinciBlobFinder(ClientConfig clientConfig) {
4848
* @return the store client
4949
*/
5050
AbstractAvroStoreClient getStoreClient(String storeName) {
51-
if (!storeToClientMap.containsKey(storeName)) {
51+
return storeToClientMap.computeIfAbsent(storeName, k -> {
5252
// update the config with respective store name
5353
ClientConfig storeClientConfig = ClientConfig.cloneConfig(clientConfig).setStoreName(storeName);
5454
AbstractAvroStoreClient storeLevelClient =
5555
new AvroGenericStoreClientImpl<>(getTransportClient(storeClientConfig), false, storeClientConfig);
56-
storeToClientMap.put(storeName, storeLevelClient);
5756
LOGGER.info("Created store client for store: {}", storeName);
58-
}
59-
return storeToClientMap.get(storeName);
57+
return storeLevelClient;
58+
});
6059
}
6160

6261
@Override

internal/venice-common/src/test/java/com/linkedin/venice/blobtransfer/DaVinciBlobFinderTest.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212
import com.fasterxml.jackson.databind.ObjectMapper;
1313
import com.linkedin.venice.client.store.AbstractAvroStoreClient;
1414
import com.linkedin.venice.client.store.ClientConfig;
15+
import com.linkedin.venice.client.store.ClientFactory;
16+
import com.linkedin.venice.client.store.transport.TransportClient;
1517
import com.linkedin.venice.client.store.transport.TransportClientResponse;
1618
import com.linkedin.venice.utils.ObjectMapperFactory;
1719
import java.io.IOException;
1820
import java.nio.charset.StandardCharsets;
1921
import java.util.List;
2022
import java.util.concurrent.CompletableFuture;
23+
import java.util.function.Function;
2124
import org.apache.logging.log4j.LogManager;
2225
import org.apache.logging.log4j.Logger;
2326
import org.mockito.ArgumentCaptor;
@@ -42,11 +45,13 @@ public void setUp() {
4245
storeClient = mock(AbstractAvroStoreClient.class);
4346
daVinciBlobFinder = spy(new DaVinciBlobFinder(clientConfig));
4447

45-
Mockito.doReturn(storeClient).when(daVinciBlobFinder).getStoreClient(storeName);
48+
Mockito.doReturn(storeName).when(storeClient).getStoreName();
4649
}
4750

4851
@Test
4952
public void testDiscoverBlobPeers_Success() {
53+
Mockito.doReturn(storeClient).when(daVinciBlobFinder).getStoreClient(storeName);
54+
5055
String responseBodyJson =
5156
"{\"error\":false,\"errorMessage\":\"\",\"discoveryResult\":[\"host1\",\"host2\",\"host3\"]}";
5257
byte[] responseBody = responseBodyJson.getBytes(StandardCharsets.UTF_8);
@@ -63,6 +68,7 @@ public void testDiscoverBlobPeers_Success() {
6368

6469
@Test
6570
public void testDiscoverBlobPeers_CallsTransportClientWithCorrectURI() {
71+
Mockito.doReturn(storeClient).when(daVinciBlobFinder).getStoreClient(storeName);
6672
String responseBodyJson =
6773
"{\"error\":false,\"errorMessage\":\"\",\"discoveryResult\":[\"host1\",\"host2\",\"host3\"]}";
6874
byte[] responseBody = responseBodyJson.getBytes(StandardCharsets.UTF_8);
@@ -84,6 +90,8 @@ public void testDiscoverBlobPeers_CallsTransportClientWithCorrectURI() {
8490

8591
@Test
8692
public void testDiscoverBlobPeers_ContentDeserializationError() throws Exception {
93+
Mockito.doReturn(storeClient).when(daVinciBlobFinder).getStoreClient(storeName);
94+
8795
String responseBodyJson = "{\"error\":true,\"errorMessage\":\"some error\",\"discoveryResult\":[]}";
8896
byte[] responseBody = responseBodyJson.getBytes(StandardCharsets.UTF_8);
8997
TransportClientResponse mockResponse = new TransportClientResponse(0, null, responseBody);
@@ -104,6 +112,8 @@ public void testDiscoverBlobPeers_ContentDeserializationError() throws Exception
104112

105113
@Test
106114
public void testDiscoverBlobPeers_ClientWithIncorrectUri() {
115+
Mockito.doReturn(storeClient).when(daVinciBlobFinder).getStoreClient(storeName);
116+
107117
CompletableFuture<byte[]> futureResponse = new CompletableFuture<>();
108118
futureResponse.completeExceptionally(new RuntimeException("Test Exception"));
109119
when(storeClient.getRaw(anyString())).thenReturn(futureResponse);
@@ -115,4 +125,34 @@ public void testDiscoverBlobPeers_ClientWithIncorrectUri() {
115125
response.getErrorMessage(),
116126
"Error finding DVC peers for blob transfer in store: testStore, version: 1, partition: 1");
117127
}
128+
129+
@Test
130+
public void testGetStoreClient() {
131+
// set up the transport client provider used to initialize the store client
132+
TransportClient transportClient1 = mock(TransportClient.class);
133+
TransportClient transportClient2 = mock(TransportClient.class);
134+
Function<ClientConfig, TransportClient> clientConfigTransportClientFunction = (clientConfig) -> {
135+
if (clientConfig.getStoreName().equals(storeName)) {
136+
return transportClient1;
137+
} else if (clientConfig.getStoreName().equals("storeName2")) {
138+
return transportClient2;
139+
} else {
140+
// Create TransportClient the regular way
141+
return null;
142+
}
143+
};
144+
ClientFactory.setUnitTestMode();
145+
ClientFactory.setTransportClientProvider(clientConfigTransportClientFunction);
146+
147+
// ClientConfig is initialized with storeName
148+
AbstractAvroStoreClient storeClient = daVinciBlobFinder.getStoreClient(storeName);
149+
Assert.assertNotNull(storeClient);
150+
Assert.assertEquals(storeClient.getStoreName(), storeName);
151+
152+
// Even if the daVinciBlobFinder is initialized at the beginning with "storeName", the getStoreClient
153+
// method should be able to return a store client for "storeName2"
154+
AbstractAvroStoreClient storeClient2 = daVinciBlobFinder.getStoreClient("storeName2");
155+
Assert.assertNotNull(storeClient2);
156+
Assert.assertEquals(storeClient2.getStoreName(), "storeName2");
157+
}
118158
}

0 commit comments

Comments
 (0)