Skip to content

Commit 5c8a099

Browse files
author
Artem
committed
#RI-3986 possible fix to deal with concurrent requests (reuse existing)
1 parent cebc037 commit 5c8a099

File tree

6 files changed

+28
-28
lines changed

6 files changed

+28
-28
lines changed

redisinsight/api/src/__mocks__/redis.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ export const mockRedisService = jest.fn(() => ({
6868
getClientInstance: jest.fn().mockResolvedValue({
6969
client: mockIORedisClient,
7070
}),
71-
setClientInstance: jest.fn(),
71+
setClientInstance: jest.fn().mockReturnValue({
72+
client: mockIORedisClient,
73+
}),
7274
isClientConnected: jest.fn().mockReturnValue(true),
7375
removeClientInstance: jest.fn(),
7476
removeClientInstances: jest.fn(),

redisinsight/api/src/modules/database/database-connection.service.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ export class DatabaseConnectionService {
7777

7878
client = await this.createClient(clientMetadata);
7979

80-
this.redisService.setClientInstance(clientMetadata, client);
81-
82-
return client;
80+
return this.redisService.setClientInstance(clientMetadata, client)?.client;
8381
}
8482

8583
/**

redisinsight/api/src/modules/redis/redis-consumer.abstract.service.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ describe('RedisConsumerAbstractService', () => {
5454
redisService = await module.get<RedisService>(RedisService);
5555
consumerInstance = await module.get<BrowserToolService>(BrowserToolService);
5656
redisConnectionFactory = await module.get(RedisConnectionFactory);
57+
58+
redisService.setClientInstance.mockReturnValue(mockRedisClientInstance);
5759
});
5860

5961
describe('getRedisClient', () => {

redisinsight/api/src/modules/redis/redis-consumer.abstract.service.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,13 @@ export abstract class RedisConsumerAbstractService implements IRedisConsumer {
143143
instanceDto,
144144
connectionName,
145145
);
146-
this.redisService.setClientInstance(
146+
return this.redisService.setClientInstance(
147147
{
148148
...clientMetadata,
149149
context: clientMetadata.context || this.consumer,
150150
},
151151
client,
152-
);
153-
return client;
152+
)?.client;
154153
} catch (error) {
155154
throw catchRedisConnectionError(error, instanceDto);
156155
}

redisinsight/api/src/modules/redis/redis.service.spec.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,32 @@ describe('RedisService', () => {
121121

122122
const result = service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient);
123123

124-
expect(result).toEqual(1);
124+
expect(result.client).toEqual(mockIORedisClient);
125125
expect(service.clients.size).toEqual(1);
126126
});
127127

128-
it('should replace existing client and update last used time', async () => {
128+
it('should use existing client instead of replacing with new one', async () => {
129129
expect(service.clients.size).toEqual(0);
130130

131-
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient)).toEqual(1);
131+
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient).client)
132+
.toEqual(mockIORedisClient);
132133
expect(service.clients.size).toEqual(1);
133134

134-
const [justAddedClient] = [...service.clients.values()];
135+
let [justAddedClient] = [...service.clients.values()];
136+
justAddedClient = { ...justAddedClient };
135137

136138
// sleep
137139
await new Promise((res) => setTimeout(res, 100));
138140

139-
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisSentinel)).toEqual(0);
141+
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisSentinel).client)
142+
.toEqual(mockIORedisClient);
140143
expect(service.clients.size).toEqual(1);
141144

142-
const [overwrittenClient] = [...service.clients.values()];
143-
expect(overwrittenClient.clientMetadata).toEqual(justAddedClient.clientMetadata);
144-
expect(overwrittenClient.id).toEqual(justAddedClient.id);
145-
expect(overwrittenClient.client).not.toEqual(justAddedClient.client);
146-
expect(overwrittenClient.lastTimeUsed).toBeGreaterThan(justAddedClient.lastTimeUsed);
145+
const [newClient] = [...service.clients.values()];
146+
expect(newClient.clientMetadata).toEqual(justAddedClient.clientMetadata);
147+
expect(newClient.id).toEqual(justAddedClient.id);
148+
expect(newClient.client).toEqual(justAddedClient.client);
149+
expect(newClient.lastTimeUsed).toBeGreaterThan(justAddedClient.lastTimeUsed);
147150
});
148151
});
149152

redisinsight/api/src/modules/redis/redis.service.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export class RedisService implements OnModuleDestroy {
6262
return found;
6363
}
6464

65-
public setClientInstance(clientMetadata: ClientMetadata, client): 0 | 1 {
65+
public setClientInstance(clientMetadata: ClientMetadata, client): IRedisClientInstance {
6666
const metadata = RedisService.prepareClientMetadata(clientMetadata);
6767

6868
const id = RedisService.generateId(metadata);
@@ -76,22 +76,18 @@ export class RedisService implements OnModuleDestroy {
7676
};
7777

7878
if (found) {
79-
// workaround for concurrent requests.
80-
// At first try to gracefully close the connection using quit
81-
try {
82-
found.client.quit();
83-
} catch (e) {
84-
found.client.disconnect();
79+
if (this.isClientConnected(found.client)) {
80+
found.lastTimeUsed = Date.now();
81+
client.disconnect();
82+
return found;
8583
}
8684

87-
this.clients.delete(id);
88-
this.clients.set(id, clientInstance);
89-
return 0; // todo: investigate why we need to distinguish between 1 | 0
85+
found.client.disconnect();
9086
}
9187

9288
this.clients.set(id, clientInstance);
9389

94-
return 1;
90+
return clientInstance;
9591
}
9692

9793
public removeClientInstance(clientMetadata: ClientMetadata): number {

0 commit comments

Comments
 (0)