public void Multi_Threaded_ApiFactory_Tasks(int quoteCount, int threadCount) { var config = ApiConfigurationBuilder.Build("secrets.json"); var provider = new ClientCredentialsFlowTokenProvider(config); var date = new DateTimeOffset(2018, 1, 1, 0, 0, 0, TimeSpan.Zero); var request = Enumerable.Range(0, quoteCount).Select(i => new UpsertQuoteRequest( new QuoteId( new QuoteSeriesId( provider: "DataScope", priceSource: "BankA", instrumentId: "BBG000B9XRY4", instrumentIdType: QuoteSeriesId.InstrumentIdTypeEnum.Figi, quoteType: QuoteSeriesId.QuoteTypeEnum.Price, field: "mid"), effectiveAt: date.AddDays(i)), metricValue: new MetricValue( value: 199.23m, unit: "USD"), lineage: "InternalSystem")).ToDictionary(k => k.QuoteId.EffectiveAt.ToString(), v => v); var tasks = Enumerable.Range(0, threadCount).Select(x => Task.Run(() => { var factory = LusidApiFactoryBuilder.Build(config.ApiUrl, provider); var result = factory.Api <IQuotesApi>().UpsertQuotes("mt-scope", request); Assert.That(result.Failed, Is.Empty); Console.WriteLine($"{DateTimeOffset.UtcNow} {Thread.CurrentThread.ManagedThreadId} {result.Values.Count}"); })); Task.WaitAll(tasks.ToArray()); }
public void LinuxSocketLeakTest() // See DEV-7152 { ApiConfiguration config = ApiConfigurationBuilder.Build("secrets.json"); var provider = new ClientCredentialsFlowTokenProvider(config); var api = BuildApi(); api.CreatePortfolioGroup("sdktest", new CreatePortfolioGroupRequest("TestGroup", displayName: "TestGroup")); // This loop should eventually throw a SocketException: "Address already in use" once all the sockets have been exhausted for (int i = 0; i < 50_000; i++) { api = BuildApi(); PortfolioGroup result = api.GetPortfolioGroup("sdktest", "TestGroup"); Assert.That(result, Is.Not.Null); // Option 1: force dispose of ApiClient //api.Configuration.ApiClient.Dispose(); // Option 2: force all finalizers to run if (i % 100 == 0) { GC.Collect(); GC.WaitForPendingFinalizers(); } } /*** Local Functions ***/ IPortfolioGroupsApi BuildApi() { // An instance of HttpClient is created within LusidApiFactory.Configuration.ApiClient.RestClient // which wasn't being disposed ILusidApiFactory factory = LusidApiFactoryBuilder.Build(config.ApiUrl, provider); IPortfolioGroupsApi api = factory.Api <IPortfolioGroupsApi>(); return(api); } }
/// <summary> /// Create an IAccessApiFactory using the specified configuration file. For details on the format of the configuration file see https://support.lusid.com/getting-started-with-apis-sdks /// </summary> public static IAccessApiFactory Build(string apiSecretsFilename) { var apiConfig = ApiConfigurationBuilder.Build(apiSecretsFilename); return(new AccessApiFactory(apiConfig)); }