Automatically create a new partition if the current one doesn't have

enough free space.
This commit is contained in:
hjp 2013-11-26 21:33:11 +00:00
parent d360ae4722
commit 2bc5967e10
1 changed files with 23 additions and 0 deletions

View File

@ -104,6 +104,8 @@ sub new {
RaiseError => 1 RaiseError => 1
} }
); );
$self->{instances_part_size} = 10_000_000;
$self->adjust_partitions;
} elsif ($opt->{tokyocabinet}) { } elsif ($opt->{tokyocabinet}) {
my $tdb = $self->{tdb} = TokyoCabinet::TDB->new(); my $tdb = $self->{tdb} = TokyoCabinet::TDB->new();
$tdb->open($opt->{tokyocabinet}, $tdb->WRITER, $tdb->OCREAT) $tdb->open($opt->{tokyocabinet}, $tdb->WRITER, $tdb->OCREAT)
@ -799,6 +801,27 @@ sub store_file {
return $success; return $success;
} }
sub adjust_partitions {
my ($self) = @_;
my $dbh = $self->{dbh};
my $database = $dbh->selectrow_array("select database()");
my $max_id = $dbh->selectrow_array("select max(id) from instances");
my ($max_part, $limit)
= $dbh->selectrow_array(
"select partition_ordinal_position, partition_description
from information_schema.partitions
where table_schema='$database' and table_name='instances'
order by partition_ordinal_position desc
limit 1");
while ($max_id + $self->{instances_part_size} > $limit) {
$max_part++;
$limit += $self->{instances_part_size};
my $partition_name = sprintf("p%03d", $max_part);
$dbh->do("alter table instances add partition (partition $partition_name values less than ($limit))");
$self->log(3, "added partition $partition_name < $limit");
}
}
sub DESTROY { sub DESTROY {
my ($self) = @_; my ($self) = @_;
$self->{dbh}->disconnect(); $self->{dbh}->disconnect();