blob: 76b4a09e9e0259a56c8ec4420a80ff62e2985edc [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
package NonMergingIndexManager;
use base qw( Lucy::Index::IndexManager );
sub recycle { [] }
package BogusManager;
use base qw( Lucy::Index::IndexManager );
# Adds a bogus dupe.
sub recycle {
my $recyclables = shift->SUPER::recycle(@_);
if (@$recyclables) { push @$recyclables, $recyclables->[0] }
return $recyclables;
}
package main;
use Test::More tests => 16;
use Lucy::Test;
my $folder = Lucy::Store::RAMFolder->new;
my $lock_factory = Lucy::Store::LockFactory->new(
folder => $folder,
host => 'me',
);
my $lock = $lock_factory->make_lock(
name => 'angie',
timeout => 1000,
);
isa_ok( $lock, 'Lucy::Store::Lock', "make_lock" );
is( $lock->get_name, "angie", "correct lock name" );
is( $lock->get_host, "me", "correct host" );
$lock = $lock_factory->make_shared_lock(
name => 'fred',
timeout => 0,
);
is( ref($lock), 'Lucy::Store::SharedLock', "make_shared_lock" );
is( $lock->get_name, "fred", "correct lock name" );
is( $lock->get_host, "me", "correct host" );
my $schema = Lucy::Test::TestSchema->new;
$folder = Lucy::Store::RAMFolder->new;
for ( 1 .. 20 ) {
my $indexer = Lucy::Index::Indexer->new(
schema => $schema,
index => $folder,
manager => NonMergingIndexManager->new,
);
# Two big segs that shouldn't merge, then small, mergable segs.
my $reps = $_ <= 2 ? 100 : 1;
$indexer->add_doc( { content => $_ } ) for 1 .. $reps;
$indexer->commit;
}
my $num_segs = grep {m/segmeta.json/} @{ $folder->list_r };
is( $num_segs, 20, "no merging" );
my $manager = Lucy::Index::IndexManager->new;
$manager->set_folder($folder);
my $polyreader = Lucy::Index::PolyReader->open( index => $folder );
my $segment = Lucy::Index::Segment->new( number => 22 );
my $snapshot = Lucy::Index::Snapshot->new->read_file( folder => $folder );
my $deletions_writer = Lucy::Index::DefaultDeletionsWriter->new(
schema => $schema,
segment => $segment,
snapshot => $snapshot,
polyreader => $polyreader,
);
my $seg_readers = $manager->recycle(
reader => $polyreader,
cutoff => 19,
del_writer => $deletions_writer,
);
is( scalar @$seg_readers, 1, "cutoff" );
$seg_readers = $manager->recycle(
reader => $polyreader,
cutoff => 0,
del_writer => $deletions_writer,
);
is( scalar @$seg_readers,
18, "recycle lots of small segs but leave big ones alone" );
$manager->set_write_lock_timeout(1);
is( $manager->get_write_lock_timeout, 1, "set/get write lock timeout" );
$manager->set_write_lock_interval(2);
is( $manager->get_write_lock_interval, 2, "set/get write lock interval" );
$manager->set_merge_lock_timeout(3);
is( $manager->get_merge_lock_timeout, 3, "set/get merge lock timeout" );
$manager->set_merge_lock_interval(4);
is( $manager->get_merge_lock_interval, 4, "set/get merge lock interval" );
$manager->set_deletion_lock_timeout(5);
is( $manager->get_deletion_lock_timeout, 5, "set/get deletion lock timeout" );
$manager->set_deletion_lock_interval(6);
is( $manager->get_deletion_lock_interval,
6, "set/get deletion lock interval" );
my $indexer = Lucy::Index::Indexer->new(
index => $folder,
manager => BogusManager->new,
);
eval { $indexer->commit };
like( $@, qr/recycle/i, "duplicated segment via recycle triggers error" );