schangxiang@126.com
2025-09-19 0821aa23eabe557c0d9ef5dbe6989c68be35d1fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
'use strict';
 
const KillCursor = require('../connection/commands').KillCursor;
const MongoError = require('../error').MongoError;
const MongoNetworkError = require('../error').MongoNetworkError;
const collectionNamespace = require('./shared').collectionNamespace;
const maxWireVersion = require('../utils').maxWireVersion;
const command = require('./command');
 
function killCursors(server, ns, cursorState, callback) {
  callback = typeof callback === 'function' ? callback : () => {};
  const cursorId = cursorState.cursorId;
 
  if (maxWireVersion(server) < 4) {
    const bson = server.s.bson;
    const pool = server.s.pool;
    const killCursor = new KillCursor(bson, ns, [cursorId]);
    const options = {
      immediateRelease: true,
      noResponse: true
    };
 
    if (typeof cursorState.session === 'object') {
      options.session = cursorState.session;
    }
 
    if (pool && pool.isConnected()) {
      try {
        pool.write(killCursor, options, callback);
      } catch (err) {
        if (typeof callback === 'function') {
          callback(err, null);
        } else {
          console.warn(err);
        }
      }
    }
 
    return;
  }
 
  const killCursorCmd = {
    killCursors: collectionNamespace(ns),
    cursors: [cursorId]
  };
 
  const options = {};
  if (typeof cursorState.session === 'object') options.session = cursorState.session;
 
  command(server, ns, killCursorCmd, options, (err, result) => {
    if (err) {
      return callback(err);
    }
 
    const response = result.message;
    if (response.cursorNotFound) {
      return callback(new MongoNetworkError('cursor killed or timed out'), null);
    }
 
    if (!Array.isArray(response.documents) || response.documents.length === 0) {
      return callback(
        new MongoError(`invalid killCursors result returned for cursor id ${cursorId}`)
      );
    }
 
    callback(null, response.documents[0]);
  });
}
 
module.exports = killCursors;