68 lines
2 KiB
Perl
Executable file
68 lines
2 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
# This code was forked from the LiveJournal project owned and operated
|
|
# by Live Journal, Inc. The code has been modified and expanded by
|
|
# Dreamwidth Studios, LLC. These files were originally licensed under
|
|
# the terms of the license supplied by Live Journal, Inc, which can
|
|
# currently be found at:
|
|
#
|
|
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
|
|
#
|
|
# In accordance with the original license, this code and all its
|
|
# modifications are provided under the GNU General Public License.
|
|
# A copy of that license can be found in the LICENSE file included as
|
|
# part of this distribution.
|
|
|
|
use strict;
|
|
BEGIN {
|
|
require "$ENV{LJHOME}/cgi-bin/ljlib.pl";
|
|
}
|
|
|
|
use Gearman::Worker;
|
|
use Storable;
|
|
use LJ::Worker::Gearman;
|
|
use LJ::Directory::Search;
|
|
use LJ::UserSearch;
|
|
use LJ::UserSearch::MetaUpdater;
|
|
|
|
my $mtime = init_memory_datastructure();
|
|
gearman_decl("directory_search" => \&dir_search);
|
|
gearman_set_idle_handler(\&idle);
|
|
gearman_work(save_result => 1);
|
|
|
|
sub idle {
|
|
$mtime = LJ::UserSearch::MetaUpdater::update_users($mtime);
|
|
}
|
|
|
|
sub dir_search {
|
|
my $job = shift;
|
|
my $args = eval { Storable::thaw($job->arg) } || [];
|
|
die "Got error: $@" if $@;
|
|
|
|
my $dir = $args;
|
|
my @constraints = $dir->constraints;
|
|
return undef unless scalar @constraints;
|
|
|
|
my $results = $dir->search_no_dispatch($job);
|
|
|
|
return Storable::nfreeze($results);
|
|
}
|
|
|
|
sub init_memory_datastructure {
|
|
my $file = $LJ::USERSEARCH_METAFILE_PATH;
|
|
my $size = -s $file;
|
|
my $filemtime = (stat($file))[9];
|
|
die "Refusing to start until '$file' exists and has nonzero size" unless $size;
|
|
|
|
LJ::UserSearch::reset_usermeta($size);
|
|
open (my $fh, $file) or die;
|
|
my $buf;
|
|
my $pushed = 0;
|
|
my $rv;
|
|
while ($rv = sysread($fh, $buf, 256*1024)) {
|
|
LJ::UserSearch::add_usermeta($buf, $rv);
|
|
$pushed += $rv;
|
|
}
|
|
die "Error reading file: $!" unless defined $rv;
|
|
die "Didn't read all file" unless $pushed == $size;
|
|
return $filemtime;
|
|
}
|