Блокировка файла для обновления одного раздела данных или всего содержимого файла - PullRequest
1 голос
/ 02 мая 2019

У меня есть файл, который можно обновить из нескольких процессов, поэтому я хочу использовать блокировку и нашел https://github.com/gofrs/flock, который может помочь

Но я думаю, что эта проблема немного сложнее, например, для обновления файла, необходимого API для чтения файла / раздела ранее (мы предоставляем API для чтения file или application объектов name)
Получите данные json, измените их в памяти и обновите файл.

Существует два варианта:

  1. обновление всего содержимого файла
  2. обновление раздела в файле, т.е. один свойства приложения

Проблема выглядит следующим образом:


 1. Process A & Process B (can be more…) Reads the object  of
    application name  `node1`

 2. Process A update the section (node1) with new data (for example
        change the kind property and update)

 3. Process B want to do the same , the problem is that between the time
        it reads the data and the time it wants to update ,the data is not
        valid since other process already update it.

кроме того, тот же сценарий действителен для всего контекста файла

Race условие вопроса…

Это краткий пример файла, который некоторые процессы stateless могут обновить в любой момент

ID: demo
version: 0.0.1

applications:
 - name: node1
   kind: html5
   path: node1
   expose:
    - name: node_api
      properties:
         url: ${app-url}


 - name: node2
   kind: nodejs
   path: node2
   parameters:
      quota: 256M
      memory: 256M

Как мы можем преодолеть эту проблему или, возможно, упростить ее, чтобы избежать расы и сговора?

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Мой совет в комментариях остается в силе: описанный вами сценарий использования обычно реализуется базами данных. Они были разработаны для решения этой проблемы.

Однако, если у вас есть для использования этого файла YAML, вы можете реализовать свою операцию записи следующим образом:

  1. создать блокировку.
  2. обновить , прочитав файл.
  3. выполнить изменения в памяти.
  4. записать обратно в файл.
  5. снять блокировку.

Это гарантирует, что устаревшие данные не обновляются.

1 голос
/ 02 мая 2019

Это распространенная проблема, поэтому ищите известные решения.Например, оптимистическая блокировка.

Примерно так: псевдокод:

lock file for read
read file into data1
release file lock
hash data1 as hash1
update data1
lock file for update
read file into data2
hash data2 as hash2
if hash1 != hash2
    release file lock
    return error
write file from (updated) data1
release file lock
return success
1 голос
/ 02 мая 2019

Для решения этой проблемы может быть несколько подходов.

1) Использование блокировок
Вы можете создать блокировку чтения-записи.Если процесс хочет только прочитать файл, он может получить блокировку чтения.Если процесс хочет записи, он получает блокировку записи, и другие процессы должны ждать, пока блокировка записи не будет снята.

Использование версий
Вы можете сохранить счетчикдля отслеживания версии.Блокировка по-прежнему потребуется в этом подходе также для записи в файл.

Начальная версия 1.
Процесс B читает файл, видит версию 1.
Процесс A читает файл, видит версию 1,перед записью увеличивает версию до 2, а затем обновляет файл.
Так что теперь процесс B перед записью будет сравнивать версии.Поскольку его версия (версия 1) меньше текущей (версия 2), ему придется прервать / повторить свою работу.

Процесс должен обновлять файл, только если содержимое файла совпадает с тем, что он прочитал.Вы можете достичь этого так, как предложил peterSO в своем ответе.

...