Ошибка в клиринг
Atom
04.10.2011
FiNick


Во время клиринга вылетает огромное колличество ошибок "Ошибка проверки потока репликации. Код -2147184638", описание "P2ERR_SERV_NO_SERVICE", пока не переполнится стек. Источник ошибки:```csharp () => // pollAction { if (Streams.Count == 0 && _streamsToRemove.Count == 0) _sleepInterval.Sleep();

Streams.SyncDo(c =>
{
	foreach (var stream in Streams)
	{
		try
		{
			stream.CheckConnection(_connection);
		}
		catch (COMException e)
		{
			System.Diagnostics.Trace.WriteLine("stream.CheckConnection(_connection) - COMException " + e.ErrorCode.ToString());
			Error.SafeInvoke(new PlazaException("Ошибка проверки потока репликации.", e));
		}
	}
});
В методе stream.CheckConnection(_connection), вызывается DataStream.Open(connection);, что и дает ошибку.

Теги:


Спасибо:


< 1 2 3 4  >
FiNick

Фотография
Дата: 05.10.2011
Ответить


Alexander Mukhanchikov: По ночам лучше спать :) Вот именно!=) Все равно не работает, верни return, либо поменяй Func на Action

Спасибо:

Alexander

Фотография
Дата: 05.10.2011
Ответить


FiNick:

Alexander Mukhanchikov: По ночам лучше спать :) Вот именно!=) Все равно не работает, верни return, либо поменяй Func на Action

недокоммитил. у себя проверял - работает.

Спасибо:

FiNick

Фотография
Дата: 05.10.2011
Ответить


Протестил. В клиринг приложение не падает, но вот после клиринга перестал обновляться стакан, пришлось переконнектиться

Спасибо:

Alexander

Фотография
Дата: 05.10.2011
Ответить


FiNick: Протестил. В клиринг приложение не падает, но вот после клиринга перестал обновляться стакан, пришлось переконнектиться

Тоже самое и после торгов. Пока хз в чём дело. Если будут идеи после анализа исходников PlazaTrader - пишите.

Спасибо:

FiNick

Фотография
Дата: 05.10.2011
Ответить


Похоже ошибку будет сложно отследить, т.к. клиринг просто так посреди дня несколько раз не воспроизвести.

Я смотрел логи, в начале клиринга по потоку FORTS_FUTAGGR5_REPL вылетает 'SERV:NO_SERVICE', затем через несколько секунд Stream opening started;stream 0x53183F0,type 1,name 'FORTS_FUTAGGR5_REPL'. То есть поток переоткрывается похоже, наверное в методе CheckConnection, если я ничего не путаю. Потом в логах он больше не фигурирует весь клиринг и после клиринга тоже

Кстати, замечание в РТС сделали, надо исправить: Закрывать потоки надо до закрытия соединения, а не пытаться сделать это после: 2011-10-05 19:03:13.921;p2repl-cli;;CLOSE message posted;stream 0x5415360 2011-10-05 19:03:13.921;p2repl-cli;error;p2err 24579=0x6003 - 'MQ:NOT_CONNECTED_YET';Couldn't post CLOSE message;stream 0x5415360

Спасибо:

Alexander

Фотография
Дата: 05.10.2011
Ответить


FiNick: Похоже ошибку будет сложно отследить, т.к. клиринг просто так посреди дня несколько раз не воспроизвести.

Я смотрел логи, в начале клиринга по потоку FORTS_FUTAGGR5_REPL вылетает 'SERV:NO_SERVICE', затем через несколько секунд Stream opening started;stream 0x53183F0,type 1,name 'FORTS_FUTAGGR5_REPL'. То есть поток переоткрывается похоже, наверное в методе CheckConnection, если я ничего не путаю. Потом в логах он больше не фигурирует весь клиринг и после клиринга тоже

Кстати, замечание в РТС сделали, надо исправить: Закрывать потоки надо до закрытия соединения, а не пытаться сделать это после: 2011-10-05 19:03:13.921;p2repl-cli;;CLOSE message posted;stream 0x5415360 2011-10-05 19:03:13.921;p2repl-cli;error;p2err 24579=0x6003 - 'MQ:NOT_CONNECTED_YET';Couldn't post CLOSE message;stream 0x5415360

Так и делается, разве нет?

		protected override void OnDisconnect()
		{
			// Иначе при выгрузке в StopStream будет срабатывать исключение.
			if (IsExportRunning)
				StopExport();

			_connectionPool.Disconnect();

			System.Diagnostics.Trace.WriteLine("OnDisconnect");
		}

По поводу стаканов - в клиринг они присылают StreamDatumDeleted, надо как-то его обработать правильно.

P.S. Я так пару багов с инициализацией инструмента подправил

Спасибо:

FiNick

Фотография
Дата: 05.10.2011
Ответить


Alexander Mukhanchikov: Так и делается, разве нет?

	protected override void OnDisconnect()
	{
		// Иначе при выгрузке в StopStream будет срабатывать исключение.
		if (IsExportRunning)
			StopExport();

		_connectionPool.Disconnect();

		System.Diagnostics.Trace.WriteLine("OnDisconnect");
	}

А StopExport() здесь останавливает выполенение и дожидается пока все потоки будут закрыты?
Я так понимаю закрытие потоков непосредственно выполняется в pollAction, может так получается, что дисконнект и закрытие потоков происходит параллельно.

На счет стаканов РТС написали:
"Как я понял, по вашему времени клиринг с 17-45 до 18-30 ? После него оба агреггированных потока приходили успешно вплоть до самого закрытия приложения."
что собственно я и видел в логах. Возможно это у нас косяк
Спасибо:

Alexander

Фотография
Дата: 05.10.2011
Ответить


FiNick:

Alexander Mukhanchikov: Так и делается, разве нет?

	protected override void OnDisconnect()
	{
		// Иначе при выгрузке в StopStream будет срабатывать исключение.
		if (IsExportRunning)
			StopExport();

		_connectionPool.Disconnect();

		System.Diagnostics.Trace.WriteLine("OnDisconnect");
	}
> 
> А StopExport() здесь останавливает выполенение и дожидается пока все потоки будут закрыты?
> Я так понимаю закрытие потоков непосредственно выполняется в pollAction, может так получается, что дисконнект и закрытие потоков происходит параллельно.
> 
> На счет стаканов РТС написали:
> "Как я понял, по вашему времени клиринг с 17-45 до 18-30 ? После него оба агреггированных потока приходили успешно вплоть до самого закрытия приложения."
> что собственно я и видел в логах. Возможно это у нас косяк


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

FiNick

Фотография
Дата: 05.10.2011
Ответить


Специальное уведомление StreamDatumDeleted присылается сервером по каждой таблице в начале синхронизации. Это уведомление означает «данных с ревиженами меньше указанного, на сервере нет». «Безбазовый» клиент должен удалить все данные с ревиженами, меньшими указанного в уведомлении из своего хранилища.

У нас же «базовый» клиент, там вроде само все делается, или я не прав? Плюс у нас в коде OnStreamDatumDeleted есть, там что-то делается

Спасибо:

FiNick

Фотография
Дата: 05.10.2011
Ответить


Протрассировал дисконнект:

protected override void OnDisconnect()
{
	// Иначе при выгрузке в StopStream будет срабатывать исключение.
	if (IsExportRunning)
		StopExport();

	_connectionPool.Disconnect();
	System.Diagnostics.Trace.WriteLine("OnDisconnect");
}

Там получается, что StopExport() никого не дожидается. _connectionPool.Disconnect() и Close всех потоков происходит параллельно, понятно, что Disconnect раньше происходит, и в лог ошибки сыплются. Поставил после StopExport() слип на пару секунд, все норм стало, но это грубо и некрасиво. Нужно AutoResetEvent какой-нибудь прикрутить или что-то подбное

Спасибо:
< 1 2 3 4  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy