Mysql broken pipe error



error 32 broken pipe #224

Comments

shafiul commented Mar 18, 2014

My app is using PyMySQL for a SQLAlchemy powered application. I’m getting this error quite a lot.

Can you please advise any suggestions?

PyMySQL installed by pip: PyMySQL (0.6.1)

I’ve been using PyMySQL for a Tornado and Celery app and running in two linux servers, both having the same problems.

Trace:

I’ve been using supervisor to run a celery program. Following command is used to start the application:

!/bin/bash

NAME=»phoenix_celery» # Name of the application
APPDIR=/webapps/phoenix/src # App directory
SOCKFILE=/webapps/phoenix/run/gunicorn.sock # we will communicte using this unix socket
USER=phoenix # the user to run as
GROUP=webapps # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn

echo «Starting $NAME as whoami «

Activate the virtual environment

cd $APPDIR
source ../bin/activate
export PYTHONPATH=$APPDIR:$PYTHONPATH

Create the run directory if it doesn’t exist

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec celery worker —app=scheduling -l info

The text was updated successfully, but these errors were encountered:

kux commented Mar 19, 2014

Broken pipe usually means that the remote peer has abruptly shut down the connection (RST packet).

There might be multiple causes for this:

  • firewalls between you and the server that drop connections
  • server shutting down the connection due to a bad query or various other reasons

If this is not a networking issue then the server might send relevant information before shutting down the connection. PyMySQL doesn’t always capture that information.

I had a situation where my queries were too large. The MySQL server was responding me with the proper error code (#1153) and was then shutting down the connection. PyMySQL wasn’t capturing the error code. It just raised Broken Pipe . In order to figure out what was actually going on I had to use Wireshark and look at the actual packets. Wireshark has a nice MySQL dissector which makes it very easy to sniff the packets.

Источник

db operation fails with «broken pipe» instead of reconnecting transparently after server restart #870

Comments

fho commented May 27, 2019 •

I’m using lib/pq v1.1.1, go 1.12.5, Linux 4.19.45-1-lts.

I have a db handler on that I run >=1 operations, restart the db-server and wait until the startup finished, the next query fails if all the previous TCP connections of the Operation System to the database were closed in the meantime ( ss -na | grep 5432′ shows nothing).
The operation fails with: write tcp [::1]:45676->[::1]:5432: write: broken pipe .
If another query is done after the failed one, it succeeds.

I expect that the db.Exec() query succeeds after the postgresql restart finished and the sql package or pq driver retries and reconnects transparently if needed in the background.

If the postgresql-server restart happens quickly while they are still TCP connections in FIN-WAIT-2 or another state, the db operations after the postgres restart succeeds.

Читайте также:  Internal error false ошибка принтера

How to reproduce:

  • run docker run -p 5432:5432 postgres:latest
  • run in another terminal https://gist.github.com/fho/777ccc77971612f3659cbdf5cef27ede
    pass as command-line argument postgresql://postgres@localhost?sslmode=disable
  • Press q to do a sql query
  • Shutdown the postgres server by pressing ctrl + c in the terminal
  • check watch -n 0.5 «sh -c ‘ss -na |grep 5432» , wait until the TCP connections vanished
  • start postgres again: run docker run -p 5432:5432 postgres:latest
  • press q in the terminal that runs the go program to trigger another query => it fails

My first idea for a fix was to return ErrBadConn on broken pipe errors but like discussed in #422 this has the issue that operations might be redone.

The mysql driver seems to solve it by having a custom error type to indicate retryable connection errors.
If a Write() on the tcp socket failed before a whole SQL statements was send, it’s safe to retry the operation.
The caller of conn.send() could decide it and set error to ErrBadConn .

The text was updated successfully, but these errors were encountered:

Источник

db operation fails with «broken pipe» instead of reconnecting transparently after server restart #870

Comments

fho commented May 27, 2019 •

I’m using lib/pq v1.1.1, go 1.12.5, Linux 4.19.45-1-lts.

I have a db handler on that I run >=1 operations, restart the db-server and wait until the startup finished, the next query fails if all the previous TCP connections of the Operation System to the database were closed in the meantime ( ss -na | grep 5432′ shows nothing).
The operation fails with: write tcp [::1]:45676->[::1]:5432: write: broken pipe .
If another query is done after the failed one, it succeeds.

I expect that the db.Exec() query succeeds after the postgresql restart finished and the sql package or pq driver retries and reconnects transparently if needed in the background.

If the postgresql-server restart happens quickly while they are still TCP connections in FIN-WAIT-2 or another state, the db operations after the postgres restart succeeds.

How to reproduce:

  • run docker run -p 5432:5432 postgres:latest
  • run in another terminal https://gist.github.com/fho/777ccc77971612f3659cbdf5cef27ede
    pass as command-line argument postgresql://postgres@localhost?sslmode=disable
  • Press q to do a sql query
  • Shutdown the postgres server by pressing ctrl + c in the terminal
  • check watch -n 0.5 «sh -c ‘ss -na |grep 5432» , wait until the TCP connections vanished
  • start postgres again: run docker run -p 5432:5432 postgres:latest
  • press q in the terminal that runs the go program to trigger another query => it fails

My first idea for a fix was to return ErrBadConn on broken pipe errors but like discussed in #422 this has the issue that operations might be redone.

The mysql driver seems to solve it by having a custom error type to indicate retryable connection errors.
If a Write() on the tcp socket failed before a whole SQL statements was send, it’s safe to retry the operation.
The caller of conn.send() could decide it and set error to ErrBadConn .

Читайте также:  Error authenticating to server status 7

The text was updated successfully, but these errors were encountered:

Источник

Errno 32 Broken pipe в Python – Ошибка ввода-вывода

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

В данном руководстве мы обсудим [Errno 32] Broken pipe в Python, известное сообщение об ошибке, которое мы часто видим при взаимодействии с файловой системой. Мы разберем причину ее возникновения, а также способы ее избежать и исправить в коде.

Что вызывает “[Errno 32] Broken pipe” в Python?

«Сломанный канал» обычно считается ошибкой IOError (сокращение от «Ошибка ввода-вывода»), которая произошла на уровне системы Linux. Обычно она возникает при чтении и записи файлов или, другими словами, при выполнении ввода / вывода файлов или сетевого ввода / вывода (через сокеты).

Эквивалентная системная ошибка Linux – EPIPE, взятая из кодов ошибок GNU libc.

Макрос: int EPIPE

“Broken pipe.” означает, что на другом конце конвейера нет считывания процесса. Каждая функция библиотеки, вызывающая код ошибки, также выдает сигнал SIGPIPE; этот сигнал завершает программу, если не обрабатывается или не блокируется. Следовательно, программа никогда не отобразит EPIPE до тех пор, пока она не обработает или не заблокирует SIGPIPE.

Из приведенного выше утверждения мы можем сделать вывод, что система, отправляющая сигнал SIGPIPE, вызывает ошибку [Errno 32] Broken pipe в механизме межпроцессного взаимодействия Linux.

Например, система Linux внутренне использует другой сигнал, называемый SIGINT. В Linux команда Ctrl + C отправит сигнал SIGINT, чтобы завершить процесс, или мы можем использовать команду kill для достижения того же эффекта.

Python по умолчанию не игнорирует SIGPIPE. Однако он преобразует сигнал в исключение и вызывает ошибку – IOError: [Errno 32] Сломанный канал каждый раз, когда он получает SIGPIPE.

Ошибка “сломанный канал” при подключении к терминалу Linux

Всякий раз, когда мы сталкиваемся с ошибкой [Errno 32] Broken pipe при попытке передать вывод скрипта Python другой программе, например:

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

Когда нисходящий поток не должен читать данные восходящего потока? Давайте разберемся в этом на примере. Команда head в этом примере должна прочитать достаточно строк, чтобы сообщить восходящему потоку, что нам больше не нужно его читать, и она отправит сигнал SIGPIPE процессу восходящего потока.

Всякий раз, когда восходящий процесс является программой Python, возникает ошибка типа IOError: [Errno 32] Broken pipe.

Как избежать ошибки “сломанный канал”?

Если мы не заботимся о правильном перехвате SIGPIPE и нам нужно быстро запустить процесс, вставьте следующий фрагмент кода в начало программы Python.

В приведенном выше фрагменте кода мы перенаправили сигналы SIGPIPE на стандартный SIG_DFL, который система обычно игнорирует.

Однако рекомендуется остерегаться руководства Python по библиотеке сигналов, чтобы предостеречь от такой обработки SIGPIPE.

Перехват IOError во избежание ошибки Broken pipe

Поскольку ошибка Broken pipe является ошибкой IOError, мы можем разместить блок try / catch, чтобы ее перехватить, как показано в следующем фрагменте кода:

Читайте также:  Mssql error log file

В приведенном выше фрагменте кода мы импортировали модуль sys и errno и разместили блок try / catch, чтобы перехватить возникшее исключение и обработать его.

Возможное решение проблемы в многопроцессорной программе

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

Большое количество рабочих процессов может конфликтовать друг с другом при попытке взять под контроль ресурсы системы или разрешение на запись на диск.

Источник

Broken Pipe Error in Python

In this article, we will discuss Pipe Error in python starting from how an error is occurred in python along with the type of solution needed to be followed to rectify the error in python. So, let’s go into this article to understand the concept well.

With the advancement of emerging technologies in the IT sector, the use of programming language is playing a vital role. Thus the proper language is considered for the fast executions of the functions. In such a case, Python emerges as the most important language to satisfy the needs of the current problem execution because of its simplicity and availability of various libraries. But along with the execution, the errors during the execution also comes into existence and it becomes difficult for the programmers to rectify the errors for the processing of the problem.

The Emergence of Broken Pipe Error

A broken Pipe Error is generally an Input/Output Error, which is occurred at the Linux System level. The error has occurred during the reading and writing of the files and it mainly occurs during the operations of the files. The same error that occurred in the Linux system is EPIPE, but every library function which returns its error code also generates a signal called SIGPIPE, this signal is used to terminate the program if it is not handled or blocked. Thus a program will never be able to see the EPIPE error unless it has handled or blocked SIGPIPE.

Python interpreter is not capable enough to ignore SIGPIPE by default, instead, it converts this signal into an exception and raises an error which is known as IOError(INPUT/OUTPUT error) also know as ‘Error 32’ or Broken Pipe Error.

Broken Pipe Error in Python terminal

This pipeline code written above will create a process that will send the data upstream and a process that reads the data downstream. But when the downstream process will not be able to read the data upstream, it will raise an exception by sending SIGPIPE signal to the upstream process. Thus upstream process in a python problem will raise an error such as IOError: Broken pipe error will occur.

Источник

Оцените статью
toolgir.ru
Adblock
detector