Exemple #1
0
        public override async Task InitNdmExtension(NdmExtension request, IServerStreamWriter <NdmQuery> responseStream,
                                                    ServerCallContext context)
        {
            var peer = context.Peer;

            if (_logger.IsInfo)
            {
                _logger.Info($"Received InitNdmExtension() GRPC call from peer: '{peer}'. Extension: '{request.Name}', type: '{request.Type}', accept all headers: {request.AcceptAllHeaders}, accepted headers: {request.AcceptedHeaders}.");
            }
            if (string.IsNullOrWhiteSpace(request.Name) || string.IsNullOrWhiteSpace(request.Type))
            {
                if (_logger.IsWarn)
                {
                    _logger.Warn($"Extension name and type cannot be empty.");
                }
                return;
            }

            var extension = _ndmExtensions.AddOrUpdate(request.Name.ToLowerInvariant(),
                                                       _ => new NdmExtensionDetails(request),
                                                       (_, e) => e);

            extension.Connect();
            try
            {
                var acceptedHeaders = request.AcceptedHeaders?.Where(h => !string.IsNullOrEmpty(h))
                                      .Select(h => new Keccak(h)) ?? Enumerable.Empty <Keccak>();
                foreach (var headerId in acceptedHeaders)
                {
                    _dataHeadersExtensions.TryAdd(headerId, extension);
                }
            }
            catch (Exception ex)
            {
                if (_logger.IsError)
                {
                    _logger.Error($"Received an invalid header ID from peer: '{peer}'", ex);
                }
                return;
            }

            QueryArgs query = null;

            try
            {
                while (true)
                {
                    query = extension.Queries.Take();
                    if (_logger.IsTrace)
                    {
                        _logger.Trace($"Sending query for header: '{query.HeaderId}', deposit: '{query.DepositId}', args: {string.Join(", ", query.Args)}, iterations: {query.Iterations}");
                    }
                    await responseStream.WriteAsync(new NdmQuery
                    {
                        Iterations = query.Iterations,
                        HeaderId   = query.HeaderId.ToString(),
                        DepositId  = query.DepositId.ToString(),
                        Args       = { query.Args }
                    });
                }
            }
            catch (Exception ex)
            {
                if (_logger.IsError)
                {
                    _logger.Error(ex.ToString(), ex);
                }
                if (!(query is null))
                {
                    extension.Queries.Add(query);
                    if (_logger.IsInfo)
                    {
                        _logger.Info($"Queued again query for header: '{query.HeaderId}', deposit: '{query.DepositId}'.");
                    }
                }
            }

            if (_logger.IsInfo)
            {
                _logger.Info($"Finished using an extension: '{request.Name}' [{request.Type}].");
            }
        }
Exemple #2
0
 public NdmExtensionDetails(NdmExtension extension)
 {
     Extension = extension;
     Queries   = new BlockingCollection <QueryArgs>();
 }