--- loncom/debugging_tools/db_copy.pl 2006/10/03 18:01:01 1.3 +++ loncom/debugging_tools/db_copy.pl 2006/10/13 18:34:07 1.4 @@ -19,57 +19,73 @@ if (!-x $dump_db || !-x $create_db) { my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')}; +my $do_locks = 1; { - my $straight; sub lock_db { - my ($fname) = @_; - my $dbref; - $fname = &Cwd::abs_path($fname); - if ($fname =~ m/^\Q$perlvar{'lonUsersDir'}\E/) { - $dbref=&LONCAPA::locking_hash_tie($fname,&GDBM_READER()); - $straight=0; - } else { - if (tie(my %db,'GDBM_File',$fname,&GDBM_READER(),0640)) { - $dbref = \%db; - } - $straight=1; - } - return $dbref; + my ($fname) = @_; + my $sym; + if ($do_locks) { + open($sym,">>$fname.lock"); + flock($sym,(LOCK_EX)); + } + return $sym; } sub unlock_db { - my ($dbref) = @_; - if ($straight) { - untie($dbref); - } else { - &LONCAPA::locking_hash_untie($dbref); - } + my ($sym) = @_; + if (ref($sym)) { + flock($sym,(LOCK_UN)); + } } } +my $count=0; +sub count_db { + return if ($_!~m/\.db$/); + $count++; +} + +my $done=0; +my $starttime; +my $last_100_start_time; sub process_db { return if ($_!~m/\.db$/); - my $file = $_; - my $dbref =&lock_db($file); - print("attempting $file\n"); - my %newdb; - my $new_file = $file.'.new'; - system("$dump_db -f $file|$create_db -f $new_file"); + if (!-e "$_.old") { + my $file = $_; + my $dbref =&lock_db($file); + #print("attempting $file\n"); + system("$dump_db -f $file|$create_db -f $file.new"); # print("finishing $dbref\n"); - untie($dbref); - system("/bin/mv $file $file.old"); - system("/bin/mv $file.new $file"); - &unlock_db($dbref); + rename($file,"$file.old"); + rename("$file.new","$file"); + &unlock_db($dbref); + } + $done++; + if (!($done %100)) { + print("$_\n"); + my $took = time()-$starttime; + my $togo = int(($took/$done) * ($count-$done)); + my $total = $togo+$took; + my $per = $took/$done; + my $last_per = (time()-$last_100_start_time)/100; + printf("%6d in %6d, togo %6d, overall %6d, %.4f (for one), %.4f)\n", + $done,$took,$togo,$total,$per,$last_per); + $last_100_start_time = time(); + } } sub main { - find( - { - no_chdir => 1, - wanted => \&process_db, - }, - $perlvar{'lonUsersDir'} - ); + my $dir = $perlvar{'lonUsersDir'}.'/temp/y/'; + print("Doing $dir\n"); + &find({ no_chdir => 1, + wanted => \&count_db, }, + $dir); + print("Found $count db to do\n"); + $last_100_start_time = $starttime = time(); + &find({ no_chdir => 1, + wanted => \&process_db, }, + $dir); + } &main();