Ошибка в клиринг

Ошибка в клиринг
Atom
10/4/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);, что и дает ошибку.

Tags:


Thanks:


< 1 2 3 4  >
Alexander

Avatar
Date: 10/6/2011
Reply


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

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

У нас безбазовый клиент. И это как раз не делается.

Thanks:

FiNick

Avatar
Date: 10/6/2011
Reply


Например сделать так: В PlazaTrader'e


public override void StopExport()
{
	lock (_stopExportLock)
	{
		_streamManager._stopStreamLock.Reset();
		if (!IsExportRunning)
			return;

		StopStream();
		base.StopExport();

		_streamManager._stopStreamLock.WaitOne();
		System.Diagnostics.Trace.WriteLine("Export stopped");
	}
}

В PlazaStreamManager'e

internal readonly AutoResetEvent _stopStreamLock = new AutoResetEvent(false);

_streamsToRemove.SyncDo(c =>
{
     foreach (var stream in _streamsToRemove)
     {
          try
          {
               stream.Close();
          }
          catch (COMException e)
          {
               System.Diagnostics.Trace.WriteLine("stream.Close() - COMException " + e.ErrorCode.ToString());
               Error.SafeInvoke(new PlazaException("Ошибка закрытия потока репликации.", e));
          }
     }

     _streamsToRemove.Clear();
     _stopStreamLock.Set();
});

Или еще избавиться от _stopExportLock и написать так:


public override void StopExport()
{
	_streamManager._stopStreamLock.WaitOne();	
	_streamManager._stopStreamLock.Reset();
	if (!IsExportRunning)
		return;

	StopStream();
	base.StopExport();

	_streamManager._stopStreamLock.WaitOne();
	System.Diagnostics.Trace.WriteLine("Export stopped");	
}
Thanks: Alexander

FiNick

Avatar
Date: 10/6/2011
Reply


Alexander Mukhanchikov: У нас безбазовый клиент. И это как раз не делается.

А как дела с другими фичами, StreamLifeNumChanged например?

Thanks:

Alexander

Avatar
Date: 10/6/2011
Reply


FiNick:

Alexander Mukhanchikov: У нас безбазовый клиент. И это как раз не делается.

А как дела с другими фичами, StreamLifeNumChanged например?

см. private void OnStreamLifeNumChanged(CP2DataStream stream, int lifeNum) в PlazaStream.cs

Thanks:

Alexander

Avatar
Date: 10/6/2011
Reply


Стаканы после клиринга поправил вроде. Если есть возможность - протестируйте сегодня в клиринг, у меня не факт что удастся.

Thanks:

Alexander

Avatar
Date: 10/6/2011
Reply


По коду выше немного не понял для чего нужен _streamManager._stopStreamLock.Reset();.

Thanks:

FiNick

Avatar
Date: 10/6/2011
Reply


Alexander Mukhanchikov: По коду выше немного не понял для чего нужен _streamManager._stopStreamLock.Reset();. Чтобы быть уверенным, что перед началом остановки потоков _stopStreamLock находится в закрытом состоянии, т.е. что вызов WaitOne точно остановит выполнение.

я на самом деле никогда с такими штуками не работал, могу ошибаться.

Thanks:

Alexander

Avatar
Date: 10/6/2011
Reply


Фикс с удалением, к сожалению, не помог. Чего-то не так с ревизиями всё равно.

Thanks:

FiNick

Avatar
Date: 10/6/2011
Reply


Alexander Mukhanchikov: Фикс с удалением, к сожалению, не помог. Чего-то не так с ревизиями всё равно. Да, действительно. Тут еще такая проблемка: до клиринга выставил заявку, ушел с ней на клиринг. Теперь она висит активной, не могу снять, перезапускал и робота и раутер все равно висит. Запускаю SimpleGUI, там нет этой заявки.

И еще вот что мне РТС написал: По приложенному логу видно, что накапливается очередь сообщений в первые секунды работы. 2011-10-06 16:45:47.234;p2mq-cli;;New message added to recvList. Size: 38 Это приводит к задержкам в получении данных, поэтому предлагается побороться с очередями. Для этого предлагается разбить получение реплики на несколько соединений, работающих в отдельных thread'ах, каждое со своим циклом выборки.

Вот еще странная фраза РТС, которая может помочь=) Используется базовый или безбазовый вариант клиента репликации? В случае безбазового клиента, какова политика обработки ошибок в потоке данных - используется ли накопленная информация для запроса данных?

Thanks:

Alexander

Avatar
Date: 10/7/2011
Reply


Безбазовый у нас клиент, бд не использует.

Thanks:
< 1 2 3 4  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy