Получить согласованный вид файлов / каталогов для чтения - PullRequest
0 голосов
/ 05 апреля 2019

Допустим, у меня есть два процесса.Одним из них является постоянная запись данных в файлы в каталоге (для обсуждения, скажем, это файлы журнала), где новый файл запускается очень часто.Один из файлов - это текущий «активный» файл, в который атомарно записываются новые данные каждую секунду или около того.«Живой» файл всегда будет в чистом состоянии.

Второй процесс считывает данные из файлов в каталоге, включая «живой» файл.Допустим, ему нужно несколько раз прочитать файлы, но опять же необходимо «замороженное» согласованное представление файлов, включая живой файл.Несмотря на то, что «живой» файл обновляется во время выполнения процесса чтения, как только читатель начинает чтение из файла, он должен видеть его таким, каким он был при его запуске (как если бы новых записей не было).

К сожалению, процессы чтения и записи происходят из сторонних библиотек, которые я не могу реально изменить.Мне нужно найти способ координировать два процесса в моем приложении и заставить их хорошо играть вместе.

Мое приложение (которое запускает процессы чтения и записи сторонних библиотек) написано на Java и работает наUbuntu Linux.

Моя идея: я ищу что-то аналогичное транзакции базы данных с согласованным чтением, но для файловой системы.

Вопросы:

  1. ВLinux, есть ли способ достичь этого, возможно, с помощью какой-то специальной ссылки «непротиворечивого чтения» на каталог, содержащий файлы?И тогда я мог бы либо «обновить» специальную символическую ссылку, чтобы она «видела» обновления с момента последнего обновления, либо удалить ее и создать новое?
  2. Есть ли способ сделать что-то подобное в Java /Scala?

Я хочу сделать что-то вроде:

public String launchReaderWithConsistenData(String folderPath) {
  ConsistentFolder consistentDataFolder = OS.getConsistentReferenceTo(folderPath);
  String readData = ThirdPartyLibrary.readSomeData(consistentDataFolder.getPath());
  consistentDataFolder.release();
  return readData;
}

Конечно, "ConsistentFolder" и "getConsistentReferenceTo ()" это вещи, которые я придумал, но я надеюсь, чточто-то похожее на них существует, где если ThirdPartyLibrary.readSomeData () читает из файлов несколько раз, он всегда будет получать одни и те же данные, даже если данные в исходной папке folderPath обновляются между ними.

Кроме указанных вышеЕдинственная другая идея, которую я имею, - это создавать новую физическую копию каталога для каждого читателя вызовов, но я боюсь, что это будет неэффективно, так как файлы будут очень большими.

...