Соединение P4 python прервало ошибку SSL

Я уже использую клиент P4V, и все в порядке, никаких ошибок подключения.

Ошибка: у меня возникают некоторые ошибки SSL, когда я пытаюсь выполнить команду p4 из Python. И это случайно, если я повторно запускаю скрипт, ошибка не возникает каждый раз

От клиента вывод:

Ошибка получения SSL.\nчтение: Операция выполнена успешно: WSAECONNRESET

Из журналов на стороне сервера у меня есть:

Соединение с 90.XX.XX.93:53929 прервано. Получение SSL не удалось. чтение: сброс соединения по узлу: сброс соединения по узлу

После le P4 Connection с p4.connect() я запускаю команду p4.run_trust(), и результат кажется нормальным.

Доверие уже установлено

Эта ошибка возникает при выполнении p4 fetch из p4 edit myfile

Конфигурация

Я запускаю свой скрипт Python с того же компьютера, на котором работает клиент P4V. Я использую ту же конфигурацию (пользователь, рабочая область, url+port > ssl:p4.our-url.domain:1666). Ошибка SSL произошла с запуском клиента P4V или без него. SSL-сертификат был создан во время установки и настройки Perforce Server. За нашим поддоменом p4.our-domain нет сервера apache, поэтому я не могу проверить SSL-сертификат с помощью онлайн-проверки SSL (мои сетевые знания там достигают своего предела)

Когда я делаю p4 info, появляется «адрес равноправного узла», в основном мой IP со случайно сгенерированным портом (53929). Что это за порт? Нужно ли устанавливать фиксированный порт и перенаправлять на мой компьютер, на котором запущен скрипт?

У вас есть идеи, откуда эта ошибка? Это плохая конфигурация сервера (странно, потому что каждый клиент p4v в офисе работает). Нужно ли устанавливать и распространять новый сертификат для всех пользователей скрипта P4Python?

Питон 3.5.4

PyOpenssl 18.0.0

P4Python 2017.2.1615960

Большое спасибо за любой совет.

ОТВЕТ, предложенный Сэмом Стаффордом

Сэм был прав, кажется, у меня тайм-аут. Я открывал соединение P4 и подключался к серверу при запуске скрипта, затем запускалась обработка для создания файлов перед использованием p4 fetch/add/submit. Вот обходной путь для повторного подключения в случае отключения от сервера

# self.myp4 = P4() was created on init, files are added
submited = False
maxTry = 5
while not submited and maxTry > 0:
     try:
         reslist = self.p4.run_submit(ch)
     except P4Exception as p4e:
         print(str(self.p4.errors))
         self.myp4.disconnect()
         maxTry -= 1
         self.myp4.connect()

     submited = reslist is not None and len(reslist) > 0

Это работает, если вы хотите сохранить соединение открытым. Я предполагаю, что лучший способ избежать тайм-аута - это вызвать метод P4.connect() непосредственно перед любым P4.run_*method*() и закрыть его после. Вместо того, чтобы ждать тайм-аута, чтобы перезапустить соединение.


person Marcassin    schedule 17.07.2018    source источник


Ответы (1)


«Соединение сброшено узлом» — это ошибка TCP.

Что означает сброс соединения по узлу?

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

person Samwise    schedule 17.07.2018
comment
Я уже видел эту ошибку TCP, но не знал, что это та же самая ошибка. Я попробую ваше решение и вернусь к вам. Спасибо - person Marcassin; 17.07.2018
comment
Я сделал свой тест, и вы были правы, уловив ошибку и повторно установив соединение, чтобы устранить проблему. Я обновил свой вопрос с кодом и идеями. Большое спасибо ! - person Marcassin; 18.07.2018
comment
Как вы заметили, закрытие соединения после того, как вы закончите выполнение команд, является идеальным решением. На самом деле у вас может закончиться нехватка сокетов на сервере, если каждый клиент держит открытыми соединения, которые он не использует, поэтому некоторые администраторы настраивают свою сеть на автоматическое уничтожение неиспользуемых соединений. - person Samwise; 18.07.2018
comment
Забавный факт: P4V раньше держал свои соединения открытыми как можно дольше, и в конечном итоге было исправлено автоматическое закрытие любого соединения, которое он не использовал, через пару секунд, чтобы избежать непреднамеренного DDOS-атаки на сервер. Это ошибка, которую допускают многие разработчики клиентов p4 в своих первых приложениях. :) - person Samwise; 18.07.2018