perforce"连接是否被同行重置?#34;错误真的是一个错误?

时间:2018-04-20 14:13:51

标签: perforce

P4服务器版本:P4D / LINUX26X86_64 / 2013.2 / 938876(2014/09/23) 在RHEL6上

使用p4perl运行perl脚本时,我会捕获类似这样的错误......

if ($p4->ErrorCount() {
    foreach $err ($p4->Errors) {
        print "$err\n";
    }
}

这些错误以不确定的方式弹出,有时我会得到它们,有时候不会。但如果我用上面的代码捕获错误,我得到......

TCP receive failed.
read: socket:
Connection reset by peer

这是一个真正的错误(显然,连接被重置?) 我可以忽略这个吗?重置连接后它会运行我想要运行的东西吗?或者我需要重新运行该命令吗?

我担心这个问题可能源于这样一个事实,即perl脚本在之前执行了fork,并且我将$ p4句柄发送到forked进程。我可以做这样的事情来检测和纠正这个

use P4;
our $p4 = new P4;

<perl forks off a new process...>

if(!($p4-IsConnected)) {
    $p4->SetCwd("$CWD");
        if($p4->ErrorCount()) {handle_p4_error();} 
    $p4->Connect();
        if($p4->ErrorCount()) {handle_p4_error();}
}
....etc....
exit;

sub handle_p4_err {
    print "<<<P4 ERROR>>>\n";
    foreach $err ($p4->Errors) {
        print "$err\n";
    }
exit;
}

或者由于缺少连接,SetCwd会失败吗?

P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

  

这是一个真正的错误(显然,连接被重置了吗?)

是;与服务器的连接已终止。

  

我可以忽略这个吗?重置连接后它会运行我想要运行的东西吗?

没有

  

或者我是否需要重新运行该命令?

是;我想你还需要先重新打开连接。

$p4->Connect();
    if($p4->ErrorCount()) {handle_p4_error();}

这是一般模式,虽然如果连接失败,你可能想要摆脱困境,因为在这一点之后没有你做的事情(在大多数情况下,这意味着某些东西配置错误)。

  

或者由于缺少连接,SetCwd会失败吗?

没有;这纯粹是客户端操作,不与服务器通信。

  

P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)?

这是一种可能性 - 您的脚本是否保持空闲连接打开?这被认为是不礼貌的行为,因为通过防止任何新连接被打开,足以构成DDoS攻击。另一种可能性是存在其他一些网络故障(您的VPN连接断开等)。

答案 1 :(得分:1)

在我的特定情况下,我认为问题与perl脚本中的fork有关。也许句柄被传递给分叉进程,这干扰了在主进程线程中重新连接的尝试。我在数据库连接方面遇到了类似的问题。补救措施也很相似......

似乎工作的是在分叉之前无条件地与P4断开连接并且之后无条件地重新连接。分叉进程不需要P4连接,所以这是可以的(在我的特定情况下)。

答案 2 :(得分:0)

就我而言,问题是我需要与perforce服务器建立ssh连接,但是我没有添加正确的ssh密钥。您可以使用以下命令列出添加到会话中的ssh密钥:

ssh-add -L