raptor 0.22.3 → 0.24.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/Dockerfile +10 -2
  4. data/README.md +183 -61
  5. data/docs/assets/profile_picture.png +0 -0
  6. data/docs/assets/startup_output.svg +37 -0
  7. data/docs/raptor-vs-puma.md +104 -424
  8. data/docs/talk.md +1388 -0
  9. data/ext/raptor_bpf/reuseport_select.bpf.c +18 -9
  10. data/ext/raptor_http/extconf.rb +2 -0
  11. data/ext/raptor_http/raptor_http.c +165 -234
  12. data/ext/raptor_http2/raptor_http2.c +272 -223
  13. data/ext/raptor_native/raptor_native.c +38 -20
  14. data/lib/rackup/handler/raptor.rb +14 -12
  15. data/lib/raptor/binder.rb +12 -12
  16. data/lib/raptor/cli.rb +19 -18
  17. data/lib/raptor/cluster.rb +120 -74
  18. data/lib/raptor/control_server.rb +5 -2
  19. data/lib/raptor/detached_body.rb +6 -2
  20. data/lib/raptor/http.rb +7 -6
  21. data/lib/raptor/http1.rb +281 -234
  22. data/lib/raptor/http2.rb +356 -276
  23. data/lib/raptor/plugin.rb +98 -0
  24. data/lib/raptor/reactor.rb +138 -148
  25. data/lib/raptor/reuseport_bpf.rb +62 -38
  26. data/lib/raptor/server.rb +45 -34
  27. data/lib/raptor/stats.rb +15 -3
  28. data/lib/raptor/thread_locals.rb +4 -3
  29. data/lib/raptor/version.rb +1 -1
  30. data/sig/generated/rackup/handler/raptor.rbs +2 -1
  31. data/sig/generated/raptor/binder.rbs +9 -9
  32. data/sig/generated/raptor/cli.rbs +6 -6
  33. data/sig/generated/raptor/cluster.rbs +18 -5
  34. data/sig/generated/raptor/control_server.rbs +2 -1
  35. data/sig/generated/raptor/detached_body.rbs +5 -1
  36. data/sig/generated/raptor/http.rbs +3 -5
  37. data/sig/generated/raptor/http1.rbs +119 -102
  38. data/sig/generated/raptor/http2.rbs +204 -190
  39. data/sig/generated/raptor/plugin.rbs +52 -0
  40. data/sig/generated/raptor/reactor.rbs +107 -118
  41. data/sig/generated/raptor/reuseport_bpf.rbs +54 -17
  42. data/sig/generated/raptor/server.rbs +26 -26
  43. data/sig/generated/raptor/stats.rbs +3 -2
  44. data/sig/generated/raptor/thread_locals.rbs +4 -3
  45. metadata +6 -2
  46. data/docs/brisrails-talk.md +0 -2398
@@ -0,0 +1,98 @@
1
+ # rbs_inline: enabled
2
+ # frozen_string_literal: true
3
+
4
+ module Raptor
5
+ # An extension, loaded from `raptor/plugin/<name>` or
6
+ # registered explicitly by application code.
7
+ #
8
+ class Plugin
9
+ class UnknownPlugin < LoadError; end
10
+
11
+ # @rbs self.@registry: Hash[String, singleton(Plugin)]
12
+ @registry = {}
13
+
14
+ # Registers a plugin class under a name.
15
+ #
16
+ # @rbs (String | Symbol name, singleton(Plugin) plugin) -> void
17
+ def self.register(name, plugin)
18
+ @registry[name.to_s] = plugin
19
+ end
20
+
21
+ # Defines and registers a plugin without a named subclass.
22
+ #
23
+ # @rbs (String | Symbol name) { () -> void } -> singleton(Plugin)
24
+ def self.create(name, &block)
25
+ plugin = Class.new(self, &block)
26
+ register(name, plugin)
27
+ plugin
28
+ end
29
+
30
+ # Loads a registered plugin, requiring its conventional path if needed.
31
+ #
32
+ # @rbs (String | Symbol name) -> Plugin
33
+ def self.load(name)
34
+ name = name.to_s
35
+ path = "raptor/plugin/#{name}"
36
+ unless @registry.key?(name)
37
+ begin
38
+ require path
39
+ rescue LoadError => error
40
+ raise UnknownPlugin, "Unable to find plugin #{name.inspect}" if error.path == path
41
+
42
+ raise
43
+ end
44
+ end
45
+
46
+ plugin = @registry[name]
47
+ raise UnknownPlugin, "#{path} did not register plugin #{name.inspect}" unless plugin
48
+
49
+ plugin.new
50
+ end
51
+
52
+ # @rbs @threads: Array[Thread]?
53
+
54
+ # Starts in the master before workers fork. Override to open resources
55
+ # and append callbacks to the cluster's lifecycle hook arrays.
56
+ #
57
+ # @rbs (Cluster cluster) -> void
58
+ def start(cluster)
59
+ end
60
+
61
+ # Stops in the master after workers exit, including before hot restart.
62
+ # Also called if startup fails, so resources may be only partly opened.
63
+ #
64
+ # @rbs () -> void
65
+ def stop
66
+ end
67
+
68
+ # Runs a block on a master-owned thread. Raptor stops and joins these
69
+ # threads after calling `stop`; use `ensure` in the block for cleanup.
70
+ #
71
+ # @rbs () { () -> void } -> Thread
72
+ def in_background(&block)
73
+ @threads ||= []
74
+ @threads << Thread.new do
75
+ Thread.current.name = "Plugin #{self.class}"
76
+ block.call
77
+ end
78
+ @threads.last
79
+ end
80
+
81
+ # Calls the plugin's stop callback and joins its background threads.
82
+ #
83
+ # @rbs () -> void
84
+ def shutdown
85
+ stop
86
+ ensure
87
+ threads = @threads || []
88
+ threads.each(&:kill)
89
+ error = nil
90
+ threads.each do |thread|
91
+ thread.join
92
+ rescue StandardError => thread_error
93
+ error ||= thread_error
94
+ end
95
+ raise error if error
96
+ end
97
+ end
98
+ end