你是对的,run_command
不支持直接做currentOp
。但是,如果我们看一下在mongo
壳db.currentOp
的实施,我们可以看到它是如何工作的引擎盖下:
> db.currentOp
function (arg) {
var q = {};
if (arg) {
if (typeof arg == "object") {
Object.extend(q, arg);
} else if (arg) {
q.$all = true;
}
}
return this.$cmd.sys.inprog.findOne(q);
}
因此,我们可以查询Perl的一侧专门收集$cmd.sys.inprog
得到相同的inprog
阵列这将在shell中返回。
use strict;
use warnings;
use MongoDB;
my $db = MongoDB::MongoClient->new->get_database('test');
my $current_op = $db->get_collection('$cmd.sys.inprog')->find_one;
当服务器不锁定,它会返回一个$current_op
结构看起来是这样的:
{
'inprog' => [
{
'connectionId' => 53,
'insert' => {},
'active' => bless(do{\(my $o = 0)}, 'boolean'),
'lockStats' => {
'timeAcquiringMicros' => {
'w' => 1,
'r' => 0
},
'timeLockedMicros' => {
'w' => 9,
'r' => 0
}
},
'numYields' => 0,
'locks' => {
'^' => 'w',
'^test' => 'W'
},
'waitingForLock' => $VAR1->{'inprog'}[0]{'active'},
'ns' => 'test.fnoof',
'client' => '127.0.0.1:50186',
'threadId' => '0x105a81000',
'desc' => 'conn53',
'opid' => 7152352,
'op' => 'insert'
}
]
};
期间fsyncLock()
,你会得到一个空数组inprog
但你将有一个有用的info
字段和预期的fsyncLock
布尔值:
{
'info' => 'use db.fsyncUnlock() to terminate the fsync write/snapshot lock',
'fsyncLock' => bless(do{\(my $o = 1)}, 'boolean'), # <--- that's true
'inprog' => []
};
所以,把他们放在一起,我们得到:
use strict;
use warnings;
use MongoDB;
my $db = MongoDB::MongoClient->new->get_database('fnarf');
my $current_op = $db->get_collection('$cmd.sys.inprog')->find_one;
if ($current_op->{fsyncLock}) {
print "fsync lock is currently ON\n";
} else {
print "fsync lock is currently OFF\n";
}
嗯,这是一个令人惊讶的准确的答案,工程就像一个魅力。非常感谢! –