Postgresql не выполняет определенный запрос один раз после перезагрузки Windows



Я использую Postgresql на Windows в приложении C#. Проблема, с которой я столкнулся, действительно странная и может быть описана следующим образом:




  • я перезапускаю Windows

  • я запускаю программу

  • один конкретный запрос не выполняется: SELECT COUNT(*) AS c FROM files WHERE total_bytes IS NOT NULL

  • я снова запускаю программу, и все работает нормально


Странные заметки:




  • я попытался сделать другой запрос перед этим (даже используя ту же таблицу), и это сработало: SELECT COUNT(*) AS c FROM files

  • я не смог воспроизвести ошибку перезапуск Postgresql. Это происходит только при перезагрузке Windows. И это случается только один раз.


Обратная трассировка исключений:



Npgsql.NpgsqlException: Exception while reading from stream

at Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts)
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadExpecting[T]()
at Npgsql.NpgsqlDataReader.NextResultInternal()
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Npgsql.NpgsqlCommand.ExecuteReader()
at DriveShare.Database.Postgresql.ExecuteQuery(NpgsqlCommand command) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 216
at DriveShare.Database.Postgresql.Query(String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 72
at DriveShare.Database.Postgresql.QueryOne(String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 83
at DriveShare.Database.Postgresql.QueryValue(String key, String sql, Object[] args) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 97
at DriveShare.Database.Postgresql.QueryValue(String key, String sql) in c:projetosdriveshareclientDriveShareDriveShareDatabasePostgresql.cs:line 92
at DriveShare.Database.FileIndexDataSet.CountIndexedFiles() in c:projetosdriveshareclientDriveShareDriveShareDatabaseFileIndexDataSet.cs:line 89
at DriveShare.Engine.DriveShareEngine.Start() in c:projetosdriveshareclientDriveShareDriveShareEngineDriveShareEngine.cs:line 156
at DriveShareWebService.Program.Main(String[] args) in c:projetosdriveshareclientDriveShareDriveShareWebServiceProgram.cs:line 19


Поскольку я должен поддерживать работу программы, я написал обходной путь, чтобы приложение повторило этот запрос, прежде чем продолжить. Я этим не горжусь:

public void WaitForConnection()
{
int limitSeconds = 3 * 60;
var start = DateTime.Now;
while (true)
{
try
{
Log.WaitingForDatabaseConnection();
Query("SELECT COUNT(*) AS c FROM files WHERE total_bytes IS NOT NULL");
Log.DatabaseConnectionAquired();
break;
}
catch (Exception e)
{
var wastedTime = DateTime.Now - start;
if (wastedTime.TotalSeconds > limitSeconds)
throw;
else
Log.Exception(e);
}
Thread.Sleep(1000);
}
}


Я использую Npgsql (в классе тонкой абстракции) для подключения к Postgresql. Журналы Postgresql показывают некоторые записи об ошибках winsock, которые я еще не понимаю:



2016-08-16 10:14:34 BRT LOG:  database system was shut down at 2016-08-16 10:12:07 BRT
2016-08-16 10:14:34 BRT FATAL: the database system is starting up
2016-08-16 10:14:34 BRT LOG: MultiXact member wraparound protections are now enabled
2016-08-16 10:14:34 BRT LOG: sistema de banco de dados está pronto para aceitar conexões
2016-08-16 10:14:34 BRT LOG: autovacuum launcher started
2016-08-16 10:17:16 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:17:27 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:17:27 BRT STATEMENT: SELECT path FROM files
2016-08-16 10:17:27 BRT FATAL: connection to client lost
2016-08-16 10:17:27 BRT STATEMENT: SELECT path FROM files
2016-08-16 10:17:27 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:17:27 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:17:33 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:25:14 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:25:15 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:25:15 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:26:30 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:26:30 BRT FATAL: connection to client lost
2016-08-16 10:26:50 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:26:50 BRT FATAL: connection to client lost
2016-08-16 10:26:50 BRT LOG: could not receive data from client: unrecognized winsock error 10053
2016-08-16 10:26:50 BRT LOG: unexpected EOF on client connection with an open transaction
2016-08-16 10:27:06 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:27:06 BRT FATAL: connection to client lost
2016-08-16 10:27:06 BRT LOG: could not send data to client: unrecognized winsock error 10054
2016-08-16 10:27:06 BRT FATAL: connection to client lost
2016-08-16 10:27:30 BRT LOG: pedido de desligamento rápido foi recebido
2016-08-16 10:27:30 BRT LOG: interrompendo quaisquer transações ativas
2016-08-16 10:27:30 BRT LOG: autovacuum launcher shutting down
2016-08-16 10:27:30 BRT ERROR: canceling statement due to user request
2016-08-16 10:27:30 BRT LOG: autovacuum launcher shutting down
2016-08-16 10:27:30 BRT LOG: shutting down
2016-08-16 10:27:30 BRT LOG: database system is shut down


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

1381   1  

1 ответ:

С некоторой помощью я нашел решение в Npgsql docs, здесь.

Npgsql по умолчанию поставляется с некоторыми параметрами таймаута для соединения и команд. После перезагрузки Windows, первый доступ к таблице был очень медленным, вызывая тайм-аут команды.

С дополнительными параметрами в строке подключения я смог изменить эти настройки выше и решить свою проблему:

connectionString += ";Timeout=180;Command Timeout=180";

Бонусный совет : функция Postgresql pg_sleep(seconds) помогла мне воспроизвести проблему без фактических перезагрузок. Очень полезно:

SELECT pg_sleep(60);

Comments

    Ничего не найдено.