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

Ошибка в клиринг
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  > >>
Mikhail Sukhov

Avatar
Date: 10/4/2011
Reply


FiNick: пока не переполнится стек.

Что за стек?

Thanks:

FiNick

Avatar
Date: 10/4/2011
Reply


Mikhail Sukhov:

FiNick: пока не переполнится стек.

Что за стек?

Ну как, стек программы, который переполняется если, например, бесконечно рекурсивно вызывать какую-либо функцию. У меня на экране быстро появляются десятки окошек с ошибкой (см прикрепленную ошибку), все подвисает, пока не вылетит StackOverflow Exception. Попробуйте запустить SimpleGUI в промклиринг.

Thanks:

Alexander

Avatar
Date: 10/4/2011
Reply


Форум ртс Насколько я понял - exception выкидывать не надо. просто делать Sleep если для всех стримов обломилась проверка. какие ещё идеи?

Thanks:

Mikhail Sukhov

Avatar
Date: 10/4/2011
Reply


FiNick: Ну как, стек программы, который переполняется если, например, бесконечно рекурсивно вызывать какую-либо функцию.

Рекурсии не увидел.

FiNick: У меня на экране быстро появляются десятки окошек с ошибкой (см прикрепленную ошибку), все подвисает, пока не вылетит StackOverflow Exception. Попробуйте запустить SimpleGUI в промклиринг.

Пример на то и пример, что показывает основное. Гидра прекрасно и пром и основной клиринг переживает. Видимо окошки не нужно выбрасывать.

Thanks:

Alexander

Avatar
Date: 10/4/2011
Reply


Mikhail Sukhov: Видимо окошки не нужно выбрасывать.

Я думаю данный exception вообще лишний для ProcessDataError - т.к. это стандартная ситуация. Потому предлагаю чтоб pollAction возвращал bool флаг - success или нет (чтоб не грузили ProcessMessage). Соответственно предлагаю изменить его на:

				if (Streams.Count == 0 && _streamsToRemove.Count == 0)
					_sleepInterval.Sleep();

                var checkSuccess = true;
				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());
                            checkSuccess = false;
                            return;
						}
					}
				});

                if (!checkSuccess)
                {
                    _sleepInterval.Sleep();
                    return 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();
				});

                return true;

Ну и в PlazaConnection соответственно:

                            if (pollAction != null && !pollAction())
                                return;

Мысли \ возражения?

Thanks:

FiNick

Avatar
Date: 10/4/2011
Reply


Мне кажется, или такой код должен грузить проц под 100%? Там же нигде Sleep нету. Надо как-то сделать, чтобы если !pollAction() то поспать:

if (pollAction != null && !pollAction())
{
    PollTimeOut.Sleep();
    return;
}
Thanks:

Alexander

Avatar
Date: 10/5/2011
Reply


да, верно. подправил вариант ваше.

Thanks:

Alexander

Avatar
Date: 10/5/2011
Reply


Положил. Хотя бы 1 поток должен быть открыт, так правильнее. В этом случае ProcessMessage имеет смысл делать.

Thanks:

FiNick

Avatar
Date: 10/5/2011
Reply


var success = true;
if (Streams.Count == 0 && _streamsToRemove.Count == 0)
	success = false;

Streams.SyncDo(c =>
{
	var anySuccess = false;
	foreach (var stream in Streams)
	{
		try
		{
			stream.CheckConnection(_connection);
			anySuccess = true;
		}
		catch (COMException e)
		{
			System.Diagnostics.Trace.WriteLine("Ошибка проверки потока репликации - stream.CheckConnection(_connection) - COMException " + e.ErrorCode.ToString());
		}
	}

	success = anySuccess;
});

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

Кстати, после этих изменений у меня не коннектится. И проблема именно в PlazaStreamManager, потому что со старым вариантом все норм

Thanks:

Alexander

Avatar
Date: 10/5/2011
Reply


FiNick: ODE0�

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

Кстати, после этих изменений у меня не коннектится. И проблема именно в PlazaStreamManager, потому что со старым вариантом все норм

Исправил. По ночам лучше спать :) Мы должны дёргать ProcessMessage чтоб знать подключились или нет

Thanks:
1 2 3  > >>

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

loading
clippy