Можно ли сделать LMDB одновременно доступным для записи при определенных c обстоятельствах? - PullRequest
2 голосов
/ 19 января 2020

MDB_NOLOCK, как описано в mdb_env_open () apido c:

MDB_NOLOCK Не делать никакой блокировки. Если ожидается одновременный доступ, вызывающая сторона должна управлять всем параллельным доступом. Для правильной работы вызывающая сторона должна применять семантику одного записывающего и должна гарантировать, что никакие читатели не используют старые транзакции, пока записывающее устройство активно. Самый простой подход состоит в том, чтобы использовать эксклюзивную блокировку, чтобы никакие считыватели не могли быть активными вообще, когда начинающий писатель.

  1. Что если RW txnA намеревается изменить набор ключей, который не имеет общий ключ с другим набором ключей, который другой RW txnB намеревается изменить? Разве они не могут быть отправлены одновременно?
  2. Не является ли semanti c для одного автора расточительным для таких ситуаций? Поскольку один txn ожидает, пока предыдущий завершит sh, даже если они намерены работать в совершенно разных регионах в среде lmdb.
  3. В среде, открытой с помощью MDB_NOLOCK, что если клиентское приложение вычисляет в области доменов, что две транзакции записи предназначены для RW для взаимоисключающего набора ключей в любом месте среды lmdb, и в любом случае отправляет только такие транзакции одновременно? Что может go не так?
  4. Может ли такая одновременная запись масштабироваться линейно с ядрами? Как RO TXNS делать? Учитывая, что приложение может управлять этими одновременными записями, как описано в 3.

1 Ответ

0 голосов
/ 30 апреля 2020
  1. Нет, поскольку изменение пар ключ / значение требует также изменения структуры b-дерева, и две транзакции будут конфликтовать друг с другом.

  2. Вы должны Избегайте длительных вычислений в середине транзакции записи. Постарайтесь сделать как можно больше заранее. Если вы не можете сделать это, то LMDB может не подойти для вашего приложения. Хотя обычно вы можете.

  3. Очень плохие вещи. Сбои приложения и повреждение БД.

  4. Записи обычно связаны с вводом-выводом и в любом случае не масштабируются со многими ядрами. Есть несколько очень хакерских вещей, которые вы можете сделать с помощью LMDB writemap и / или pwrite (2), но вы здесь очень одиноки.

...