About session disconnect and an slow response some time later

"egoitz via Info" <[email protected]>
Newsgroups gmane.mail.imap.cyrus
Message-ID <[email protected]>
Good morning, 

I wrote to the list some time ago due to this topic. I have noted that
when a user asks to disconnect his/her sessions (imap sessions normally
the disconnected ones) after some time like an hour or a half an hour
passes I start having some slow responses to new connections. I have
monitored them and it's slightly intermittent, KO and OK of server
responding alert in less than 3 seconds. This intermittency lasts like
10 minutes and later the response delays increase. Obviously for avoid
bigger service outages I stop and start Cyrus and all works fine later. 

I have been trying to figure why it could be happening because I have
seen it only happens when I launch TERM for a disconnection to several
imap proccesses (the user that requested proccesses). It doesn't happen
at the moment. As said for instance yesterday happened when an hour
passed of the disconnection. 

I don't have prefork param set in cyrus.conf, so... Cyrus spawns on
demand. After doing some examinations my theory is that perhaps Cyrus is
not calling spawn_service() every time gets needed. I would say it
should happen in master.c : 

2610               if (!in_shutdown && Services[i].exec &&
2611                    Services[i].nactive < Services[i].max_workers &&
2612                    Services[i].ready_workers == 0 &&
2613                    y >= 0 && FD_ISSET(y, &rfds))
2614                {
2615                    /* huh, someone wants to talk to us */
2616                    spawn_service(i);
2617                } 

I think that perhaps ready_workers is not properly decremented when I
launch this TERM and perhaps this causes Cyrus not to spawn any new more
services of the kind of the terminated service. As yesterday happened in
a more or less peak accesses hour it needed to have more services
spawned but... as it seen ready_workers not to be 0 for that service...
it didn't spawn new more services and as consequence, connections
started becoming queued in being accepeted awaiting that happened when a
proccess gets idle because it's client has disconnected or idled timeout
or imap timeout happened.... 

So, I was wondering if in reap_child() for the states
SERVICE_STATE_UNKNOWN and SERVICE_STATE_BUSY shouldn't be decremented
the ready_workers in the service struct... Concretely in master.c in : 

1121                case SERVICE_STATE_BUSY:
1122                    s->nactive--;
1123                   if (!in_shutdown && failed) {
1124                       syslog(LOG_DEBUG,
1125                               "service %s/%s pid %d in BUSY state:
"
1126                               "terminated abnormally",
1127                               SERVICEPARAM(s->name),
1128                               SERVICEPARAM(s->familyname), pid);
1129                    }
1130                    break;
1131
1132                case SERVICE_STATE_UNKNOWN:
1133                    s->nactive--;
1134                   syslog(LOG_WARNING,
1135                           "service %s/%s pid %d in UNKNOWN state:
exited",
1136                           SERVICEPARAM(s->name),
1137                           SERVICEPARAM(s->familyname), pid); 

Obviously, another possible solution is to specify prefork in cyrus.conf
but I'd rather avoid wasting memory when it's not needed... 

What's your opinion mates?. Or what do you think Ellie, Bron :) . Have
you ever seen something like it?. 

Cheers!
------------------------------------------
Cyrus: Info
Permalink: https://cyrus.topicbox.com/groups/info/Td155a4c12885169a-M40a67d2023ec1d884ee57a39
Delivery options: https://cyrus.topicbox.com/groups/info/subscription
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.