On Mon, Apr 27, 2015, at 10:52 PM, Adam Wolk wrote: > On Mon, Apr 27, 2015, at 10:43 PM, Adam Wolk wrote: > > On Mon, Apr 27, 2015, at 10:22 PM, Todd C. Miller wrote: > > > On Mon, 27 Apr 2015 20:06:59 +0200, Adam Wolk wrote: > > > > > > > Apr 27 19:54:55 tintagel spamd[27724]: can't delete 66.111.4.25 > > > > out1-smtp.messagingengine.com <adam.w...@koparo.com> > > > > <adam.w...@tintagel.pl> from spamd db (Error 22) > > > > > > > > Does anyone know how serious that error is (should I be worried) and > > > > what might have caused it? > > > > > > Error 22 is EINVAL. I'm not sure how that can happen in this case > > > though. Have you tried restating spamd? > > > > > > > Hi Todd, > > > > Indeed I tried restarting spamd and the issue is the same each time. > > With a spamd restart the error happens immediately startup: > > > > Apr 27 22:27:52 tintagel spamd[3732]: can't delete 66.111.4.25 > > out1-smtp.messagingengine.com <adam.w...@koparo.com> > > <adam.w...@tintagel.pl> from spamd db (Error 0) > > Apr 27 22:28:51 tintagel spamd[25915]: listening for incoming > > connections. > > Apr 27 22:28:51 tintagel spamd[7233]: can't delete 66.111.4.25 > > out1-smtp.messagingengine.com <adam.w...@koparo.com> > > <adam.w...@tintagel.pl> from spamd db (Error 0) > > > > Just noticed, that right after a previous restart it's no longer Error > 22 but Error 0 > Apr 27 21:50:27 tintagel spamd[27724]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 22) > Apr 27 21:51:27 tintagel spamd[27724]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 22) > Apr 27 21:52:18 tintagel spamd[8450]: listening for incoming > connections. > Apr 27 21:52:18 tintagel spamd[20180]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 0) > Apr 27 21:52:25 tintagel spamd[6924]: listening for incoming > connections. > Apr 27 21:52:25 tintagel spamd[3732]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 0) > Apr 27 21:53:26 tintagel spamd[3732]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 0) > Apr 27 21:54:26 tintagel spamd[3732]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 0) > Apr 27 21:55:27 tintagel spamd[3732]: can't delete 66.111.4.25 > out1-smtp.messagingengine.com <adam.w...@koparo.com> > <adam.w...@tintagel.pl> from spamd db (Error 0) > > # ls -l /var/db/spamd > -rw-r--r-- 1 _spamd _spamd 6881280 Apr 27 22:51 /var/db/spamd > > here's my process output limited to spamd > # ps aux | grep -i spamd > root 30279 0.0 3.3 68000 67956 ?? Ss Sun11PM 1:22.68 perl: > /usr/local/bin/spamd -d -u _spamdaemon -P (perl) > _spamdaemon 10621 0.0 0.4 68016 8872 ?? S Sun11PM 0:00.59 > perl: spamd child (perl) > _spamdaemon 29838 0.0 0.4 68016 8936 ?? S Sun11PM 0:00.83 > perl: spamd child (perl) > _spamd 7233 0.0 0.1 9860 1704 ?? Is 10:28PM 0:00.73 spamd: > (pf <spamd-white> update) (spamd) > _spamd 25915 0.0 0.3 10308 5220 ?? I 10:28PM 0:00.12 spamd: > [priv] (greylist) (spamd) > _spamd 14894 0.0 0.0 9656 1020 ?? I 10:28PM 0:00.00 spamd: > (/var/db/spamd update) (spamd) > root 30162 0.0 0.0 636 4 p7 R+ 10:52PM 0:00.00 grep > -i spamd (ksh) > # > > > > > You might also try running: > > > > > > $ spamdb | fgrep 66.111.4.25 > > > > Here is the output: > > $ spamdb | fgrep 66.111.4.25 > > WHITE|66.111.4.25|||1430096342|1430098533|1433208963|4|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<mulan...@tintagel.pl>|1430146234|1430148635|1430160634|3|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<mulan...@tintagel.pl>|1430146234|1430148635|1430160634|3|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<adam.w...@tintagel.pl>|1430142855|1430145035|1430157255|4|0 > > > > > > > > > > to see if that entry is really in the database and if so see if > > > "spamdb -d" can remove it. > > > > > > > # spamdb -d 66.111.4.25 > > # echo $? > > 0 > > # spamdb | fgrep 66.111.4.25 > > WHITE|66.111.4.25|||1430096342|1430098533|1433208963|4|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<mulan...@tintagel.pl>|1430146234|1430148635|1430160634|3|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<mulan...@tintagel.pl>|1430146234|1430148635|1430160634|3|0 > > GREY|66.111.4.25|out1-smtp.messagingengine.com|<adam.w...@koparo.com>|<adam.w...@tintagel.pl>|1430142855|1430145035|1430157255|4|0 > > > > > > > - todd > > > > > > > The weird thing is - it just started happening. I did see other weird > > issues > > like spamdb not showing any entries in short periods of time but I > > assumed > > that it was expired hosts and they always came back after a while. > > > > I did make a copy of my /var/db/spamd in case it's a corrupt db. Though > > nothing > > specific was happening with the host when the errors started. > > > > I started looking at /usr/src which makes me think the issue comes from: > > > > /usr/src/libexec/spamd/grey.c > > case DBC_DEL: > > memset(&dbk, 0, sizeof(dbk)); > > dbk.size = strlen(dbc->key); > > dbk.data = dbc->key; > > if (db->del(db, &dbk, 0)) { > > syslog_r(LOG_ERR, &sdata, > > "can't delete %s from spamd db > > (%m)", > > dbc->key); > > ret = -1; > > } > > break; > > > > which uses the hash version of db.h > > /usr/src/lib/libc/db/hash/hash.c > > > > hash_delete(const DB *dbp, const DBT *key, > > u_int32_t flag) /* Ignored */ > > { > > HTAB *hashp; > > > > hashp = (HTAB *)dbp->internal; > > if (flag && flag != R_CURSOR) { > > hashp->err = errno = EINVAL; > > return (ERROR); > > } > > if ((hashp->flags & O_ACCMODE) == O_RDONLY) { > > hashp->err = errno = EPERM; > > return (ERROR); > > } > > return (hash_access(hashp, HASH_DELETE, (DBT *)key, NULL)); > > } > > > > The line with EINVAL like you correctly pointed out. > > While here, why is flag marked as /* ignored */ and the error I'm > > hitting looks like code which verifies if that parameter was properly > > set? > > > > The if shouldn't have a way to trigger since del is passed 0 as the flag > > parameter so I'm a bit dumbfounded here. I couldn't find any other > > part of the code that could result in the exact same error message. > > > > I am trying to write a small C program to open the db file to try and > > delete > > the entry from a reduced use case - so far it's being going really slow > > to get > > a useful test case. Not sure if I will be able to whip it up in a > > reasonable time frame. > > > > Regards, > > Adam >
Here is the sample program: - https://gist.github.com/mulander/6c09065f550de4ef63c0 I'm checking if the key exists, trying to delete it and checking again. Tested on the amd64 snapshot from April 25 (the server) and my local amd64 snapshot from Apr 19. In both boxes when: char *key = "66.111.4.25"; $ ./dbtest malloc dbc malloc key dbopen before null check after dbopen Checking if the key exists key found Key deleted key found when key does't exist: char *key = "66.111.4.252"; $ ./dbtest malloc dbc malloc key dbopen before null check after dbopen Checking if the key exists key not in db can't delete from spamd db: Undefined error: 0 key not in db That's as much as I managed to whip up. You can download a copy of the spamd database I copied from my server here: - http://mulander.kewlnet.tk/spamd-test-db md5 - 4239040d57007ab243534cdad2da5268 spamd-test-db size -rw------- 1 mulander users 6.6M Apr 27 23:42 spamd-test-db I'm now stopping spamd, removing /var/db/spamd and restarting the process to see if that helps. So far after a restart there's no message but now there is of course no thing to delete from it. Regards, Adam