Ошибка слишком много открытых файлов с rethinkdb

Я использовал драйвер golang, предоставленный https://github.com/dancannon/gorethink. Насколько я понимаю, я никогда не закрываю соединение и не подключаюсь повторно. Я не могу закрыть соединение, потому что я не знаю, как установить соединение. Что я знаю, как получить сеанс, и начинаю думать, что не знаю, как правильно получить сеанс.

Итак, мой вопрос:

  1. Как исправить ошибку?
  2. Как закрыть соединение и снова подключиться?

РЕДАКТИРОВАТЬ:

@OneOfOne Не какой-то, в основном весь связанный код:

// How i define session:
session, e := r.Connect(r.ConnectOpts{
    Address:  "localhost:28015",
    Database: "database",
    MaxActive: 0,
    MaxIdle: 0,
    // IdleTimeout: time.Minute,
})
//
// Inserting
inserts := map[string]interface{}{"something": something, "something1": something1, "something2": something2}
r.Db("database").Table("table").Insert(inserts).RunWrite(session)
//
// Updating
r.Db("database").Table("table").Filter(map[string]interface{}{"parameter": parameter}).Update(map[string]interface{}{"something" : somethingMore}).RunWrite(session)
//
// Get some row
row, e := r.Db("database").Table("table").Filter(map[string]interface{}{"parameter": parameter}).RunRow(session)
if e!= nil {
    //error
}

@neumino: вот что выходит, когда я нажимаю ulimit -a

└─ $ ▶ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30419
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30419
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Я не знаю, слишком ли это низко или слишком высоко.

@VonC: Это одна из вещей, которых я не понимаю, я не вижу, как соединение находится внутри пула:

//http://godoc.org/github.com/dancannon/gorethink#Pool
type Pool struct {
    Session *Session

    // Maximum number of idle connections in the pool.
    MaxIdle int

    // Maximum number of connections allocated by the pool at a given time.
    // When zero, there is no limit on the number of connections in the pool.
    MaxActive int

    // Close connections after remaining idle for this duration. If the value
    // is zero, then idle connections are not closed. Applications should set
    // the timeout to a value less than the server's timeout.
    IdleTimeout time.Duration
    // contains filtered or unexported fields
}

Или я просто неправильно понял, что такое пул или что такое соединение (или даже что такое сеанс)?


person Joni Atif    schedule 12.07.2014    source источник
comment
Покажите нам небольшой пример того, что вы сделали.   -  person OneOfOne    schedule 12.07.2014
comment
Сеанс может находиться в SessionStore (как в github.com/ Lanciv/GoGradeAPI/blob/ с использованием github.com/Lanciv /GoGradeAPI/blob/master/store/defaultStore.go). Соединения находятся в пуле (godoc.org/github.com/dancannon/gorethink#Pool), но SessionStore должен получить правильный сеанс и закрыть его (rethink_test должен закрыть только один: github.com/dancannon/gorethink/blob/   -  person VonC    schedule 12.07.2014
comment
Где вы: а) инициализируете пул сеансов? init()? main(), а потом передавать? Это глобалка? Здесь поможет лучшее понимание вашей кодовой базы.   -  person elithrar    schedule 13.07.2014
comment
@elithrar Является ли пул сеансов session, e := r.Connect(r.ConnectOpts{})? Я инициализирую это в main(), а затем передаю его функции вставки/обновления/получения в качестве одного из параметров. Это не глобальная переменная. В основном, как в здесь   -  person Joni Atif    schedule 13.07.2014
comment
Да, это выглядит нормально для меня. Вы страдаете от проблем, когда работаете в режиме параллелизма/стресс-тестирования?   -  person elithrar    schedule 14.07.2014


Ответы (1)


Вы можете сначала посмотреть на свой текущий лимит, может быть, он чрезмерно низкий? Запустите ulimit -a, чтобы увидеть настройки

Если вам нужно увеличить количество открытых файлов, вы можете запустить ulimit -n <number of open files>.

Я не вижу никакой очевидной проблемы в вашем файле defaultStore.go. Курсор закрывается, и соединение должно быть разорвано. Я бегло взглянул на ваш код, и не похоже, что вы создаете ненужные сеансы/пул, поэтому я не уверен, в чем проблема (или, может быть, я что-то пропустил?).

person neumino    schedule 12.07.2014