- Added
Span<T>.CopyTo
andReadOnlySpan<T>.CopyTo
extension methods to support cases when the source span can be larger than the destination - Added
Span.AsSpan
andSpan.AsReadOnlySpan
for value tuples - Deprecated EnumerableTuple data type
- Minor performance improvements
- Updated dependencies
DotNext.Metaprogramming 2.11.0
- Overloaded
CodeGenerator.AsyncLambda
supports Pascal-style return (issue 13) - Fixed suppression of exceptions raised by generated async lambda (issue 14)
- Fixed invalid behavior of async lambda body rewriter (issue 17)
- Updated dependencies
- Updated dependencies
- Updated dependencies
- Updated dependencies
- Added
requestTimeout
configuration property for TCP/UDP transports - Stabilized shutdown of Raft server for TCP/UDP transports
- Added SSL support for TCP transport
- Updated dependencies shipped with .NET Core 3.1.9
DotNext.AspNetCore.Cluster 2.11.0
- Added
requestTimeout
andrpcTimeout
configuration properties for precise control over timeouts used for communication between Raft nodes (issue 12) - Updated dependencies shipped with .NET Core 3.1.9
- Fixed correctness of
Clear(bool)
method overridden byPooledArrayBufferWriter<T>
andPooledBufferWriter<T>
classes - Added
RemoveLast
andRemoveFirst
methods toPooledArrayBufferWriter<T>
class Optional<T>
type distinguishes null and undefined value- DotNext.Sequence class is now deprecated and replaced with DotNext.Collections.Generic.Sequence class. It's binary compatible but source incompatible change
- Added new API for writing resource string readers. It utilizes Caller Info feature in C# to resolve resource entry name using accessor method or property
- Introduced BufferWriterSlim<T> type as lightweight and stackalloc-friendly version of PooledBufferWriter<T> type
- Introduced SpanReader<T> and SpanWriter<T> types that can be used for sequential access to the elements in the memory span
- Removed unused resource strings
- Updated dependencies
DotNext.Metaprogramming 2.10.1
- Added extension methods of ExpressionBuilder class for constructing expressions of type Optional<T>, Result<T> or Nullable<T>
- Fixed bug with expression building using dynamic keyword
- UniversalExpression is superseded by ExpressionBuilder.AsDynamic extension method
- Removed unused resource strings
- Updated dependencies
- Removed unused resource strings
- Updated dependencies
- AsyncExchanger<T> class now has a method for fast synchronous exchange
- AsyncTimer implements IAsyncDisposable for graceful shutdown
- Removed unused resource strings
- Updated dependencies
- Pointer<T> value type now implements IPinnable interface
- Added interop between Pointer<T> and System.Reflection.Pointer
- Removed unused resource strings
- Updated dependencies
- Removed unused resource strings
- Updated dependencies shipped with .NET Core 3.1.8
DotNext.AspNetCore.Cluster 2.10.1
- Removed unused resource strings
- Updated dependencies shipped with .NET Core 3.1.8
- Improved performance of Enum Member API
- Fixed compiler warnings
- Updated dependencies
- Fixed compiler warnings
- Updated dependencies
- Fixed compiler warnings
- Updated dependencies
- Fixed compiler warnings
- Updated dependencies
- Fixed compiler warnings
- Updated dependencies
- Fixed unstable behavior of Raft TCP transport on Windows. See issue #10 for more info.
- Updated dependencies
DotNext.AspNetCore.Cluster 2.6.6
- Updated dependencies
- Added support of custom attributes to Enum Member API
- Added
Continuation.ContinueWithTimeout<T>
extension method that allows to produce the task from the given task with attached timeout and, optionally, token
- Fixed graceful shutdown for async locks if they are not in locked state
- Added AsyncExchanger<T> synchronization primitive that allows to organize pipelines
- AsyncTrigger now has additional
SignalAndWaitAsync
overloads
- Added
Sequence.ToAsyncEnumerable()
extension method that allows to convert arbitrary IEnumerable<T> to IAsyncEnumerable<T> - Added extension methods to
Sequence
class for working with [async streams]IAsyncEnumerable<T>
- Fixed behavior of
GetObjectDataAsync
method in StreamTransferObject. Now it respects the value ofIsReusable
property.
- Added
MemoryTemplate<T>
value type that represents pre-compiled template with placeholders used for fast creation ofMemory<T>
and string objects
- Added
BufferWriter.WriteLine
overloaded extension method that allows to specifyReadOnlySpan<char>
as an input argument
- Text writer constructed with
TextWriterSource.AsTextWriter
extension method can be converted to string containing all written characters
- Optimized
UnmanagedMemoryPool<T>.GetAllocator
method
UnmanagedMemoryPool<T>.GetAllocator
public static method is added for compatibility with MemoryAllocator<T> delegate
This release is mainly focused on DotNext.IO
library to add new API unifying programming experience across I/O pipelines, streams, sequences and buffer writers.
- Introduced extension methods in Span class for concatenation of memory spans
- Removed allocation of Stream in the extension methods of StreamSource class when passed ReadOnlySequence<byte> is empty
- StreamSource has additional methods to create streams from various things
- PooledArrayBufferWriter<T> and PooledBufferWriter<T> support reuse of the internal buffer using overloaded
Clear(bool)
method
- BufferWriter now contains extension methods that allow to use any object implementing IBufferWriter<char> as pooled string builder
- IAsyncBinaryReader, IAsyncBinaryWriter, PipeExtensions, StreamExtensions, SequenceBinaryReader types now containing methods for encoding/decoding primitive types, DateTime, DateTimeOffset, Guid to/from string representation contained in underlying stream, pipe or sequence in the binary form
- Fixed pooled memory leaks in SequenceBinaryReader
- TextWriter over IBufferWriter<char> interface using extension method in TextWriterSource class
- Enabled consistent build which is recommended for SourceLink
- Optimized construction of getter/setter for the reflected field
- Enabled consistent build which is recommended for SourceLink
- Enabled consistent build which is recommended for SourceLink
- Enabled consistent build which is recommended for SourceLink
- Enabled consistent build which is recommended for SourceLink
DotNext.AspNetCore.Cluster 2.6.1
- Reduced memory allocation caused by replication of log entries
- Enabled consistent build which is recommended for SourceLink
- More ways to create
MemoryOwner<T>
- Removed copying of synchronization context when creating continuation for
Future
object - Introduced APM helper methods in
AsyncDelegate
class
- Improved performance of
FileBufferingWriter
FileBufferingWriter
now contains correctly implementedBeginWrite
andEndWrite
methodsFileBufferingWriter
ables to return written content as ReadOnlySequence<byte>- Introduced
BufferWriter
class with extension methods for IBufferWriter<byte> aimed to encoding strings, primitive and blittable types - Support of
ulong
,uint
andushort
data types available for encoding/decoding inSequenceBinaryReader
andPipeExtensions
classes - Ability to access memory-mapped file content via ReadOnlySequence<byte>
- Introduced null-coalescing assignment expression
- Updated dependencies
- Introduced null-coalescing assignment expression
- Updated dependencies
- Fixed race-condition caused by
AsyncTrigger.Signal
method AsyncLock
now implements IAsyncDisposable interfaceAsyncExclusiveLock
,AsyncReaderWriterLock
andAsyncSharedLock
now have support of graceful shutdown implemented via IAsyncDisposable interface
- Optimized performance of methods in
MemoryMappedFileExtensions
class - Updated dependencies
- Fixed behavior of
PersistentState.DisposeAsync
so it suppress finalization correctly
DotNext.AspNetCore.Cluster 2.6.0
- Respect shutdown timeout inherited from parent host in Hosted Mode
- Updated dependencies
DotNext.Augmentation.Fody 2.1.0
- Removed usage of obsolete methods from
Fody
- Updated
Fody
version
- Improved performance of
PooledBufferWriter
MemoryAllocator<T>
now allows to allocate at least requested number of elements
- Ability to represent stream as IBufferWriter<T>
FileBufferingWriter
class is one more growable buffer backed by file in case of very large buffer size
- Fixed dynamic construction of tuples using
ValueTupleBuilder
class (PR #8)
- Reduced memory allocation caused by continuations in
Future
class - Improved performance of some methods in
MemoryRental<T>
andDelegateHelpers
classes - Reduced amount of memory re-allocations in
PooledBufferWriter<T>
andPooledArrayBufferWriter<T>
classes
ArrayRental<T>
can automatically determine array cleanup policyMemoryRental<T>
is improved for stackalloc/pooling pattern- Fixed bug in
Clear
method ofPooledBufferWriter
class
This release is mostly aimed to improving code quality of all .NEXT libraries with help of StyleCop analyzer.
DotNext.IO.StreamSource
class allows to convertReadOnlyMemory<byte>
orReadOnlySequence<byte>
to streamDotNext.IO.StreamSource
class allows to obtain writable stream forIBufferWriter<byte>
- Support of
BeginRead
andEndRead
methods inStreamSegment
class - Update to the latest
System.IO.Pipelines
library
- Fixed several compiler warnings
- Fixed several compiler warnings
- Fixed several compiler warnings
- Update to the latest
System.Threading.Channels
library
- Ability to convert
Pointer<T>
toIMemoryOwner<T>
- Added calls to
ConfigureAwait
in multiple places
DotNext.AspNetCore.Cluster 2.4.0
- Added calls to
ConfigureAwait
in multiple places - Fixed node status tracking when TCP or UDP transport in use
DotNext.AspNetCore.Cluster 2.3.2
- Section with local node configuration can be defined explicitly
DotNext.AspNetCore.Cluster 2.3.1
- Alternative methods for configuring local node
- Performance improvements of
BitwiseComparer
andIntrinsics
classes - Introduced new MemoryOwner<T> value type that unifies working with memory and array pools
- Path MTU discovery
- Pooled buffer writes: PooledBufferWriter<T> and PooledArrayBufferWriter<T>
- Updated dependencies
- Updated dependencies
- Updated dependencies
- Fixed bugs that lead to unexpected EndOfStreamException in some methods of
StreamExtensions
class - Introduced new methods in
StreamExtensions
class for reading data of exact size
- Improved performance of existing asynchronous locks
- Added AsyncTrigger synchronization primitive
- Updated dependencies
- TCP transport for Raft
- UDP transport for Raft
- Fixed bug in PersistentState class that leads to incorrect usage of rented memory and unexpected result during replication between nodes
- Methods for handling Raft messages inside of RaftCluster<TMember> class now support cancellation via token
DotNext.AspNetCore.Cluster 2.3.0
- Updated dependencies
- Fixed cancellation of asynchronous operations
- Ability to slice lists using range syntax and new
ListSegment
data type - Various extension methods for broader adoption of range/index feature from C# 8
- Support of range and index expressions from C# 8
- Access to memory-mapped file via
System.Memory<T>
data type
- Updated dependencies
- Updated dependencies
- Lighweight API for fast reflection is added. See overloaded
Unreflect
methods inReflector
class.
- Updated dependencies
DotNext.AspNetCore.Cluster 2.2.0
- Upgrade to latest ASP.NET Core
DotNext.Augmentation.Fody 2.0.1
- Removed obsolete calls
- Reduced memory footprint of
DotNext.Span
static constructor DotNext.UserDataStorage
behavior is now customizable viaUserDataStorage.IContainer
interface- Introduced
Intrinsics.GetReadonlyRef
method allows to reinterpret managed pointer to array element DelegateHelpers.Bind
now supports both closed and open delegates
Major release of version 2.0 is completely finished and contains polished existing and new API. All libraries in .NEXT family are upgraded. Migration guide for 1.x users is here. Please consider that this version is not fully backward compatible with 1.x.
Major version is here for the following reasons:
- .NET Core 3.1 LTS is finally released
- .NET Standard 2.1 contains a lot of new API required for optimizations. The most expected API is asynchronous methods in Stream class. These enhancements are necessary for evolution of .NEXT library. For instance, new DotNext.IO library could not be released without new .NET API.
- ASP.NET Core 2.2 is no longer supported by Microsoft. Therefore, DotNext.AspNetCore.Cluster library of version 1.x relies on unmaintainable platform. Now it is based on ASP.NET Core 3.1 which has long-term support.
What is done in this release:
- Quality-focused changes
- Removed trivial "one-liners" in DotNext library
- Reduced and unified API to work with unmanaged memory in DotNext.Unsafe library
- DotNext.AspNetCore.Cluster migrated to ASP.NET Core 3.1 LTS
- Increased test coverage and fixed bugs
- Additional optimizations of performance in Write-Ahead Log
- Fixed issue #4
- Introduced API for client interaction support described in Chapter 6 of Raft dissertation
- Migration to C# 8 and nullable reference types
- New features
- Introduced DotNext.IO library with unified asynchronous API surface for .NET streams and I/O pipelines. This API provides high-level methods for encoding and decoding of data such as strings and blittable types. In other words, if you want to have BinaryReader or BinaryWriter for pipelines then welcome!
- Ability to obtain result of task asynchronously when its result type is not known at compile-time
- Fast hexadecimal string conversion to
Span<byte>
and vice versa
Raft users are strongly advised to migrate to this new version.
- Ability to reconstruct internal state using
PersistentState.ReplayAsync
method
- Fixed invalid behavior of
StreamSegment.Position
property
- Removed redundant validation of log entry index in
PersistentState
- Fixed invalid usage of
GC.RemoveMemoryPressure
inReallocate
methods
UserDataStorage
no longer stores null values in its internal dictionary- Updated dependencies
- Migration to SourceLink 1.0.0
- Updated dependencies
- Migration to SourceLink 1.0.0
- Updated dependencies
- Migration to SourceLink 1.0.0
- Updated dependencies
- Migration to SourceLink 1.0.0
- Updated dependencies
- Fixed invalid calculation of byte length in
Pointer.Clear
method
- Updated dependencies
DotNext.AspNetCore.Cluster 1.2.9
- Updated dependencies
DotNext.AspNetCore.Cluster 1.2.8
- Improved performance of one-way no-ack messages that can be passed using
ISubscriber.SendSignalAsync
method
BitwiseComparer
now available as singleton instance
- Improved performance of copying log entry content when
PersistentState
is used as persistent audit trail
DotNext.AspNetCore.Cluster 1.2.7
- Improved performance of message exchange between cluster members
- Fixed typos in XML documentation
- Updated InlineIL.Fody dependency
- Fixed
MissingManifestResourceException
caused byAsyncLock
value type on .NET Core 3.x
- Updated InlineIL.Fody dependency
- Fixed NRE when
RaftCluster.StopAsync
called multiple times
DotNext.AspNetCore.Cluster 1.2.6
- Migration to patched
RaftCluster
class
- Fixed NRE when
Dispose
method of PersistentChannel class called multiple times
DotNext.AspNetCore.Cluster 1.2.5
- Fixed bug when log entry may have invalid content when retrieved from persistent audit trail. Usually this problem can be observed in case of concurrent read/write and caused by invalid synchronization of multiple file streams.
- PersistentChannel is added as an extension of channel concept from System.Threading.Channels. It allows to use disk memory instead of RAM for storing messages passed from producer to consumer. Read more here
- AsyncCounter allows to simplify asynchronous coordination in producer/consumer scenario
- Updated dependencies
- Fixed NRE
- Internal cache is optimized to avoid storage of null values
- Updated dependencies
- Updated dependencies
- Fixed unnecessary boxing of generic log entry value
DotNext.AspNetCore.Cluster 1.2.4
- Updated dependencies
DotNext.Augmentation.Fody 1.2.4
- Updated dependencies
- Updated dependencies
- Updated dependencies
- Fixed potential NRE
- Fixed reflection of value type constructors
- Updated dependencies
- Updated dependencies
- Updated dependencies
- Updated dependencies
DotNext.AspNetCore.Cluster 1.2.3
- Updated dependencies
DotNext.Augmentation.Fody 1.2.3
- Updated dependencies
- Fixed bitwise equality
- Fixed
Intrinsics.IsDefault
method
- Fixed type modifier of
Current
property declared in CopyOnWriteList<T>.Enumerator
- Fixed memory leaks caused by methods in StreamExtensions class
- MemoryRental type is introduced to replace memory allocation with memory rental in some scenarios
- ArrayRental type is extended
- Value Delegates now are protected from dangling pointer issue caused by dynamic assembly loading
- Reduced amount of memory utilized by random string generation methods
- Strict package versioning rules are added to avoid accidental upgrade to major version
- Improved performance of AtomicEnum methods
- Improved performance of Atomic<T> using optimistic read locks
- Fixed unnecessary boxing in atomic operations
Intrinsics.HasFlag
static generic method is added as boxing-free and fast alternative to Enum.HasFlag method
- Updated version of
DotNext
dependency to fix potential memory leaks - Strict package versioning rules are added to avoid accidental upgrade to major version
- Updated version of
DotNext
dependency to fix potential memory leaks - Strict package versioning rules are added to avoid accidental upgrade to major version
- Updated version of
DotNext
dependency to fix potential memory leaks - Strict package versioning rules are added to avoid accidental upgrade to major version
- AsyncReaderWriterLock now supports optimistic reads
- UnmanagedMemoryPool is added
- Strict package versioning rules are added to avoid accidental upgrade to major version
- Updated version of
DotNext
dependency to fix potential memory leaks - Strict package versioning rules are added to avoid accidental upgrade to major version
- Fixed incorrect computation of partition in
PersistentState.DropAsync
method
DotNext.AspNetCore.Cluster 1.2.0
- HTTP/2 support
- Performance optimizations caused by changes in
ArrayRental
type - Strict package versioning rules are added to avoid accidental upgrade to major version
DotNext.Augmentation.Fody 1.2.0
- Improved support of
ValueRefAction
andValueRefFunc
value delegates
- Reduced number of inline IL code
- Updated version of FxCop analyzer
- ReaderWriterSpinLock type is introduced
- Improved performance of UserDataStorage
- Updated version of FxCop analyzer
- Improved performance of internal caches
- Updated version of FxCop analyzer
RefAnyValExpression
is added
- Updated version of FxCop analyzer
- Updated version of FxCop analyzer
- Minor performance optimizations of persistent WAL
- Updated version of FxCop analyzer
DotNext.AspNetCore.Cluster 1.1.0
- Updated version of FxCop analyzer
- Minor performance optimizations
- Minor performance optimizations
- Minor performance optimizations
- Introduced AsyncSharedLock as combination of reader/write lock and semaphore
- Minor performance optimizations
- Minor performance optimizations
- Minor performance optimizations
DotNext.AspNetCore.Cluster 1.0.1
- Minor performance optimizations
DotNext.Augmentation.Fody 1.0.1
- Code refactoring
This is the major release of all parts of .NEXT library. Now the version is 1.0.0 and backward compatibility is guaranteed across all 1.x releases. The main motivation of this release is to produce stable API because .NEXT library active using in production code, especially Raft implementation.
.NEXT 1.x is based on .NET Standard 2.0 to keep compatibility with .NET Framework.
- Optimized methods of Memory class
- Extension methods for I/O are introduced. Now you don't need to instantiate BinaryReader or BinaryWriter for high-level parsing of stream content. Encoding and decoding of strings are fully supported. Moreover, these methods are asynchronous in contrast to methods of
BinaryReader
andBinaryWriter
.
- API is stabilized
- API is stabilized
- AsyncManualResetEvent has auto-reset optional behavior which allows to repeatedly unblock many waiters
- MemoryMappedFileExtensions allows to work with virtual memory associated with memory-mapped file using unsafe pointer or Span<T> to achieve the best performance.
- Audit trail programming model is redesigned
- Persistent and high-performance Write Ahead Log (WAL) is introduced. Read more here
- Log compaction is supported
DotNext.AspNetCore.Cluster 1.0.0
- Redirection to leader now uses
307 Temporary Redirect
instead of302 Moved Temporarily
by default - Compatibility with persistent WAL is provided
DotNext.Augmentation.Fody 1.0.0
- Behavior of augmented compilation is stabilized
DotNext.AspNetCore.Cluster 0.5.7
- Custom redirection logic can be asynchronous
- Fixed compatibility of redirection to leader with MVC
DotNext.AspNetCore.Cluster 0.5.5
- Automatic redirection to leader now works correctly with reverse proxies
- Custom redirection logic is introduced
- Timestamp type is introduced as allocation-free alternative to Stopwatch
- Memory class now have methods for reading and writing null-terminated UTF-16 string from/to unmanaged or pinned managed memory
- Updated InlineIL dependency to 1.3.1
- AsyncTimer is completely rewritten in backward-incompatible way. Wait handle are no longer used.
DotNext.Unsafe 0.14.0
DotNext.Reflection 0.14.0
DotNext.Metaprogramming 0.14.0
- Small code fixes
- Updated
DotNext
dependency to 0.14.0 - Updated
Fody
dependency to 6.0.0 - Updated augmented compilation to 0.14.0
DotNext.Net.Cluster 0.5.0
DotNext.AspNetCore.Cluster 0.5.0
- Measurement of runtime metrics are introduced and exposed through MetricsCollector and HttpMetricsCollector classes
DotNext.Augmentation.Fody 0.14.0
- Updated
Fody
dependency to 6.0.0
DotNext.AspNetCore.Cluster 0.4.0
DotNext.Net.Cluster 0.4.0
- Heartbeat timeout can be tuned through configuration
- Optimized Raft state machine
DotNext.AspNetCore.Cluster 0.3.5
- Docker support
DotNext.AspNetCore.Cluster 0.3.3
DotNext.Net.Cluster 0.3.3
- Reduced number of logs produced by cluster node
DotNext.AspNetCore.Cluster 0.3.2
- Fixed endpoint redirection to leader node
DotNext.AspNetCore.Cluster 0.3.1
- Fixed detection of local IP address
- Improved IPv6 support
- Fixed bug with equality comparison of null arrays inside of EqualityComparerBuilder
- Improved debugging experience:
- SourceLink is enabled
- Debug symbols now embedded into assembly file
- NuGet Symbols Package is no longer used
- Internals of several classes now based on Value Delegates to reduce memory allocations
- Improved debugging experience:
- SourceLink is enabled
- Debug symbols now embedded into assembly file
- NuGet Symbols Package is no longer used
DotNext.Unsafe 0.13.0
DotNext.Reflection 0.13.0
DotNext.Metaprogramming 0.13.0
DotNext.Net.Cluster 0.3.0
DotNext.AspNetCore.Cluster 0.3.0
- Improved debugging experience:
- SourceLink is enabled
- Debug symbols now embedded into assembly file
- NuGet Symbols Package is no longer used
- Value (struct) Delegates are introduced as allocation-free alternative to classic delegates
- Atomic<T> is added to provide atomic memory access operations for arbitrary value types
- Arithmetic, bitwise and comparison operations for IntPtr and UIntPtr
- Improved performance of methods declared in EnumConverter
- Improved performance of atomic operations
- Improved performance of bitwise equality and bitwise comparison methods for value types
- Improved performance of IsDefault method which allows to check whether the arbitrary value of type
T
isdefault(T)
- GetUnderlyingType() method is added to obtain underlying type of Result<T>
- TypedReference can be converted into managed pointer (type T&, or ref T) using Memory class
This release introduces a new feature called Value Delegates which are allocation-free alternative to regular .NET delegates. Value Delegate is a value type which holds a pointer to the managed method and can be invoked using Invoke
method in the same way as regular .NET delegate. Read more here.
ValueType<T>
is no longer exist and most of its methods moved into BitwiseComparer class.
- Ability to obtain managed pointer (type T&, or
ref T
) to static or instance field from FieldInfo using Reflector class
- AsyncLazy<T> is introduced as asynchronous alternative to Lazy<T> class
DotNext.Metaprogramming 0.12.0
- Null-safe navigation expression is introduced
- UnmanagedFunction and UnmanagedFunction<R> classes are introduced to call unmanaged functions by pointer
DotNext.Net.Cluster 0.2.0 DotNext.AspNetCore.Cluster 0.2.0
- Raft client is now capable to ensure that changes are committed by leader node using WriteConcern