Ejemplo n.º 1
0
        /// <summary>Creates a SessionFactory object.</summary>
        /// <param name="callback">The callback for notifications about session establishment.</param>
        /// <param name="properties">Optional properties used for communicator initialization.</param>
        /// <param name="logger">Optional logger used for communicator initialization.</param>
        /// <param name="observer">Optional communicator observer used for communicator initialization.</param>
        public SessionFactoryHelper(ISessionCallback callback,
                                    Dictionary <string, string> properties,
                                    ILogger?logger = null,
                                    ICommunicatorObserver?observer = null)
        {
            _callback   = callback;
            _properties = properties;
            _logger     = logger;
            _observer   = observer;

            SetDefaultProperties();
        }
Ejemplo n.º 2
0
        public static async Task <int> Main(string[] args)
        {
            ICommunicatorObserver?      observer   = Instrumentation.GetObserver();
            Dictionary <string, string> properties = CreateTestProperties(ref args);

            properties["Ice.Warn.Dispatch"] = "0";
            // This test kills connections, so we don't want warnings.
            properties["Ice.Warn.Connections"] = "0";

            await using var communicator = CreateCommunicator(properties, observer: observer);
            return(await RunTestAsync <Collocated>(communicator, args));
        }
Ejemplo n.º 3
0
        public override async Task RunAsync(string[] args)
        {
            ICommunicatorObserver?      observer   = Instrumentation.GetObserver();
            Dictionary <string, string>?properties = CreateTestProperties(ref args);

            properties["Ice.Warn.Dispatch"] = "0";
            // This test kills connections, so we don't want warnings.
            properties["Ice.Warn.Connections"]    = "0";
            await using Communicator communicator = Initialize(properties, observer: observer);

            communicator.SetProperty("TestAdapter.Endpoints", GetTestEndpoint(0));
            communicator.CreateObjectAdapter("TestAdapter").Add("retry", new Retry());
            await AllTests.Run(this, communicator, true).ShutdownAsync();
        }
Ejemplo n.º 4
0
        public static IInvocationObserver?get(Ice.Communicator communicator, string op)
        {
            ICommunicatorObserver?obsv = communicator.Observer;

            if (obsv != null)
            {
                IInvocationObserver?observer = obsv.GetInvocationObserver(null, op, _emptyContext);
                if (observer != null)
                {
                    observer.Attach();
                }
                return(observer);
            }
            return(null);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Creates a Glacier2 session.
 /// </summary>
 /// <param name="callback">The callback for notifications about session
 /// establishment.</param>
 /// <param name="properties">Optional properties used for communicator initialization.</param>
 /// <param name="logger">Optional logger used for communicator initialization.</param>
 /// <param name="observer">Optional communicator observer used for communicator initialization.</param>
 /// <param name="typeIdNamespaces">Optional list of TypeId namespaces used for communicator initialization.
 /// The default is Ice.TypeId.</param>
 /// <param name="finderStr">The stringified Ice.RouterFinder proxy.</param>
 /// <param name="useCallbacks">True if the session should create an object adapter for receiving callbacks.</param>
 internal SessionHelper(ISessionCallback callback,
                        string finderStr,
                        bool useCallbacks,
                        Dictionary <string, string> properties,
                        ILogger?logger = null,
                        ICommunicatorObserver?observer = null,
                        string[]?typeIdNamespaces      = null)
 {
     _callback         = callback;
     _finderStr        = finderStr;
     _useCallbacks     = useCallbacks;
     _properties       = properties;
     _logger           = logger;
     _observer         = observer;
     _typeIdNamespaces = typeIdNamespaces;
 }
Ejemplo n.º 6
0
        /// <summary>Creates a SessionFactory object.</summary>
        /// <param name="callback">The callback for notifications about session establishment.</param>
        /// <param name="properties">Optional properties used for communicator initialization.</param>
        /// <param name="logger">Optional logger used for communicator initialization.</param>
        /// <param name="observer">Optional communicator observer used for communicator initialization.</param>
        /// <param name="tlsClientOptions">TLS transport client side configuration options.</param>
        /// <param name="tlsServerOptions">TLS transport server side configuration options.</param>
        public SessionFactoryHelper(
            ISessionCallback callback,
            Dictionary <string, string> properties,
            ILogger?logger = null,
            ICommunicatorObserver?observer    = null,
            TlsClientOptions?tlsClientOptions = null,
            TlsServerOptions?tlsServerOptions = null)
        {
            _callback         = callback;
            _properties       = properties;
            _logger           = logger;
            _observer         = observer;
            _tlsClientOptions = tlsClientOptions;
            _tlsServerOptions = tlsServerOptions;

            _properties["Ice.RetryIntervals"] = "-1";
        }
Ejemplo n.º 7
0
 internal CommunicatorObserver(Communicator communicator, ILogger logger)
 {
     AdminFacet   = new MetricsAdmin(communicator, logger);
     _delegate    = communicator.Observer;
     _connections = new ObserverFactoryWithDelegate <ConnectionMetrics, ConnectionObserver,
                                                     IConnectionObserver>(AdminFacet, "Connection");
     _dispatch = new ObserverFactoryWithDelegate <DispatchMetrics, DispatchObserver, IDispatchObserver>(
         AdminFacet, "Dispatch");
     _invocations = new ObserverFactoryWithDelegate <InvocationMetrics, InvocationObserver,
                                                     IInvocationObserver>(AdminFacet, "Invocation");
     _connects = new ObserverFactoryWithDelegate <Metrics, ObserverWithDelegate,
                                                  IObserver>(AdminFacet, "ConnectionEstablishment");
     _endpointLookups = new ObserverFactoryWithDelegate <Metrics, ObserverWithDelegate,
                                                         IObserver>(AdminFacet, "EndpointLookup");
     _invocations.RegisterSubMap <ChildInvocationMetrics>("ChildInvocation",
                                                          (obj, metrics) => (obj as InvocationMetrics) !.Children = metrics);
 }
Ejemplo n.º 8
0
 internal SessionHelper(ISessionCallback callback,
                        string finderStr,
                        bool useCallbacks,
                        Dictionary <string, string> properties,
                        ILogger?logger,
                        ICommunicatorObserver?observer,
                        TlsClientOptions?tlsClientOptions,
                        TlsServerOptions?tlsServerOptions)
 {
     _callback         = callback;
     _finderStr        = finderStr;
     _useCallbacks     = useCallbacks;
     _properties       = properties;
     _logger           = logger;
     _observer         = observer;
     _tlsClientOptions = tlsClientOptions;
     _tlsServerOptions = tlsServerOptions;
 }
Ejemplo n.º 9
0
        public override async Task RunAsync(string[] args)
        {
            ICommunicatorObserver?      observer   = Instrumentation.GetObserver();
            Dictionary <string, string>?properties = CreateTestProperties(ref args);

            properties["Ice.RetryIntervals"] = "0 1 10 1";
            properties["Ice.Warn.Dispatch"]  = "0";

            // This test kills connections, so we don't want warnings.
            properties["Ice.Warn.Connections"]    = "0";
            await using Communicator communicator = Initialize(properties, observer: observer);

            // Configure a second communicator for the invocation timeout + retry test, we need to configure a large
            // retry interval to avoid time-sensitive failures.
            properties["Ice.RetryIntervals"]        = "0 1 10000";
            await using Communicator? communicator2 = Initialize(properties, observer: observer);
            communicator.CreateObjectAdapter().Add("retry", new Retry());
            communicator2.CreateObjectAdapter().Add("retry", new Retry());
            await AllTests.Run(this, communicator, communicator2, "retry").ShutdownAsync();
        }
Ejemplo n.º 10
0
 /// <summary>
 /// Creates a Glacier2 session.
 /// </summary>
 /// <param name="callback">The callback for notifications about session
 /// establishment.</param>
 /// <param name="properties">Optional properties used for communicator initialization.</param>
 /// <param name="logger">Optional logger used for communicator initialization.</param>
 /// <param name="observer">Optional communicator observer used for communicator initialization.</param>
 /// <param name="certificates">The user certificates to use with the SSL transport.</param>
 /// <param name="caCertificates">The certificate authorities to use with the SSL transport.</param>
 /// <param name="certificateValidationCallback">The certificate validation callback to use with the SSL transport.</param>
 /// <param name="passwordCallback">The password callback delegate to use with the SSL transport.</param>
 /// <param name="finderStr">The stringified Ice.RouterFinder proxy.</param>
 /// <param name="useCallbacks">True if the session should create an object adapter for receiving callbacks.</param>
 internal SessionHelper(ISessionCallback callback,
                        string finderStr,
                        bool useCallbacks,
                        Dictionary <string, string> properties,
                        ILogger?logger = null,
                        ICommunicatorObserver?observer            = null,
                        X509Certificate2Collection?certificates   = null,
                        X509Certificate2Collection?caCertificates = null,
                        RemoteCertificateValidationCallback?certificateValidationCallback = null,
                        IPasswordCallback?passwordCallback = null)
 {
     _callback       = callback;
     _finderStr      = finderStr;
     _useCallbacks   = useCallbacks;
     _properties     = properties;
     _logger         = logger;
     _observer       = observer;
     _certificates   = certificates;
     _caCertificates = caCertificates;
     _certificateValidationCallback = certificateValidationCallback;
     _passwordCallback = passwordCallback;
 }
Ejemplo n.º 11
0
        /// <summary>Creates a SessionFactory object.</summary>
        /// <param name="callback">The callback for notifications about session establishment.</param>
        /// <param name="properties">Optional properties used for communicator initialization.</param>
        /// <param name="logger">Optional logger used for communicator initialization.</param>
        /// <param name="observer">Optional communicator observer used for communicator initialization.</param>
        /// <param name="certificates">Optional certificates used by secure transports.</param>
        /// <param name="caCertificates">Optional CA certificates used by secure transports.</param>
        /// /// <param name="certificateSelectionCallback">Optional certificate selection callback used by secure
        /// transports.</param>
        /// <param name="certificateValidationCallback">Optional certificate validation callback used by secure
        /// transports.</param>
        /// <param name="passwordCallback">Optional password callback used by secure transports.</param>
        public SessionFactoryHelper(
            ISessionCallback callback,
            Dictionary <string, string> properties,
            ILogger?logger = null,
            ICommunicatorObserver?observer            = null,
            X509Certificate2Collection?certificates   = null,
            X509Certificate2Collection?caCertificates = null,
            LocalCertificateSelectionCallback?certificateSelectionCallback    = null,
            RemoteCertificateValidationCallback?certificateValidationCallback = null,
            IPasswordCallback?passwordCallback = null)
        {
            _callback       = callback;
            _properties     = properties;
            _logger         = logger;
            _observer       = observer;
            _certificates   = certificates;
            _caCertificates = caCertificates;
            _certificateSelectionCallback  = certificateSelectionCallback;
            _certificateValidationCallback = certificateValidationCallback;
            _passwordCallback = passwordCallback;

            _properties["Ice.RetryIntervals"] = "-1";
        }
Ejemplo n.º 12
0
        public static IInvocationObserver?get(Ice.IObjectPrx proxy, string op, Dictionary <string, string>?context)
        {
            ICommunicatorObserver?obsv = proxy.Communicator.Observer;

            if (obsv != null)
            {
                IInvocationObserver observer;
                if (context == null)
                {
                    observer = obsv.GetInvocationObserver(proxy, op, _emptyContext);
                }
                else
                {
                    observer = obsv.GetInvocationObserver(proxy, op, context);
                }
                if (observer != null)
                {
                    observer.Attach();
                }
                return(observer);
            }
            return(null);
        }
Ejemplo n.º 13
0
            internal async ValueTask NextConnectorAsync()
            {
                System.Exception?lastException = null;
                for (int i = 0; i < _connectors.Count; ++i)
                {
                    ConnectorInfo connector = _connectors[i];
                    try
                    {
                        ICommunicatorObserver?obsv = _factory._communicator.Observer;
                        if (obsv != null)
                        {
                            _observer = obsv.GetConnectionEstablishmentObserver(connector.Endpoint,
                                                                                connector.Connector.ToString() !);
                            if (_observer != null)
                            {
                                _observer.Attach();
                            }
                        }

                        if (_factory._communicator.TraceLevels.Network >= 2)
                        {
                            _factory._communicator.Logger.Trace(_factory._communicator.TraceLevels.NetworkCat,
                                                                $"trying to establish {connector.Endpoint.Name} connection to " +
                                                                $"{connector.Connector}");
                        }

                        // TODO: Connection establishement code needs to be re-factored to use async/await
                        Connection connection = _factory.CreateConnection(connector.Connector.Connect(), connector);
                        await connection.StartAsync().ConfigureAwait(false);

                        if (_observer != null)
                        {
                            _observer.Detach();
                        }

                        _factory.FinishGetConnection(_connectors, connector, connection, this);
                        return;
                    }
                    catch (CommunicatorDestroyedException ex)
                    {
                        lastException = ex;
                        break; // No need to continue
                    }
                    catch (System.Exception ex)
                    {
                        if (_factory._communicator.TraceLevels.Network >= 2)
                        {
                            Debug.Assert(connector != null);
                            _factory._communicator.Logger.Trace(_factory._communicator.TraceLevels.NetworkCat,
                                                                $"failed to establish {connector.Endpoint.Name} connection to " +
                                                                $"{connector.Connector}\n{ex}");
                        }
                        if (_observer != null)
                        {
                            _observer.Failed(ex.GetType().FullName ?? "System.Exception");
                            _observer.Detach();
                        }
                        _factory.HandleConnectionException(ex, _hasMore || (i + 1) < _connectors.Count);
                        lastException = ex;
                    }
                }

                _factory.FinishGetConnection(_connectors, lastException !, this);
            }
Ejemplo n.º 14
0
        private async Task <OutgoingResponseFrame> DispatchAsync(
            OutgoingRequestFrame outgoingRequest,
            int requestId,
            CancellationToken cancel)
        {
            // Increase the direct count to prevent the object adapter from being destroyed while the dispatch is in
            // progress. This will also throw if the object adapter has been deactivated.
            _adapter.IncDirectCount();

            IDispatchObserver?dispatchObserver = null;

            try
            {
                var incomingRequest = new IncomingRequestFrame(outgoingRequest, _adapter.IncomingFrameSizeMax);
                var current         = new Current(_adapter, incomingRequest, oneway: requestId == 0, cancel);

                // Then notify and set dispatch observer, if any.
                ICommunicatorObserver?communicatorObserver = _adapter.Communicator.Observer;
                if (communicatorObserver != null)
                {
                    dispatchObserver = communicatorObserver.GetDispatchObserver(current,
                                                                                requestId,
                                                                                incomingRequest.Size);
                    dispatchObserver?.Attach();
                }

                OutgoingResponseFrame?outgoingResponseFrame = null;
                try
                {
                    IObject?servant = current.Adapter.Find(current.Identity, current.Facet);

                    if (servant == null)
                    {
                        throw new ObjectNotExistException(current.Identity, current.Facet, current.Operation);
                    }

                    ValueTask <OutgoingResponseFrame> vt = servant.DispatchAsync(incomingRequest, current);
                    if (requestId != 0)
                    {
                        // We don't use the cancelable WaitAsync for the await here. The asynchronous dispatch is
                        // not completed yet and we want to make sure the observer is detached only when the dispatch
                        // completes, not when the caller cancels the request.
                        outgoingResponseFrame = await vt.ConfigureAwait(false);

                        outgoingResponseFrame.Finish();
                        dispatchObserver?.Reply(outgoingResponseFrame.Size);
                    }
                }
                catch (Exception ex)
                {
                    RemoteException actualEx;
                    if (ex is RemoteException remoteEx && !remoteEx.ConvertToUnhandled)
                    {
                        actualEx = remoteEx;
                    }
                    else
                    {
                        actualEx = new UnhandledException(current.Identity, current.Facet, current.Operation, ex);
                    }

                    Incoming.ReportException(actualEx, dispatchObserver, current);

                    if (requestId != 0)
                    {
                        outgoingResponseFrame = new OutgoingResponseFrame(incomingRequest, actualEx);
                        outgoingResponseFrame.Finish();
                        dispatchObserver?.Reply(outgoingResponseFrame.Size);
                    }
                }