Страниц: [1]
  Печать  
Автор Тема: Write ставит процесс в reply на NFSfsys  (Прочитано 6171 раз)
Ag
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Июня 05, 2003, 09:11:00 pm »

Соеденил два компьютера через NFS. Все в порядке, но при обрыве сети функция write ставит процесс на клиенте в reply на NFSfsys. Подскажите, пожалуйста, как обработать эту ситуацию.

[ Это Сообщение было отредактировано: Ag в 2003-06-05 18:20 ]
Записан
avs
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Июня 05, 2003, 10:52:00 pm »


Ag пишет:
Соеденил два компьютера через NFS. Все в порядке, но при обрыве сети функция write ставит процесс на клиенте в reply на NFSfsys. Подскажите, пожалуйста, как обработать эту ситуацию.
</font>


Простой (но не дающий 100% гарантии) способ - предварять каждый write() вызовом open() и завершать вызовом close().
Более надежный, но муторный способ - перед вызовов write() взводить таймер, а в вызываемом по таймеру обработчике предусмотреть "переоткрывание" файла.
Не знаю, поддерживает ли NFS nonblocking opens, но можно попробовать что-то типа:
if(fd==-1)
{
....
fd=open(...,...|O_NONBLOCK,...);
....
}
if((fd!=-1)&&(write(fd,...,size)!=size))
{
close(fd);
fd=-1;
}
Записан
Ag
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Июня 06, 2003, 12:19:00 am »

NONBLOCK уже пробовал - не получилось.
Можно было бы применить таймер с обработчиком, который выводит из функции write. Вопрос как.


[ Это Сообщение было отредактировано: Ag в 2003-06-05 22:14 ]
Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 261


Просмотр профиля
« Ответ #3 : Июня 06, 2003, 12:55:00 pm »


Ag пишет:
NONBLOCK уже пробовал - не получилось.
Можно было бы применить таймер с обработчиком, который выводит из функции write. Вопрос как.


[ Это Сообщение было отредактировано: Ag в 2003-06-05 22:14 ]

как обычно - заводишь таймер, который тебя потом снимает с write() c ошибкой EINTR. Только в этом случае будет много накладных расходов (установ таймера, запись, отключение таймера).
в простейшем случае:

alarm(1);
write(fd, buff, len);
alarm(0);

Записан
Ag
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #4 : Июня 06, 2003, 09:38:00 pm »

как обычно - заводишь таймер, который тебя потом снимает с write() c ошибкой EINTR. Только в этом случае будет много накладных расходов (установ таймера, запись, отключение таймера).
в простейшем случае:

alarm(1);
write(fd, buff, len);
alarm(0);


[/quote]

Попробовал в точности. Несколько раз выходил из write, причем каждый новый вызов write создает новый NFSfsys! А потом мой процесс переходит в SIGBL, из-за того что SIGALRM пришел, когда процесс был в replay к NFSfsys.
NFSfsys стоит в replay к TCP/IP, нельзя ли как-нибудь настроить timeout в TCP/IP.
Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 261


Просмотр профиля
« Ответ #5 : Июня 06, 2003, 11:06:00 pm »


Попробовал в точности. Несколько раз выходил из write, причем каждый новый вызов write создает новый NFSfsys! А потом мой процесс переходит в SIGBL, из-за того что SIGALRM пришел, когда процесс был в replay к NFSfsys.
NFSfsys стоит в replay к TCP/IP, нельзя ли как-нибудь настроить timeout в TCP/IP.

tcprt какой версии?
Как вариант - попробуй перейти на UDP, если работаешь на TCP (Я имею в виду пересадить nfs с TCP на UDP).
Записан
Ag
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #6 : Июня 07, 2003, 02:50:00 pm »


tcprt какой версии?
Как вариант - попробуй перейти на UDP, если работаешь на TCP (Я имею в виду пересадить nfs с TCP на UDP).


TCP/IP version 5.0
Пересадка на UDP мне видится проблематичной, потому как NFS-сервер стоит на windows.

Есть вариант выйти из write и не заходить пока сеть не восстановится, но тогда как это определить? Может следить за ,блокированием NFSfsys, тогда как получить его pid?
Посоветуйте, пожалуйста.

[ Это Сообщение было отредактировано: Ag в 2003-06-08 15:40 ]
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #7 : Июня 09, 2003, 11:25:00 am »


TCP/IP version 5.0
Пересадка на UDP мне видится проблематичной, потому как NFS-сервер стоит на windows.

Дык, это его родная среда ... во фре до сих пор выходят обновления/фиксы для работы по TCP ... так что однозначно на UDP.
Записан

Страниц: [1]
  Печать  
 
Перейти в: