Multithreading 多线程perl脚本错误

Multithreading 多线程perl脚本错误,multithreading,perl,openldap,Multithreading,Perl,Openldap,我正在使用多线程perl脚本向ldap服务器添加条目。该脚本正在读取一些文件,然后向ldap数据库创建相应的条目。我的脚本如下: #!/usr/bin/perl -w use strict; use warnings; use threads; use threads::shared; #use Thread::Queue; use POSIX; use Data::Dumper; use Net::LDAP;

我正在使用多线程perl脚本向ldap服务器添加条目。该脚本正在读取一些文件,然后向ldap数据库创建相应的条目。我的脚本如下:

    #!/usr/bin/perl -w

    use strict;
    use warnings;
    use threads;
    use threads::shared;
    #use Thread::Queue;
    use POSIX;
    use Data::Dumper;

    use Net::LDAP;
    use Net::LDAP::LDIF;
    use Net::LDAP::Entry;

    #my $q = Thread::Queue->new(); # A new empty queue

    my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";

    opendir(DIR, $INPUT_DIR) ;
    my @files = grep { /^InputFile/ } readdir DIR;
    my $count = @files;
    print "Total Files: $count \n";
    my @threads;

    my $noofthread = 3;
    my $nooffiles = $count;
    my $noofbatch = $nooffiles / $noofthread;

    print "No of batch1 : $noofbatch \n";

    my $abc = $nooffiles % $noofthread;
    print "ABC: $abc  \n";

    if (($nooffiles % $noofthread) > 0) {
      $noofbatch = ceil($noofbatch);
    }
    print "No of batch2: $noofbatch \n";


    my $ldap = '';

    ## Connect and bind to the server.
    $ldap = Net::LDAP->new( '6873ZR1.egi.ericsson.com',
                         port => 389,
                         version => 3,
                         verify => 'optional',
                         cafile => '/etc/ldap/cacert.pem' ) or die $!;



    ## Bind to the server. The account must have sufficient privileges because you will
    ## be adding new entries.

    my $result = $ldap->bind("administratorName=***,nodeName=***",
     password => "***");

    die $result->error() if $result->code();



    # split the workload into N batches
    #
    while (my @batch = splice(@files, 0, $noofbatch)) {
      #print "@batch \n";
      push @threads, threads->new(\&doOperation, @batch);
    }

    for my $thr (@threads) {
      #print "Ending Thread: $thr \n";
      $thr->join;
    }

    sub doOperation () {
        my $ithread = threads->tid() ;
        print "Thread Index : [id=$ithread]\n" ;
        my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";

        foreach my $item (@_) {

    my $filename = $INPUT_DIR.$item;
    #print "Filename: $filename  \n";
    die "$filename not found!\n" unless ( -f $filename );
    my $ldif = Net::LDAP::LDIF->new ($filename, "r") or die $!;
    while ( ! $ldif->eof()) {
        my $entry = $ldif->read_entry();

        $result = $ldap->add($entry);
        $result = $entry->add()->update( $ldap );
        print "$filename  : $result  \n";
        }
    }  
}
直到代码
$result=$ldap->add($entry)工作正常。但是当它到达行
$result=$entry->add()->update($ldap)显示以下错误:

    eyacdel@6873ZR1:~/Documents/MM/Roger_SAPC/myscript$ perl thread_test1.pl
    Total Files: 10
    No of batch1 : 3.33333333333333
    ABC: 1 
    No of batch2: 4
    Thread Index : [id=1]
    Thread Index : [id=2]
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF                /InputFile1_5.ldif          : Net::LDAP::Add=HASH(0x7fe86c006ba0) 
    Thread Index : [id=3]
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif          : Net::LDAP::Add=HASH(0x7fe86c006cf0) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif          : Net::LDAP::Add=HASH(0x7fe86c012568) 
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif          : Net::LDAP::Add=HASH(0x7fe868007e90) 
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe864006ba0) 
    4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif          : Net::LDAP::Add=HASH(0x161e500) 
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif          : Net::LDAP::Add=HASH(0x7fe868007fe0) 
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe864006cf0) 
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif          : Net::LDAP::Add=HASH(0x161e4b8) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif          : Net::LDAP::Add=HASH(0x7fe868012600) 
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif          : Net::LDAP::Add=HASH(0x7fe86c006bd0) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe864012640) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif          : Net::LDAP::Add=HASH(0x7fe86c004ed0) 
    4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif          : Net::LDAP::Add=HASH(0x7fe8680126d8) 
    4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe864012718) 
    5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif          : Net::LDAP::Add=HASH(0x7fe8680127b0) 
    4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif          : Net::LDAP::Add=HASH(0x7fe86c004fa8) 
    5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif          : Net::LDAP::Add=HASH(0x7fe86c004e10) 
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif          : Net::LDAP::Add=HASH(0x161e608) 
    1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif          : Net::LDAP::Add=HASH(0x1d6e9d8) 
    5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe864014d60) 
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif          : Net::LDAP::Add=HASH(0x7fe868007e30) 
    6 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif          : Net::LDAP::Add=HASH(0x7fe8640152c0) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif          : Net::LDAP::Add=HASH(0x7fe868012810) 
    2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif          : Net::LDAP::Add=HASH(0x7fe86c006bd0) 
    4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif          : Net::LDAP::Add=HASH(0x7fe868015398) 
    3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif          : Net::LDAP::Add=HASH(0x7fe86c004ea0)  

请帮助我解决此问题。

首先,这不是错误,只是此脚本的输出。你能粘贴实际的错误吗

您正在打印一个对象。为此,请使用Data::Dumper。如果您对刚才添加的DN感兴趣,请使用下面的

Ldap不是线程安全的。您应该为每个线程创建一个新连接,或者必须使用某种阻塞,以确保在给定时间内只有一个线程使用它

如果在连接字符串中使用Net::Ldap或安装程序,请使用正确的错误检查

更改操作如下:

sub doOperation () {
    my $ithread = threads->tid() ;
    print "Thread Index : [id=$ithread]\n" ;
    my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";

    foreach my $item (@_) {
        my $filename = $INPUT_DIR.$item;
        #print "Filename: $filename  \n";
        die "$filename not found!\n" unless ( -f $filename );
        my $ldap = connect_ldap();### Create a sub for ldap connect
        my $ldif = Net::LDAP::LDIF->new ($filename, "r") or die $!;
        while ( ! $ldif->eof()) {
            my $entry = $ldif->read_entry();

            $result = $ldap->add($entry);
            $result = $entry->add()->update( $ldap );
            print "tid: $ithread\t$filename: ".$result->code."\tdn: ".$entry-dn()."\n";
                    die  "Error: ".$result->code() if $result->code();
        }
        $ldif->done();
        $ldap->disconnect();
    }  
}