Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Samba и лимит на 200 сокетов  (Прочитано 2370 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hober

  • Автор темы
  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Samba и лимит на 200 сокетов
« : 18 Февраля 2008, 09:42:46 »
Samba 3.0.28 в качестве контроллера. В пиковый момент, когда количество юзверей достигает набольшего числа - винбинд падает, в логах:
Цитировать

winbindd[18367]:   winbindd: Exceeding 200 client connections, no idle connection found

Ну думаю ладно, изменил WINBINDD_MAX_SIMULTANEOUS_CLIENTS на 500 - таже хрень. Поставил 2000 - пишет в логах:

Цитировать
PANIC: assert failed at nsswitch/winbindd.c(394)

Пока поставили рестарт винбинда каждые 5 минут, но это сами понимаете не выход.

У кого нибудь предположения есть?

Пока на ум приходить только одно - увеличить значение до 500 ( пока не будет ругаться в логах )  и уменьшить таймаут, по которому юзвери будут отваливаться. Тут же следом появляется вопрос - где можно уменьшить этот таймаут:))
« Последнее редактирование: 18 Февраля 2008, 09:56:51 от hober »

Оффлайн hober

  • Автор темы
  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Samba и лимит на 200 сокетов
« Ответ #1 : 18 Февраля 2008, 17:06:53 »
В общем нарыл по поводу таймаута, патчим:

Цитировать
Index: nsswitch/winbindd_dual.c
===================================================================
--- nsswitch/winbindd_dual.c   (revision 23422)
+++ nsswitch/winbindd_dual.c   (working copy)
@@ -96,6 +96,7 @@
    struct winbindd_request *request;
    struct winbindd_response *response;
    void (*continuation)(void *private_data, BOOL success);
+   struct timed_event *reply_timeout_event;
    void *private_data;
 };
 
@@ -160,8 +161,38 @@
            async_request_sent, state);
 }
 
+/****************************************************************
+ Handler triggered if the child winbindd doesn't respond within
+ a given timeout.
+****************************************************************/
+
+static void async_request_timeout_handler(struct event_context *ctx,
+               struct timed_event *te,
+               const struct timeval *now,
+               void *private_data)
+{
+   struct winbindd_async_request *state =
+      talloc_get_type_abort(private_data, struct winbindd_async_request);
+
+   /* Deal with the reply - set to error. */
+
+   async_reply_recv(private_data, False);
+
+   /*
+    * Close the socket to the child. Should cause the
+    * child to exit.
+    */
+
+   DEBUG(0,("async_request_timeout_handler: child pid %u is not responding. "
+      "Closing connection to it.\n",
+      state->child->pid ));
+
+   winbind_child_died(state->child->pid);
+}
+
 static void async_request_sent(void *private_data_data, BOOL success)
 {
+   uint32_t timeout = 30;
    struct winbindd_async_request *state =
       talloc_get_type_abort(private_data_data, struct winbindd_async_request);
 
@@ -180,6 +211,33 @@
           &state->response->result,
           sizeof(state->response->result),
           async_reply_recv, state);
+
+   /*
+    * Normal timeouts are 30s, but auth requests may take a long
+    * time to timeout.
+    */
+
+   if (state->request->cmd == WINBINDD_PAM_AUTH ||
+         state->request->cmd == WINBINDD_PAM_AUTH_CRAP ) {
+
+      timeout = 300;
+   }
+
+   /*
+    * Set up a timeout of 1 minute for the response.
+    * If we don't get it close the child socket and
+    * report failure.
+    */
+
+   state->reply_timeout_event = event_add_timed(winbind_event_context(),
+                     NULL,
+                     timeval_current_ofs(timeout,0),
+                     "async_request_timeout",
+                     async_request_timeout_handler,
+                     state);
+   if (!state->reply_timeout_event) {
+      smb_panic("async_request_sent: failed to add timeout handler.\n");
+   }
 }
 
 static void async_reply_recv(void *private_data, BOOL success)
@@ -188,6 +246,10 @@
       talloc_get_type_abort(private_data, struct winbindd_async_request);
    struct winbindd_child *child = state->child;
 
+   if (state->reply_timeout_event) {
+      TALLOC_FREE(state->reply_timeout_event);
+   }
+
    state->response->length = sizeof(struct winbindd_response);
 
    if (!success) {


На багзиле этот баг с 2005-го года висит, так и не пофиксили. Обидно. А баг уж очень критичный.

 

Страница сгенерирована за 0.045 секунд. Запросов: 20.