Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(NODE-3914): deprecate legacy timeout options #4279

Draft
wants to merge 4 commits into
base: NODE-6090
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/connection_string.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1099,6 +1099,7 @@ export const OPTIONS = {
type: 'string'
},
socketTimeoutMS: {
deprecated: 'Please use timeoutMS instead',
default: 0,
type: 'uint'
},
Expand Down Expand Up @@ -1169,6 +1170,7 @@ export const OPTIONS = {
}
},
waitQueueTimeoutMS: {
deprecated: 'Please use timeoutMS instead',
default: 0,
type: 'uint'
},
Expand Down Expand Up @@ -1209,6 +1211,7 @@ export const OPTIONS = {
}
} as OptionDescriptor,
wtimeoutMS: {
deprecated: 'Please use timeoutMS instead',
target: 'writeConcern',
transform({ values: [value], options }) {
const wc = WriteConcern.fromOptions({
Expand Down
2 changes: 2 additions & 0 deletions src/cursor/abstract_cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export interface AbstractCursorOptions extends BSONSerializeOptions {
/**
* When applicable `maxTimeMS` controls the amount of time the initial command
* that constructs a cursor should take. (ex. find, aggregate, listCollections)
* @deprecated Will be removed in the next major version. Please use timeoutMS instead.
*/
maxTimeMS?: number;
/**
Expand Down Expand Up @@ -721,6 +722,7 @@ export abstract class AbstractCursor<
* Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
*
* @param value - Number of milliseconds to wait before aborting the query.
* @deprecated Will be removed in the next major version. Please use the timeoutMS option instead.
*/
maxTimeMS(value: number): this {
this.throwIfInitialized();
Expand Down
1 change: 1 addition & 0 deletions src/cursor/find_cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ export class FindCursor<TSchema = any> extends AbstractCursor<TSchema> {
* Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
*
* @param value - Number of milliseconds to wait before aborting the query.
*@deprecated Will be removed in the next major version. Please use timeoutMS instead.
*/
override maxTimeMS(value: number): this {
this.throwIfInitialized();
Expand Down
6 changes: 4 additions & 2 deletions src/cursor/run_command_cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export class RunCommandCursor extends AbstractCursor {
/**
* Controls the `getMore.maxTimeMS` field. Only valid when cursor is tailable await
* @param maxTimeMS - the number of milliseconds to wait for new data
* @deprecated Will be removed in the next major version. Please use timeoutMS instead.
*/
public setMaxTimeMS(maxTimeMS: number): this {
this.getMoreOptions.maxAwaitTimeMS = maxTimeMS;
Expand All @@ -56,7 +57,7 @@ export class RunCommandCursor extends AbstractCursor {

/**
* Controls the `getMore.batchSize` field
* @param maxTimeMS - the number documents to return in the `nextBatch`
* @param batchSize - the number documents to return in the `nextBatch`
*/
public setBatchSize(batchSize: number): this {
this.getMoreOptions.batchSize = batchSize;
Expand All @@ -82,7 +83,8 @@ export class RunCommandCursor extends AbstractCursor {
);
}

/** Unsupported for RunCommandCursor: maxTimeMS must be configured directly on command document */
/** Unsupported for RunCommandCursor: maxTimeMS must be configured directly on command document
* @deprecated Will be removed in the next major version. */
public override maxTimeMS(_: number): never {
throw new MongoAPIError(
'maxTimeMS must be configured on the command document directly, to configure getMore.maxTimeMS use cursor.setMaxTimeMS()'
Expand Down
3 changes: 2 additions & 1 deletion src/explain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export type ExplainVerbosityLike = ExplainVerbosity | boolean;
export interface ExplainCommandOptions {
/** The explain verbosity for the command. */
verbosity: ExplainVerbosity;
/** The maxTimeMS setting for the command. */
/** The maxTimeMS setting for the command.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead.*/
maxTimeMS?: number;
}

Expand Down
6 changes: 4 additions & 2 deletions src/mongo_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ export interface MongoClientOptions extends BSONSerializeOptions, SupportedNodeC
tlsInsecure?: boolean;
/** The time in milliseconds to attempt a connection before timing out. */
connectTimeoutMS?: number;
/** The time in milliseconds to attempt a send or receive on a socket before the attempt times out. */
/** The time in milliseconds to attempt a send or receive on a socket before the attempt times out.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead */
socketTimeoutMS?: number;
/** An array or comma-delimited string of compressors to enable network compression for communication between this client and a mongod/mongos instance. */
compressors?: CompressorName[] | string;
Expand All @@ -176,7 +177,8 @@ export interface MongoClientOptions extends BSONSerializeOptions, SupportedNodeC
maxConnecting?: number;
/** The maximum number of milliseconds that a connection can remain idle in the pool before being removed and closed. */
maxIdleTimeMS?: number;
/** The maximum time in milliseconds that a thread can wait for a connection to become available. */
/** The maximum time in milliseconds that a thread can wait for a connection to become available.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead */
waitQueueTimeoutMS?: number;
/** Specify a read concern for the collection (only MongoDB 3.2 or higher supported) */
readConcern?: ReadConcernLike;
Expand Down
3 changes: 2 additions & 1 deletion src/operations/aggregate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ export interface AggregateOptions extends Omit<CommandOperationOptions, 'explain
bypassDocumentValidation?: boolean;
/** Return the query as cursor, on 2.6 \> it returns as a real cursor on pre 2.6 it returns as an emulated cursor. */
cursor?: Document;
/** specifies a cumulative time limit in milliseconds for processing operations on the cursor. MongoDB interrupts the operation at the earliest following interrupt point. */
/** specifies a cumulative time limit in milliseconds for processing operations on the cursor. MongoDB interrupts the operation at the earliest following interrupt point.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead.*/
maxTimeMS?: number;
/** The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. */
maxAwaitTimeMS?: number;
Expand Down
2 changes: 2 additions & 0 deletions src/operations/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ export interface CommandOperationOptions
readConcern?: ReadConcernLike;
/** Collation */
collation?: CollationOptions;
/**
* @deprecated Will be removed in the next major version. Please use timeoutMS instead. */
maxTimeMS?: number;
/**
* Comment to apply to the operation.
Expand Down
3 changes: 2 additions & 1 deletion src/operations/count.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ export interface CountOptions extends CommandOperationOptions {
skip?: number;
/** The maximum amounts to count before aborting. */
limit?: number;
/** Number of milliseconds to wait before aborting the query. */
/** Number of milliseconds to wait before aborting the query.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead. */
maxTimeMS?: number;
/** An index name hint for the query. */
hint?: string | Document;
Expand Down
1 change: 1 addition & 0 deletions src/operations/estimated_document_count.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export interface EstimatedDocumentCountOptions extends CommandOperationOptions {
* The maximum amount of time to allow the operation to run.
*
* This option is sent only if the caller explicitly provides a value. The default is to not send a value.
*@deprecated Will be removed in the next major version. Please use timeoutMS instead.
*/
maxTimeMS?: number;
}
Expand Down
4 changes: 2 additions & 2 deletions src/operations/find.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ export interface FindOptions<TSchema extends Document = Document>
min?: Document;
/** The exclusive upper bound for a specific index */
max?: Document;
/** Number of milliseconds to wait before aborting the query. */
/** Number of milliseconds to wait before aborting the query.
* @deprecated Will be removed in the next major version. Please use timeoutMS instead. */
maxTimeMS?: number;
/** The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. Requires `tailable` and `awaitData` to be true */
maxAwaitTimeMS?: number;
Expand Down Expand Up @@ -73,7 +74,6 @@ export interface FindOptions<TSchema extends Document = Document>
* @deprecated This API is deprecated in favor of `collection.find().explain()`.
*/
explain?: ExplainOptions['explain'];
/** @internal*/
timeoutMode?: CursorTimeoutMode;
}

Expand Down
2 changes: 1 addition & 1 deletion src/operations/get_more.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export interface GetMoreOptions extends OperationOptions {
* getMore only supports 'comment' in server versions 4.4 and above.
*/
comment?: unknown;
/** Number of milliseconds to wait before aborting the query. */
/** Number of milliseconds to wait before aborting the query.
maxTimeMS?: number;
/** TODO(NODE-4413): Address bug with maxAwaitTimeMS not being passed in from the cursor correctly */
maxAwaitTimeMS?: number;
Expand Down
56 changes: 32 additions & 24 deletions src/sessions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -482,13 +482,28 @@ export class ClientSession
maxTimeMS?: number;
} = { commitTransaction: 1 };

const timeoutMS =
typeof options?.timeoutMS === 'number'
? options.timeoutMS
: typeof this.timeoutMS === 'number'
? this.timeoutMS
: null;

const wc = this.transaction.options.writeConcern ?? this.clientOptions?.writeConcern;
if (wc != null) {
WriteConcern.apply(command, { wtimeoutMS: 10000, w: 'majority', ...wc });
if (timeoutMS == null && this.timeoutContext == null) {
WriteConcern.apply(command, { wtimeoutMS: 10000, w: 'majority', ...wc });
} else {
WriteConcern.apply(command, { w: 'majority', ...wc, wtimeoutMS: undefined });
}
}

if (this.transaction.state === TxnState.TRANSACTION_COMMITTED) {
WriteConcern.apply(command, { wtimeoutMS: 10000, ...wc, w: 'majority' });
if (timeoutMS == null && this.timeoutContext == null) {
WriteConcern.apply(command, { wtimeoutMS: 10000, ...wc, w: 'majority' });
} else {
WriteConcern.apply(command, { w: 'majority', ...wc, wtimeoutMS: undefined });
}
}

if (typeof this.transaction.options.maxTimeMS === 'number') {
Expand All @@ -505,13 +520,6 @@ export class ClientSession
bypassPinningCheck: true
});

const timeoutMS =
typeof options?.timeoutMS === 'number'
? options.timeoutMS
: typeof this.timeoutMS === 'number'
? this.timeoutMS
: null;

const timeoutContext =
this.timeoutContext ??
(typeof timeoutMS === 'number'
Expand Down Expand Up @@ -601,21 +609,6 @@ export class ClientSession
recoveryToken?: Document;
} = { abortTransaction: 1 };

const wc = this.transaction.options.writeConcern ?? this.clientOptions?.writeConcern;
if (wc != null) {
WriteConcern.apply(command, { wtimeoutMS: 10000, w: 'majority', ...wc });
}

if (this.transaction.recoveryToken) {
command.recoveryToken = this.transaction.recoveryToken;
}

const operation = new RunAdminCommandOperation(command, {
session: this,
readPreference: ReadPreference.primary,
bypassPinningCheck: true
});

const timeoutMS =
typeof options?.timeoutMS === 'number'
? options.timeoutMS
Expand All @@ -634,6 +627,21 @@ export class ClientSession
})
: null;

const wc = this.transaction.options.writeConcern ?? this.clientOptions?.writeConcern;
if (wc != null && timeoutMS == null) {
WriteConcern.apply(command, { wtimeoutMS: 10000, w: 'majority', ...wc });
}

if (this.transaction.recoveryToken) {
command.recoveryToken = this.transaction.recoveryToken;
}

const operation = new RunAdminCommandOperation(command, {
session: this,
readPreference: ReadPreference.primary,
bypassPinningCheck: true
});

try {
await executeOperation(this.client, operation, timeoutContext);
this.unpin();
Expand Down
15 changes: 12 additions & 3 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -542,20 +542,31 @@ export function resolveOptions<T extends CommandOperationOptions>(
): T {
const result: T = Object.assign({}, options, resolveBSONOptions(options, parent));

const timeoutMS = options?.timeoutMS ?? parent?.timeoutMS;
// Users cannot pass a readConcern/writeConcern to operations in a transaction
const session = options?.session;

if (!session?.inTransaction()) {
const readConcern = ReadConcern.fromOptions(options) ?? parent?.readConcern;
if (readConcern) {
result.readConcern = readConcern;
}

const writeConcern = WriteConcern.fromOptions(options) ?? parent?.writeConcern;
let writeConcern = WriteConcern.fromOptions(options) ?? parent?.writeConcern;
if (writeConcern) {
if (timeoutMS != null) {
writeConcern = WriteConcern.fromOptions({
...writeConcern,
wtimeout: undefined,
wtimeoutMS: undefined
});
}
result.writeConcern = writeConcern;
}
}

result.timeoutMS = timeoutMS;

const readPreference = ReadPreference.fromOptions(options) ?? parent?.readPreference;
if (readPreference) {
result.readPreference = readPreference;
Expand All @@ -568,8 +579,6 @@ export function resolveOptions<T extends CommandOperationOptions>(
);
}

result.timeoutMS = options?.timeoutMS ?? parent?.timeoutMS;

return result;
}

Expand Down
6 changes: 4 additions & 2 deletions src/write_concern.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export interface WriteConcernOptions {
export interface WriteConcernSettings {
/** The write concern */
w?: W;
/** The write concern timeout */
/** The write concern timeout
* @deprecated Will be removed in the next major version. Please use timeoutMS */
wtimeoutMS?: number;
/** The journal write concern */
journal?: boolean;
Expand Down Expand Up @@ -65,7 +66,8 @@ export class WriteConcern {
readonly w?: W;
/** Request acknowledgment that the write operation has been written to the on-disk journal */
readonly journal?: boolean;
/** Specify a time limit to prevent write operations from blocking indefinitely */
/** Specify a time limit to prevent write operations from blocking indefinitely
* @deprecated Will be removed in the next major version. Please use timeoutMS */
readonly wtimeoutMS?: number;
/**
* Specify a time limit to prevent write operations from blocking indefinitely.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner';
const skippedSpecs = {
'change-streams': 'TODO(NODE-6035)',
'convenient-transactions': 'TODO(NODE-5687)',
'deprecated-options': 'TODO(NODE-5689)',
'tailable-awaitData': 'TODO(NODE-6035)',
'tailable-non-awaitData': 'TODO(NODE-6035)'
};
Expand Down