graphiti 1.5.3 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e73347300b459ef189141f41dc56748767b8dfedc7b6b27965da4fa338cdd90
4
- data.tar.gz: 2c3dc9a6dc41aa072360fb20c79ec11d7b9663334f023369f32e0822f98f640b
3
+ metadata.gz: 5804a85dd275e9e5f160f08c4b4f49f151e4fddc1178a90a66f2a28ef88bd647
4
+ data.tar.gz: 1962ef04b5278bb720e971dca2112e20a9bbb493bbc9428f1b3ca57737e3250f
5
5
  SHA512:
6
- metadata.gz: 8144b492f5a20b239caf5616d35a4022cb7df4acc56af08feeae987fdf5ab4157c713f7275ee67947cc993bc8618aeee4808de20da7c27020b79bb5aa4151919
7
- data.tar.gz: 116b84208d8095eb7f07ba965a3fe94dcd683568bc1c658edd0be8ae635a2e45e4edcfa109dec80723698b502be6964ea7caae2930ff0f53f0b31db05803a16e
6
+ metadata.gz: 95c66786278dea821516ebb0b1f47a249e419a681ac0f461006adfe427fe0d81e9591017187611a7f49dcf14479df47d3501e29c97d4b8fbb9f3c2fc988bc615
7
+ data.tar.gz: 8ccab36d491f3930335d2b42fbddcf18b94403ef7825a80edf33020ba618ff688106719ea49c2f0df798263f12b51b5e0959154ebf85a18737d15c507b024c19
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  graphiti changelog
2
2
 
3
+ # [1.6.0](https://github.com/graphiti-api/graphiti/compare/v1.5.3...v1.6.0) (2024-03-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * add thread pool and concurrency_max_threads configuration option ([#470](https://github.com/graphiti-api/graphiti/issues/470)) ([697d761](https://github.com/graphiti-api/graphiti/commit/697d76172adec24cd7e7522300c8335233fdcc36))
9
+
3
10
  ## [1.5.3](https://github.com/graphiti-api/graphiti/compare/v1.5.2...v1.5.3) (2024-03-18)
4
11
 
5
12
 
@@ -8,6 +8,20 @@ module Graphiti
8
8
  # Defaults to false OR if classes are cached (Rails-only)
9
9
  attr_accessor :concurrency
10
10
 
11
+ # This number must be considered in accordance with the database
12
+ # connection pool size configured in `database.yml`. The connection
13
+ # pool should be large enough to accommodate both the foreground
14
+ # threads (ie. web server or job worker threads) and background
15
+ # threads. For each process, Graphiti will create one global
16
+ # executor that uses this many threads to sideload resources
17
+ # asynchronously. Thus, the pool size should be at least
18
+ # `thread_count + concurrency_max_threads + 1`. For example, if your
19
+ # web server has a maximum of 3 threads, and
20
+ # `concurrency_max_threads` is set to 4, then your pool size should
21
+ # be at least 8.
22
+ # @return [Integer] Maximum number of threads to use when fetching sideloads concurrently
23
+ attr_accessor :concurrency_max_threads
24
+
11
25
  attr_accessor :respond_to
12
26
  attr_accessor :context_for_endpoint
13
27
  attr_accessor :links_on_demand
@@ -26,6 +40,7 @@ module Graphiti
26
40
  def initialize
27
41
  @raise_on_missing_sideload = true
28
42
  @concurrency = false
43
+ @concurrency_max_threads = 4
29
44
  @respond_to = [:json, :jsonapi, :xml]
30
45
  @links_on_demand = false
31
46
  @pagination_links_on_demand = false
@@ -2,6 +2,23 @@ module Graphiti
2
2
  class Scope
3
3
  attr_accessor :object, :unpaginated_object
4
4
  attr_reader :pagination
5
+
6
+ @thread_pool_executor_mutex = Mutex.new
7
+
8
+ def self.thread_pool_executor
9
+ return @thread_pool_executor if @thread_pool_executor
10
+
11
+ concurrency = Graphiti.config.concurrency_max_threads || 4
12
+ @thread_pool_executor_mutex.synchronize do
13
+ @thread_pool_executor ||= Concurrent::ThreadPoolExecutor.new(
14
+ min_threads: 0,
15
+ max_threads: concurrency,
16
+ max_queue: concurrency * 4,
17
+ fallback_policy: :caller_runs
18
+ )
19
+ end
20
+ end
21
+
5
22
  def initialize(object, resource, query, opts = {})
6
23
  @object = object
7
24
  @resource = resource
@@ -49,7 +66,7 @@ module Graphiti
49
66
  @resource.adapter.close if concurrent
50
67
  }
51
68
  if concurrent
52
- promises << Concurrent::Promise.execute(&resolve_sideload)
69
+ promises << Concurrent::Promise.execute(executor: self.class.thread_pool_executor, &resolve_sideload)
53
70
  else
54
71
  resolve_sideload.call
55
72
  end
@@ -1,3 +1,3 @@
1
1
  module Graphiti
2
- VERSION = "1.5.3"
2
+ VERSION = "1.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiti
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-18 00:00:00.000000000 Z
11
+ date: 2024-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-serializable