< Summary

Class:Azure.Messaging.EventHubs.Producer.EventDataBatch
Assembly:Azure.Messaging.EventHubs
File(s):C:\Git\azure-sdk-for-net\sdk\eventhub\Azure.Messaging.EventHubs\src\Producer\EventDataBatch.cs
Covered lines:54
Uncovered lines:0
Coverable lines:54
Total lines:232
Line coverage:100% (54 of 54)
Covered branches:6
Total branches:6
Branch coverage:100% (6 of 6)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%100%
get_MaximumSizeInBytes()-100%100%
get_SizeInBytes()-100%100%
get_Count()-100%100%
get_SendOptions()-100%100%
get_InnerBatch()-100%100%
get_FullyQualifiedNamespace()-100%100%
get_EventHubName()-100%100%
get_EventDiagnosticIdentifiers()-100%100%
TryAdd(...)-100%100%
Dispose()-100%100%
Clear()-100%100%
AsEnumerable()-100%100%
GetEventDiagnosticIdentifiers()-100%100%
Lock()-100%100%
Unlock()-100%100%
AssertNotLocked()-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\eventhub\Azure.Messaging.EventHubs\src\Producer\EventDataBatch.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Collections.Generic;
 6using Azure.Core;
 7using Azure.Messaging.EventHubs.Core;
 8using Azure.Messaging.EventHubs.Diagnostics;
 9
 10namespace Azure.Messaging.EventHubs.Producer
 11{
 12    /// <summary>
 13    ///   A set of <see cref="EventData" /> with size constraints known up-front,
 14    ///   intended to be sent to the Event Hubs service as a single batch.
 15    /// </summary>
 16    ///
 17    /// <remarks>
 18    ///   The operations for this class are thread-safe and will prevent changes when
 19    ///   actively being published to the Event Hubs service.
 20    /// </remarks>
 21    ///
 22    public sealed class EventDataBatch : IDisposable
 23    {
 24        /// <summary>An object instance to use as the synchronization root for ensuring the thread-safety of operations.
 10625        private readonly object SyncGuard = new object();
 26
 27        /// <summary>A flag indicating that the batch is locked, such as when in use during a publish operation.</summar
 28        private bool _locked = false;
 29
 30        /// <summary>
 31        ///   The maximum size allowed for the batch, in bytes.  This includes the events in the batch as
 32        ///   well as any overhead for the batch itself when sent to the Event Hubs service.
 33        /// </summary>
 34        ///
 235        public long MaximumSizeInBytes => InnerBatch.MaximumSizeInBytes;
 36
 37        /// <summary>
 38        ///   The size of the batch, in bytes, as it will be sent to the Event Hubs
 39        ///   service.
 40        /// </summary>
 41        ///
 242        public long SizeInBytes => InnerBatch.SizeInBytes;
 43
 44        /// <summary>
 45        ///   The count of events contained in the batch.
 46        /// </summary>
 47        ///
 248        public int Count => InnerBatch.Count;
 49
 50        /// <summary>
 51        ///   The set of options that should be used when publishing the batch.
 52        /// </summary>
 53        ///
 20254        internal SendEventOptions SendOptions { get; }
 55
 56        /// <summary>
 57        ///   The transport-specific batch responsible for performing the batch operations
 58        ///   in a manner compatible with the associated <see cref="TransportProducer" />.
 59        /// </summary>
 60        ///
 11261        private TransportEventBatch InnerBatch { get; }
 62
 63        /// <summary>
 64        ///   The fully qualified Event Hubs namespace that the batch is associated with.  To be used
 65        ///   during instrumentation.
 66        /// </summary>
 67        ///
 4068        private string FullyQualifiedNamespace { get; }
 69
 70        /// <summary>
 71        ///   The name of the Event Hub that the batch is associated with, specific to the
 72        ///   Event Hubs namespace that contains it.  To be used during instrumentation.
 73        /// </summary>
 74        ///
 4075        private string EventHubName { get; }
 76
 77        /// <summary>
 78        ///   The list of diagnostic identifiers of events added to this batch.  To be used during
 79        ///   instrumentation.
 80        /// </summary>
 81        ///
 15282        private List<string> EventDiagnosticIdentifiers { get; } = new List<string>();
 83
 84        /// <summary>
 85        ///   Initializes a new instance of the <see cref="EventDataBatch"/> class.
 86        /// </summary>
 87        ///
 88        /// <param name="transportBatch">The  transport-specific batch responsible for performing the batch operations.<
 89        /// <param name="fullyQualifiedNamespace">The fully qualified Event Hubs namespace to use for instrumentation.</
 90        /// <param name="eventHubName">The name of the specific Event Hub to associate the events with during instrument
 91        /// <param name="sendOptions">The set of options that should be used when publishing the batch.</param>
 92        ///
 93        /// <remarks>
 94        ///   As an internal type, this class performs only basic sanity checks against its arguments.  It
 95        ///   is assumed that callers are trusted and have performed deep validation.
 96        ///
 97        ///   Any parameters passed are assumed to be owned by this instance and safe to mutate or dispose;
 98        ///   creation of clones or otherwise protecting the parameters is assumed to be the purview of the
 99        ///   caller.
 100        /// </remarks>
 101        ///
 106102        internal EventDataBatch(TransportEventBatch transportBatch,
 106103                                string fullyQualifiedNamespace,
 106104                                string eventHubName,
 106105                                SendEventOptions sendOptions)
 106        {
 106107            Argument.AssertNotNull(transportBatch, nameof(transportBatch));
 104108            Argument.AssertNotNullOrEmpty(fullyQualifiedNamespace, nameof(fullyQualifiedNamespace));
 100109            Argument.AssertNotNullOrEmpty(eventHubName, nameof(eventHubName));
 96110            Argument.AssertNotNull(sendOptions, nameof(sendOptions));
 111
 94112            InnerBatch = transportBatch;
 94113            FullyQualifiedNamespace = fullyQualifiedNamespace;
 94114            EventHubName = eventHubName;
 94115            SendOptions = sendOptions;
 94116        }
 117
 118        /// <summary>
 119        ///   Attempts to add an event to the batch, ensuring that the size
 120        ///   of the batch does not exceed its maximum.
 121        /// </summary>
 122        ///
 123        /// <param name="eventData">The event to attempt to add to the batch.</param>
 124        ///
 125        /// <returns><c>true</c> if the event was added; otherwise, <c>false</c>.</returns>
 126        ///
 127        public bool TryAdd(EventData eventData)
 128        {
 44129            lock (SyncGuard)
 130            {
 44131                AssertNotLocked();
 132
 40133                eventData = eventData.Clone();
 40134                EventDataInstrumentation.InstrumentEvent(eventData, FullyQualifiedNamespace, EventHubName);
 135
 40136                var added = InnerBatch.TryAdd(eventData);
 137
 40138                if ((added) && (EventDataInstrumentation.TryExtractDiagnosticId(eventData, out string diagnosticId)))
 139                {
 10140                    EventDiagnosticIdentifiers.Add(diagnosticId);
 141                }
 142
 40143                return added;
 144            }
 40145        }
 146
 147        /// <summary>
 148        ///   Performs the task needed to clean up resources used by the <see cref="EventDataBatch" />.
 149        /// </summary>
 150        ///
 151        public void Dispose()
 152        {
 14153            lock (SyncGuard)
 154            {
 14155                AssertNotLocked();
 12156                InnerBatch.Dispose();
 12157            }
 12158        }
 159
 160        /// <summary>
 161        ///   Clears the batch, removing all events and resetting the
 162        ///   available size.
 163        /// </summary>
 164        ///
 165        internal void Clear()
 166        {
 6167            lock (SyncGuard)
 168            {
 6169                AssertNotLocked();
 4170                InnerBatch.Clear();
 4171            }
 4172        }
 173
 174        /// <summary>
 175        ///   Represents the batch as an enumerable set of specific representations of an event.
 176        /// </summary>
 177        ///
 178        /// <typeparam name="T">The specific event representation being requested.</typeparam>
 179        ///
 180        /// <returns>The set of events as an enumerable of the requested type.</returns>
 181        ///
 48182        internal IEnumerable<T> AsEnumerable<T>() => InnerBatch.AsEnumerable<T>();
 183
 184        /// <summary>
 185        ///   Gets the list of diagnostic identifiers of events added to this batch.
 186        /// </summary>
 187        ///
 188        /// <returns>A read-only list of diagnostic identifiers.</returns>
 189        ///
 36190        internal IReadOnlyList<string> GetEventDiagnosticIdentifiers() => EventDiagnosticIdentifiers;
 191
 192        /// <summary>
 193        ///   Locks the batch to prevent new events from being added while a service
 194        ///   operation is active.
 195        /// </summary>
 196        ///
 197        internal void Lock()
 198        {
 44199            lock (SyncGuard)
 200            {
 44201                _locked = true;
 44202            }
 44203        }
 204
 205        /// <summary>
 206        ///   Unlocks the batch, allowing new events to be added.
 207        /// </summary>
 208        ///
 209        internal void Unlock()
 210        {
 44211            lock (SyncGuard)
 212            {
 44213                _locked = false;
 44214            }
 44215        }
 216
 217        /// <summary>
 218        ///   Validates that the batch is not in a locked state, triggering an
 219        ///   invalid operation if it is.
 220        /// </summary>
 221        ///
 222        /// <exception cref="InvalidOperationException">Occurs when the batch is locked.</exception>
 223        ///
 224        private void AssertNotLocked()
 225        {
 64226            if (_locked)
 227            {
 8228                throw new InvalidOperationException(Resources.EventBatchIsLocked);
 229            }
 56230        }
 231    }
 232}