Skip to content

Commit b671c2f

Browse files
authored
Merge pull request #753 from MatrixAI/feature-eng-338-add-user-provided-dns-option-to-agent-start
adding `dnsServers` option to `polykey`
2 parents c987b14 + 35bc76a commit b671c2f

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

src/PolykeyAgent.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ type PolykeyAgentOptions = {
9999
connectionHolePunchIntervalTime: number;
100100
rpcCallTimeoutTime: number;
101101
rpcParserBufferSize: number;
102+
dnsServers: Array<string> | undefined;
102103
};
103104
mdns: {
104105
groups: Array<string>;
@@ -386,6 +387,7 @@ class PolykeyAgent {
386387
groups: optionsDefaulted.mdns.groups,
387388
port: optionsDefaulted.mdns.port,
388389
},
390+
dnsServers: optionsDefaulted.nodes.dnsServers,
389391
logger: logger.getChild(NodeManager.name),
390392
});
391393
discovery = await Discovery.createDiscovery({

src/network/utils.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { PromiseCancellable } from '@matrixai/async-cancellable';
2-
import type { ContextTimed } from '@matrixai/contexts';
2+
import type { ContextTimed, ContextTimedInput } from '@matrixai/contexts';
33
import type { Address, Host, Hostname, Port } from './types';
44
import type { NodeAddress } from '../nodes/types';
55
import type { JSONValue } from '../types';
@@ -296,7 +296,7 @@ function isDNSError(e: { code: string }): boolean {
296296
function resolveHostname(
297297
hostname: Hostname,
298298
servers?: Array<string>,
299-
ctx?: Partial<ContextTimed>,
299+
ctx?: Partial<ContextTimedInput>,
300300
): PromiseCancellable<Array<Host>> {
301301
const f = async (ctx: ContextTimed) => {
302302
const hosts: Array<Host> = [];
@@ -403,10 +403,14 @@ function resolvesZeroIP(ip: Host): Host {
403403
* It will also filter out any duplicates.
404404
* @param addresses
405405
* @param existingAddresses
406+
* @param servers
407+
* @param ctx
406408
*/
407409
async function resolveHostnames(
408410
addresses: Array<NodeAddress>,
409411
existingAddresses: Set<string> = new Set(),
412+
servers?: Array<string>,
413+
ctx?: Partial<ContextTimedInput>,
410414
): Promise<Array<[Host, Port]>> {
411415
const final: Array<[Host, Port]> = [];
412416
for (const [host, port] of addresses) {
@@ -416,7 +420,7 @@ async function resolveHostnames(
416420
existingAddresses.add(`${host}|${port}`);
417421
continue;
418422
}
419-
const resolvedAddresses = await resolveHostname(host);
423+
const resolvedAddresses = await resolveHostname(host, servers, ctx);
420424
for (const resolvedHost of resolvedAddresses) {
421425
const newAddress: [Host, Port] = [resolvedHost, port];
422426
if (

src/nodes/NodeManager.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class NodeManager {
117117
Map<string, [NodeAddress, NodeContactAddressData]>
118118
> = new Map();
119119
protected concurrencyLimit = 3;
120+
protected dnsServers: Array<string> | undefined = undefined;
120121

121122
protected refreshBucketHandler: TaskHandler = async (
122123
ctx,
@@ -224,9 +225,12 @@ class NodeManager {
224225
// Establishing connections to the initial nodes
225226
const connectionResults = await Promise.allSettled(
226227
initialNodes.map(async ([nodeIdEncoded, nodeAddress]) => {
227-
const resolvedHosts = await networkUtils.resolveHostnames([
228-
nodeAddress,
229-
]);
228+
const resolvedHosts = await networkUtils.resolveHostnames(
229+
[nodeAddress],
230+
undefined,
231+
this.dnsServers,
232+
ctx,
233+
);
230234
if (resolvedHosts.length === 0) {
231235
throw new nodesErrors.ErrorNodeManagerResolveNodeFailed(
232236
`Failed to resolve '${nodeAddress[0]}'`,
@@ -329,6 +333,7 @@ class NodeManager {
329333
retryConnectionsDelayTime = 45_000, // 45 seconds
330334
nodesConnectionFindLocalTimeoutTime = config.defaultsSystem
331335
.nodesConnectionFindLocalTimeoutTime,
336+
dnsServers,
332337
logger,
333338
}: {
334339
db: DB;
@@ -347,6 +352,7 @@ class NodeManager {
347352
refreshBucketDelayJitter?: number;
348353
retryConnectionsDelayTime?: number;
349354
nodesConnectionFindLocalTimeoutTime?: number;
355+
dnsServers?: Array<string>;
350356
logger?: Logger;
351357
}) {
352358
this.logger = logger ?? new Logger(this.constructor.name);
@@ -366,6 +372,12 @@ class NodeManager {
366372
this.refreshBucketDelayJitter = Math.max(0, refreshBucketDelayJitter);
367373
this.retryConnectionsDelayTime = retryConnectionsDelayTime;
368374
this.connectionFindMDNSTimeoutTime = nodesConnectionFindLocalTimeoutTime;
375+
if (dnsServers != null) {
376+
this.logger.info(
377+
`Overriding DNS resolution servers with ${JSON.stringify(dnsServers)}`,
378+
);
379+
}
380+
this.dnsServers = dnsServers;
369381
}
370382

371383
public async start() {
@@ -843,8 +855,12 @@ class NodeManager {
843855
addresses.push([host, port]);
844856
}
845857
}
846-
const resolvedHosts =
847-
await networkUtils.resolveHostnames(addresses);
858+
const resolvedHosts = await networkUtils.resolveHostnames(
859+
addresses,
860+
undefined,
861+
this.dnsServers,
862+
ctx,
863+
);
848864

849865
try {
850866
await this.nodeConnectionManager.createConnectionMultiple(

0 commit comments

Comments
 (0)