Skip to content

Commit 62010de

Browse files
#RI-3704-fix overview calculation
1 parent 1859093 commit 62010de

File tree

2 files changed

+24
-29
lines changed

2 files changed

+24
-29
lines changed

redisinsight/api/src/modules/database-analysis/scanner/keys-scanner.spec.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -107,34 +107,10 @@ describe('KeysScanner', () => {
107107

108108
describe('nodeScan', () => {
109109
it('should scan node keys', async () => {
110+
const getTotal = jest.fn().mockResolvedValue(1);
110111
expect(await service.nodeScan(nodeClient, {
111112
filter: mockCreateDatabaseAnalysisDto.filter,
112113
})).toEqual(mockScanResult);
113114
});
114115
});
115-
116-
describe('getNodeTotal', () => {
117-
it('get total keys in db', async () => {
118-
expect(await service.getNodeTotal(nodeClient)).toEqual(1);
119-
});
120-
it('get total keys in db (db:3)', async () => {
121-
const client = Object.assign(nodeClient);
122-
client.options = { db: 3 };
123-
expect(await service.getNodeTotal(client)).toEqual(100);
124-
});
125-
it('get total keys in db (no keyspace data)', async () => {
126-
when(nodeClient.sendCommand)
127-
.calledWith(jasmine.objectContaining({ name: 'info' }))
128-
.mockResolvedValueOnce(mockRedisKeyspaceInfoResponseNoKeyspaceData);
129-
130-
expect(await service.getNodeTotal(nodeClient)).toEqual(0);
131-
});
132-
it('get total keys in db (no info data)', async () => {
133-
when(nodeClient.sendCommand)
134-
.calledWith(jasmine.objectContaining({ name: 'info' }))
135-
.mockResolvedValueOnce(mockRedisKeyspaceInfoResponseEmpty);
136-
137-
expect(await service.getNodeTotal(nodeClient)).toEqual(0);
138-
});
139-
});
140116
});

redisinsight/api/src/modules/database/providers/database-overview.provider.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
convertBulkStringsToObject,
1313
convertRedisInfoReplyToObject,
1414
} from 'src/utils';
15+
import { getTotal } from 'src/modules/database/utils/database.total.util';
1516
import { DatabaseOverview } from 'src/modules/database/models/database-overview';
1617

1718
@Injectable()
@@ -29,16 +30,21 @@ export class DatabaseOverviewProvider {
2930
): Promise<DatabaseOverview> {
3031
let nodesInfo = [];
3132
let currentDbIndex = 0;
33+
let totalKeys;
34+
let totalKeysPerDb;
3235

33-
if (client instanceof IORedis.Cluster) {
36+
if (client.isCluster) {
3437
currentDbIndex = get(client, ['options', 'db'], 0);
35-
nodesInfo = await this.getNodesInfo(client);
38+
nodesInfo = await this.getNodesInfo(client as IORedis.Cluster);
39+
totalKeys = await this.calculateNodesTotalKeys(client);
3640
} else {
3741
currentDbIndex = get(client, ['options', 'db'], 0);
38-
nodesInfo = [await this.getNodeInfo(client)];
42+
nodesInfo = [await this.getNodeInfo(client as IORedis.Redis)];
43+
const [calculatedTotalKeys, calculatedTotalKeysPerDb] = this.calculateTotalKeys(nodesInfo, currentDbIndex);
44+
totalKeys = calculatedTotalKeys;
45+
totalKeysPerDb = calculatedTotalKeysPerDb;
3946
}
4047

41-
const [totalKeys, totalKeysPerDb] = this.calculateTotalKeys(nodesInfo, currentDbIndex);
4248
return {
4349
version: this.getVersion(nodesInfo),
4450
totalKeys,
@@ -234,6 +240,19 @@ export class DatabaseOverviewProvider {
234240
}
235241
}
236242

243+
private async calculateNodesTotalKeys(
244+
client: IORedis.Cluster,
245+
): Promise<number> {
246+
const nodesTotal: number[] = await Promise.all(
247+
client
248+
.nodes('master')
249+
.map(async (node) => getTotal(node)),
250+
);
251+
return nodesTotal.reduce((prev, cur) => (
252+
prev + cur
253+
), 0);
254+
}
255+
237256
/**
238257
* Calculates sum of cpu usage in percentage for all shards
239258
* CPU% = ((used_cpu_sys_t2+used_cpu_user_t2)-(used_cpu_sys_t1+used_cpu_user_t1)) / (t2-t1)

0 commit comments

Comments
 (0)