* [devel] вопрос про BDB и блокировки.
@ 2007-04-27 10:05 Sergey Y. Afonin
2007-04-27 10:20 ` Alexey Tourbin
2007-04-27 10:24 ` Sergey Y. Afonin
0 siblings, 2 replies; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 10:05 UTC (permalink / raw)
To: devel
Приветствую.
Нужна консультация специалиста по BDB.
Сначала в качестве какого-никакого ввода в тему.
http://lists.altlinux.org/pipermail/security-team/2007-April/000243.html
Хочется, в данной ситации, "добить" проблему с mailfromd. В документации
http://www.oracle.com/technology/documentation/berkeley-db/db/ref/lock/intro.html
утверждается, что The Lock subsystem is created, initialized, and opened by
calls to DB_ENV->open with the DB_INIT_LOCK or DB_INIT_CDB flags specified.
То есть, что встроенные блокировки в BDB начинают работать только в случае
использования флагов DB_INIT_LOCK или DB_INIT_CDB. По некоторой причине (в
эти подробноcти я не вдавался, утверждается, что не всё гладко) автор
mailfromd решил делать блокировки самостоятельно. Я, вроде как, единственный
из нарвавшихся на проблему с его блокировками. Используя метод научного тыка
и по совету человека, который кое-где bdb сам использовал, я просто убрал
блокировку (про то, что она активируется при использовании DB_INIT_LOCK или
DB_INIT_CDB, я ещё не дочитал на тот момент).
А теперь самое интересное. Оно работает с достаточно активной записью в *.db
без явного использования как самодельной, так и встроенной системы блокировок
с прошлого вечера. Процессов mailfromd сейчас, например, 1306 штук. В логах
по поводу ошибок с BDB тишина. Это везение, или есть какие-то объективные
причины для этого ?
Про неработоспособность самодельной системы блокировок тоже понять бы не
плохо. Я это могу только со скоростью обработки файловых операций связать
или с загрузкой системы...
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin
@ 2007-04-27 10:20 ` Alexey Tourbin
2007-04-27 10:38 ` Sergey Y. Afonin
2007-04-27 10:24 ` Sergey Y. Afonin
1 sibling, 1 reply; 9+ messages in thread
From: Alexey Tourbin @ 2007-04-27 10:20 UTC (permalink / raw)
To: devel
[-- Attachment #1.1: Type: text/plain, Size: 1734 bytes --]
On Fri, Apr 27, 2007 at 03:05:09PM +0500, Sergey Y. Afonin wrote:
> Хочется, в данной ситации, "добить" проблему с mailfromd. В документации
> http://www.oracle.com/technology/documentation/berkeley-db/db/ref/lock/intro.html
> утверждается, что The Lock subsystem is created, initialized, and opened by
> calls to DB_ENV->open with the DB_INIT_LOCK or DB_INIT_CDB flags specified.
> То есть, что встроенные блокировки в BDB начинают работать только в случае
> использования флагов DB_INIT_LOCK или DB_INIT_CDB. По некоторой причине (в
DB_INIT_CDB дает "прозрачный" локинг для каждой операции.
То есто операция начинается берётся блокировка. Операция заканчивает
блокировка снимается.
DB_INIT_LOCK по идее специально указывать не надо, если указано
DB_INIT_CDB|DB_INIT_MPOOL.
Там есть ещё другой режим вместо локинга, он log может писать.
> эти подробноcти я не вдавался, утверждается, что не всё гладко) автор
> mailfromd решил делать блокировки самостоятельно. Я, вроде как, единственный
> из нарвавшихся на проблему с его блокировками. Используя метод научного тыка
> и по совету человека, который кое-где bdb сам использовал, я просто убрал
> блокировку (про то, что она активируется при использовании DB_INIT_LOCK или
> DB_INIT_CDB, я ещё не дочитал на тот момент).
Вот кусок перлового кода. Тут есть две тонкости: открывать env надо
через exclusive lock, иначе там глюкало. Я это делаю через flock на
дескрипторе каталога (круто!). И ещё одна тонкость что нужно сигналы
обязательно блокировать на время взятия блокировки. Кажется, факт
блокировки фиксируется физически в самой базе. Поэтому если по
пришествии сигнала блокировку не снять, то база останется залоченной
"надолго".
[-- Attachment #1.2: cache.pm --]
[-- Type: text/plain, Size: 4355 bytes --]
package qa::cache;
use strict;
use BerkeleyDB;
our $topdir = "$ENV{HOME}/.qa-cache";
my $topdir_fd;
my $dbenv;
sub init_dbenv () {
use Fcntl qw(:flock O_DIRECTORY);
-d $topdir or mkdir $topdir;
sysopen $topdir_fd, $topdir, O_DIRECTORY or die "$topdir: $!";
if (flock $topdir_fd, LOCK_EX | LOCK_NB) {
$dbenv = BerkeleyDB::Env->new(-Home => $topdir,
-Verbose => 1, -ErrFile => *STDERR,
-Flags => DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOL)
or die $BerkeleyDB::Error;
# TODO: drop all locks
flock $topdir_fd, LOCK_SH;
}
else {
flock $topdir_fd, LOCK_SH;
$dbenv = BerkeleyDB::Env->new(-Home => $topdir,
-Verbose => 1, -ErrFile => *STDERR,
-Flags => DB_JOINENV)
or die $BerkeleyDB::Error;
}
}
my %blessed;
my $pagesize;
sub TIEHASH ($$) {
my ($class, $id) = @_;
return $blessed{$id} if $blessed{$id};
init_dbenv() unless $dbenv;
my $dir = "$topdir/$id";
-d $dir or mkdir $dir;
my $db = BerkeleyDB::Hash->new(-Filename => "$id/cache.db",
-Env => $dbenv, -Flags => DB_CREATE)
or die $BerkeleyDB::Error;
$pagesize ||= $db->db_stat->{hash_pagesize};
my $self = bless [ $dir, $db ] => $class;
$blessed{$id} = $self;
use Scalar::Util qw(weaken);
weaken $blessed{$id};
return $self;
}
use Storable qw(freeze thaw);
use Compress::LZO qw(compress decompress);
use Digest::SHA1 qw(sha1);
use constant {
V_STO => 2**1, # STO is Special Theory of Relativity
V_LZO => 2**2, # LZO is real-time compressor
};
my $today = int($^T / 3600 / 24);
sub STORE ($$$) {
my ($self, $k, $v) = @_;
$k = freeze($k) if ref $k;
$k = sha1($k);
my $vflags = 0;
if (ref $v) {
$v = freeze($v);
$vflags |= V_STO;
}
if (length($v) > 768) {
$v = compress($v);
$vflags |= V_LZO;
}
my ($dir, $db) = @$self;
if (length($v) > $pagesize / 2) {
my ($subdir, $file) = unpack "H2H*", $k;
$subdir = "$dir/$subdir";
$file = "$subdir/$file";
-d $subdir or mkdir $subdir;
open my $fh, ">", "$file.$$" or die $!;
syswrite $fh, pack("S", $vflags);
syswrite $fh, $v;
close $fh;
rename "$file.$$", $file;
}
else { # SSS: mtime, atime, vflags
$db->db_put($k, pack("SSS", $today, 0, $vflags) . $v);
}
}
sub FETCH ($$) {
my ($self, $k) = @_;
$k = freeze($k) if ref $k;
$k = sha1($k);
my ($dir, $db) = @$self;
my ($vflags, $v);
if ($db->db_get($k, $v) == 0) {
(my $m, my $a, $vflags) = unpack "SSS", $v;
substr $v, 0, 6, "";
$db->db_put($k, pack("SSS", $m, $today, $vflags) . $v)
if $a != $today; # XXX not atomic
}
else {
my ($subdir, $file) = unpack "H2H*", $k;
$subdir = "$dir/$subdir";
$file = "$subdir/$file";
open my $fh, "<", $file or return;
local $/;
$v = <$fh>;
$vflags = unpack "S", $v;
substr $v, 0, 2, "";
}
$v = decompress($v) if $vflags & V_LZO;
$v = thaw($v) if $vflags & V_STO;
return $v;
}
sub EXISTS ($$) {
my ($self, $k) = @_;
$k = freeze($k) if ref($k);
$k = sha1($k);
my ($dir, $db) = @$self;
return 1 if $db->db_get($k, my $v) == 0;
my ($subdir, $file) = unpack "H2H*", $k;
$subdir = "$dir/$subdir";
$file = "$subdir/$file";
return -f $file;
}
sub DELETE ($$) {
my ($self, $k) = @_;
$k = freeze($k) if ref($k);
$k = sha1($k);
my ($dir, $db) = @$self;
$db->db_del($k);
my ($subdir, $file) = unpack "H2H*", $k;
$subdir = "$dir/$subdir";
$file = "$subdir/$file";
unlink $file;
}
# BerkeleyDB cleans up at the END, so do I
my $global_destruction;
# execute the END when interrupted by a signal --
# it is VERY important to release all locks and shut down gracefully
use sigtrap qw(die normal-signals);
our $expire = 33;
sub DESTROY ($) {
return if $global_destruction;
my $self = shift;
my ($dir, $db) = @$self;
my $cur = $db->_db_write_cursor() or return;
if ($db->db_get("cleanup", my $cleanup) != 0) {
$db->db_put("cleanup", $today);
return;
}
elsif ($cleanup == $today) {
return;
}
while ($cur->c_get(my $k, my $v, DB_NEXT) == 0) {
next if $k eq "cleanup";
my ($m, $a, $vflags) = unpack "SSS", $v;
next if $a + 33 > $today;
next if $m + 33 > $today;
$cur->c_del();
}
my $wanted = sub {
stat or return;
-f _ and -M _ > $expire and -A _ > $expire and unlink;
-d _ and rmdir;
};
require File::Find;
File::Find::finddepth($wanted, $dir);
}
END {
undef $dbenv;
while (my ($id, $self) = each %blessed) {
next unless $self;
$self->DESTROY();
undef @$self;
}
$global_destruction = 1;
}
1;
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin
2007-04-27 10:20 ` Alexey Tourbin
@ 2007-04-27 10:24 ` Sergey Y. Afonin
1 sibling, 0 replies; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 10:24 UTC (permalink / raw)
To: ALT Devel discussion list
On Friday 27 April 2007, Sergey Y. Afonin wrote:
> Процессов mailfromd сейчас, например, 1306 штук. В логах по поводу ошибок
> с BDB тишина. Это везение, или есть какие-то объективные причины для этого ?
Забыл добавить. Это Compact 3.0, db4.3-4.3.28-alt1
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 10:20 ` Alexey Tourbin
@ 2007-04-27 10:38 ` Sergey Y. Afonin
2007-04-27 11:02 ` Alexey Tourbin
2007-04-27 11:19 ` Alexey Tourbin
0 siblings, 2 replies; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 10:38 UTC (permalink / raw)
To: devel
On Friday 27 April 2007, Alexey Tourbin wrote:
> DB_INIT_CDB дает "прозрачный" локинг для каждой операции.
> То есто операция начинается берётся блокировка. Операция заканчивает
> блокировка снимается.
>
> DB_INIT_LOCK по идее специально указывать не надо, если указано
> DB_INIT_CDB|DB_INIT_MPOOL.
>
> Там есть ещё другой режим вместо локинга, он log может писать.
Но этот другой режим - тоже режим блокировок ? Хочется понять, почему
сейчас работает, когда нет явного указания на использование блокировок.
Обязательно уже должно было несколько процессов к одной базе сунуться
и не раз. Ан нет, пашет...
> Вот кусок перлового кода. Тут есть две тонкости: открывать env надо
> через exclusive lock, иначе там глюкало. Я это делаю через flock на
> дескрипторе каталога (круто!).
Если каталог "свой", почему бы и нет. :-)
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 10:38 ` Sergey Y. Afonin
@ 2007-04-27 11:02 ` Alexey Tourbin
2007-04-27 12:00 ` Sergey Y. Afonin
2007-04-27 11:19 ` Alexey Tourbin
1 sibling, 1 reply; 9+ messages in thread
From: Alexey Tourbin @ 2007-04-27 11:02 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 1568 bytes --]
On Fri, Apr 27, 2007 at 03:38:52PM +0500, Sergey Y. Afonin wrote:
> On Friday 27 April 2007, Alexey Tourbin wrote:
>
> > DB_INIT_CDB дает "прозрачный" локинг для каждой операции.
> > То есто операция начинается берётся блокировка. Операция заканчивает
> > блокировка снимается.
> >
> > DB_INIT_LOCK по идее специально указывать не надо, если указано
> > DB_INIT_CDB|DB_INIT_MPOOL.
> >
> > Там есть ещё другой режим вместо локинга, он log может писать.
>
> Но этот другой режим - тоже режим блокировок ? Хочется понять, почему
> сейчас работает, когда нет явного указания на использование блокировок.
> Обязательно уже должно было несколько процессов к одной базе сунуться
> и не раз. Ан нет, пашет...
Скорее всего, не работает. Просто если чтение с записью
не пересекается, то это, может быть, прокатывает. Ну или там один в
базу записал а другой старую копию базы видит, и это работает, пока
постраничные данные не перезаписаны.
Режима два разных: либо блокировать всю базу (ну или там постранично),
либо писать write-ahead log (это транзакции, там сложнее уже). Либо
блокировать своими средствами.
Делайте как у меня, лучше пока ничего не придумано. :) Похожим образом
сделано в /usr/sbin/amavisd, только там BerkeleyDB::Env->new ничем не
блокируется. По-моему при одновременных попытках инициализировать evn
будет капут.
При использовании логинкга или DB_INIT_CDB очень важно сигналы правильно
заблокировать. /usr/share/doc/db-4.4.20/ref/program/appsignals.html
К сожалению в перле это делается проще чем в C.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 10:38 ` Sergey Y. Afonin
2007-04-27 11:02 ` Alexey Tourbin
@ 2007-04-27 11:19 ` Alexey Tourbin
2007-04-27 11:40 ` Sergey Y. Afonin
1 sibling, 1 reply; 9+ messages in thread
From: Alexey Tourbin @ 2007-04-27 11:19 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 533 bytes --]
On Fri, Apr 27, 2007 at 03:38:52PM +0500, Sergey Y. Afonin wrote:
> Но этот другой режим - тоже режим блокировок ? Хочется понять, почему
> сейчас работает, когда нет явного указания на использование блокировок.
> Обязательно уже должно было несколько процессов к одной базе сунуться
> и не раз. Ан нет, пашет...
Если процесс всего один (одновременно работает с базой), то блокировать
ничего не надо. Это у вообще демон что ли или нет?
Давайте ка посерьезнее. Где git репоазитарий и над каким кодом идет
медитация?
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 11:19 ` Alexey Tourbin
@ 2007-04-27 11:40 ` Sergey Y. Afonin
0 siblings, 0 replies; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 11:40 UTC (permalink / raw)
To: devel
On Friday 27 April 2007, Alexey Tourbin wrote:
> > Но этот другой режим - тоже режим блокировок ? Хочется понять, почему
> > сейчас работает, когда нет явного указания на использование блокировок.
> > Обязательно уже должно было несколько процессов к одной базе сунуться
> > и не раз. Ан нет, пашет...
>
> Если процесс всего один (одновременно работает с базой),
Я писал в начале: "Процессов mailfromd сейчас, например, 1306 штук".
Это фильтр для sendmail.
> то блокировать ничего не надо. Это у вообще демон что ли или нет?
Демон, размножающийся по одной копии на каждое принимаемое сообщение.
> Давайте ка посерьезнее. Где git репоазитарий и над каким кодом идет
> медитация?
git-а нет, есть svn: "svn checkout http://svn.gnu.org.ua/sources/mailfromd/trunk"
Вообще автор не склонен пока переходить на блокировку из BDB. Про
причины могу попробовать распросить более подробно. Хотя вот Олман
для MeTA1 таскает за собой отдельную патченную db-4.3.28.NC, а в
sendmail тоже пользовался самописными блокировками...
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 11:02 ` Alexey Tourbin
@ 2007-04-27 12:00 ` Sergey Y. Afonin
2007-04-27 12:07 ` Sergey Y. Afonin
0 siblings, 1 reply; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 12:00 UTC (permalink / raw)
To: devel
On Friday 27 April 2007, Alexey Tourbin wrote:
> Скорее всего, не работает. Просто если чтение с записью не пересекается,
Обязаны пересекаться. И чтение, и запись, и всё вместе. Там для обрабатываемых
E-Mail пишутся и читаются данные по проверка отправителей, грейлистинг, лимиты,
DNS-кэш и т.п., а поток сообщений обрабатывается, если вот за сейчас посмотреть
с 4:00, 3.6 сообщений в секунду, а бывают провалы и пики. Максимум за сегодня
22 сообщения в секунду.
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки.
2007-04-27 12:00 ` Sergey Y. Afonin
@ 2007-04-27 12:07 ` Sergey Y. Afonin
0 siblings, 0 replies; 9+ messages in thread
From: Sergey Y. Afonin @ 2007-04-27 12:07 UTC (permalink / raw)
To: ALT Devel discussion list
On Friday 27 April 2007, Sergey Y. Afonin wrote:
> Максимум за сегодня 22 сообщения в секунду.
То есть, это значит, что 22 процесса mailfromd начали работать с базой
в пределах одной секунды. Возможно, что они не все писали (грейлистинг
избирательный, доменные имена в кэше могли быть и т.п.).
--
С уважением, Сергей Афонин
asy@altlinux.ru
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-04-27 12:07 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin
2007-04-27 10:20 ` Alexey Tourbin
2007-04-27 10:38 ` Sergey Y. Afonin
2007-04-27 11:02 ` Alexey Tourbin
2007-04-27 12:00 ` Sergey Y. Afonin
2007-04-27 12:07 ` Sergey Y. Afonin
2007-04-27 11:19 ` Alexey Tourbin
2007-04-27 11:40 ` Sergey Y. Afonin
2007-04-27 10:24 ` Sergey Y. Afonin
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git