Looking into Imap util.c code I saw that names are stopped at a "." for the hash function and this is not in the rehash utility, so I patched a bit again the tool and now it works as expected. Here is my patch: --- cyrus-imapd-2.4.14/tools/rehash 2012-03-12 12:47:51.000000000 +0100 +++ cyrus-imapd-2.4.14.patched/tools/rehash 2012-03-14 19:41:51.076296523 +0100 @@ -127,10 +127,12 @@ my $name = shift; my $uint32 = (2**32); my ($h, $n); + my $stname; if ($tofull) { + ($stname) = split(/\./, $name); $n = 0; - foreach my $b (split(/ */, $name)) { + foreach my $b (split(//, $stname)) { $n = ((($n << 3) ^ ($n >> 5)) % $uint32) ^ ord($b); } $h = chr(ord('A') + ($n % 23)); @@ -146,10 +148,12 @@ sub dir_hash_c_64 { my $name = shift; my ($h, $n); + my $stname; if ($tofull) { + ($stname) = split(/\./, $name); $n = Math::BigInt->new(0); - foreach my $b (split(/ */, $name)) { + foreach my $b (split(//, $stname)) { $n = (($n << 3) ^ ($n >> 5)) ^ ord($b); } $h = chr(ord('A') + ($n % 23)); @@ -194,7 +198,7 @@ $sievedir = $1; print "you are using $sievedir as your sieve directory.\n"; } - if (/^virtdomains:\s+(1|t|yes|on)/) { + if (/^virtdomains:\s+(1|t|yes|on|userid)/) { $virtdomains = 1; print "i will deal with virtual domains.\n"; } @@ -344,8 +348,8 @@ } unless ($tonone) { foreach $i (@{$old}) { - if (opendir SUB, $i) { - while ($s = readdir SUB) { + if (opendir SUBMVDM, $i) { + while ($s = readdir SUBMVDM) { if ($s =~ /^\./s) { next; } chdir "$i/$s"; @@ -372,7 +376,7 @@ rename ("$h_32/$s", "$h_64/$s") or ouch "couldn't move $s back!"; } } - closedir SUB; + closedir SUBMVDM; rmdir "$i" or die "couldn't remove $i"; } } -------- Original Message -------- Subject: Re: Cyrus IMAP 2.4.14 released From: Carlos Velasco <carlos.velasco@xxxxxxxxxxxxxxxx> To: info-cyrus@xxxxxxxxxxxxxxxxxxxx Cc: cyrus-devel@xxxxxxxxxxxxxxxxxxxx Date: Wed Mar 14 2012 19:13:43 GMT+0100 > In a Linux LFS Pure 64 (no 32 libs) upgrading from 2.4.13 to 2.4.14 with > fulldirhash: 1 and hashimapspool: 1 trigger the "System I/O error". > > If I am right, previous to the long long patch this system was hashed in > 32 and now in 2.4.14 it is looking for indexes in hash64. > > So I tried to use rehash to convert to basic and then to full to > recreate in hash64. > First I had to patch the rehash tool a bit as it was lacking virtdomains > switch "userid" and also there was a reutilization of the SUB opendir > handle leading to nasty "invalid dirhandle" errors. > > But the real problem is that hashing of "rehash" utility does not match > the used in cyrus imap. > > Rehash: > domain moving k/kaka.com to N/kaka.com > moving n/newipnet.com to T/newipnet.com > moving n/nimastelecom.com to G/nimastelecom.com > moving p/prueba.com to T/prueba.com > > Cyrus imap 2.4.14: > open("/imap/part1/domain/S/nimastelecom.com/C/user/carlos^velasco/cyrus.index", > O_RDWR) = -1 ENOENT (No such file or directory) > open("/imap/part1/domain/U/newipnet.com/C/user/carlos^velasco/cyrus.index", > O_RDWR) = -1 ENOENT (No such file or directory) > > Using the formula in rehash utility: > === > require Math::BigInt; > > my $name = "newipnet.com"; > > $n = Math::BigInt->new(0); > foreach my $b (split(/ */, $name)) { > $n = (($n << 3) ^ ($n >> 5)) ^ ord($b); > } > $h = chr(ord('A') + ($n % 23)); > print $h; > === > Output: T > > But Cyrus Imap 2.4.14 is trying to get it into U in my case. > > So, I think rehash utility is broken really. > > > --- cyrus-imapd-2.4.14/tools/rehash 2012-03-12 12:47:51.000000000 +0100 > +++ cyrus-imapd-2.4.14.patched/tools/rehash 2012-03-14 > 18:59:20.001558956 +0100 > @@ -194,7 +194,7 @@ > $sievedir = $1; > print "you are using $sievedir as your sieve directory.\n"; > } > - if (/^virtdomains:\s+(1|t|yes|on)/) { > + if (/^virtdomains:\s+(1|t|yes|on|userid)/) { > $virtdomains = 1; > print "i will deal with virtual domains.\n"; > } > @@ -344,8 +344,8 @@ > } > unless ($tonone) { > foreach $i (@{$old}) { > - if (opendir SUB, $i) { > - while ($s = readdir SUB) { > + if (opendir SUBMVDM, $i) { > + while ($s = readdir SUBMVDM) { > if ($s =~ /^\./s) { next; } > > chdir "$i/$s"; > @@ -372,7 +372,7 @@ > rename ("$h_32/$s", "$h_64/$s") or ouch > "couldn't move $s back!"; > } > } > - closedir SUB; > + closedir SUBMVDM; > rmdir "$i" or die "couldn't remove $i"; > } > } > ---- Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/