Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

System.StackOverflowException (due to Observable.Generate ?) #1065

Closed
valeriob opened this issue Oct 29, 2019 · 2 comments
Closed

System.StackOverflowException (due to Observable.Generate ?) #1065

valeriob opened this issue Oct 29, 2019 · 2 comments

Comments

@valeriob
Copy link

Hi,
unfortunately it's hard to reproduce, but when i dispose this observable sometimes it result in a stackoverflow exception, and the whole process gets killed :(

Here is the setup of the observable :

var start = DateTime.Now.Trim(TimeSpan.TicksPerSecond).AddSeconds(1);
var boundary = Observable.Generate(
            0, _ => true, // start condition
            i => ++i,     // iterate
            i => i,       // result selector
            i => start + TimeSpan.FromSeconds(i));

 var merged = boundary.WithLatestFrom(SomeOtherObservable, (a, b) => b) ;
// here  i combine it with some other observables via WithLatestFrom 
 merged.Subscribe(m => { });

This is the stack trace i got from windbg :

0000007B1A67AC70 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67ACA0 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67ACD0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AD00 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AD30 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AD60 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AD90 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67ADC0 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67ADF0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AE20 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AE50 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AE80 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AEB0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AEE0 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AF10 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AF40 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AF70 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67AFA0 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67AFD0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67B000 00007ffbf668aeef System.Reactive.Concurrency.LocalScheduler+WorkItem.Dispose() 0000007B1A67B030 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67B060 00007ffbf66ffcbc System.Reactive.Concurrency.UserWorkItem1[[System.ValueTuple2[[System.__Canon, System.Private.CoreLib],[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]].Dispose() [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Concurrency\UserWorkItem.cs @ 43] 0000007B1A67B090 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67B0C0 00007ffbf66ffc7f System.Reactive.Sink1[[System.Int32, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Internal\Sink.cs @ 45]
0000007B1A67B0F0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238]
0000007B1A67B120 00007ffbf6727512 System.Reactive.Linq.ObservableImpl.WithLatestFrom3+_[[System.Int32, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Linq\Observable\WithLatestFrom.cs @ 63] 0000007B1A67B150 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67B180 00007ffbf6696e12 System.Reactive.Linq.ObservableImpl.WithLatestFrom3+[[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Linq\Observable\WithLatestFrom.cs @ 63]
0000007B1A67B1B0 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238]
0000007B1A67B1E0 00007ffbf6696e12 System.Reactive.Linq.ObservableImpl.WithLatestFrom3+_[[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Linq\Observable\WithLatestFrom.cs @ 63] 0000007B1A67B210 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238] 0000007B1A67B240 00007ffbf6696e12 System.Reactive.Linq.ObservableImpl.WithLatestFrom3+
[[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Linq\Observable\WithLatestFrom.cs @ 63]
0000007B1A67B270 00007ffbf59d6406 System.Reactive.Disposables.Disposable.TryDispose(System.IDisposable ByRef) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Disposables\Disposable.cs @ 238]
0000007B1A67B2A0 00007ffbf668af1f System.Reactive.Sink1[[System.__Canon, System.Private.CoreLib]].Dispose(Boolean) [d:\a\1\s\Rx.NET\Source\src\System.Reactive\Internal\Sink.cs @ 45] 0000007B1A67B2D0 00007ffbf6671057 OnRtls.Flotta.Audit.StreamingAuditService.Stop()

@akarnokd
Copy link
Collaborator

The recursive scheduling inside Generate will link up a lot of UserWorkItems via their _cancelRunDisposables.

https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Linq/Observable/Generate.cs#L243

https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Concurrency/UserWorkItem.cs#L29

I'll post a fix shortly.

@akarnokd
Copy link
Collaborator

Closing via #1067

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants