@@ -13,6 +13,16 @@ import (
13
13
// values of a SubServerStatus's fields.
14
14
type SubServerOption func (status * SubServerStatus )
15
15
16
+ // WithIsReadyOverride is a functional option that can be used to set a callback
17
+ // function that is used to check if a system is ready _iff_ the system running
18
+ // status is not yet true. The call-back will be passed the request URI along
19
+ // with any manual status that has been set for the subsystem.
20
+ func WithIsReadyOverride (fn func (string , string ) (bool , bool )) SubServerOption {
21
+ return func (status * SubServerStatus ) {
22
+ status .isReadyOverride = fn
23
+ }
24
+ }
25
+
16
26
// SubServerStatus represents the status of a sub-server.
17
27
type SubServerStatus struct {
18
28
// Disabled is true if the sub-server is available in the LiT bundle but
@@ -32,6 +42,15 @@ type SubServerStatus struct {
32
42
33
43
// Err will be a non-empty string if the sub-server failed to start.
34
44
Err string
45
+
46
+ // isReadyOverride is a call back that, when set and only if `running`
47
+ // is not yet true, will be used to determine if a system is ready for
48
+ // a call. We will pass the request URI to this method along with the
49
+ // `manualStatus`. The first returned boolean is true if the system
50
+ // should be seen as ready and the second is true if the override does
51
+ // handle the given request. If it does not, then we will fall back to
52
+ // our normal is-ready check.
53
+ isReadyOverride func (string , string ) (bool , bool )
35
54
}
36
55
37
56
// newSubServerStatus constructs a new SubServerStatus.
@@ -60,6 +79,41 @@ func NewStatusManager() *Manager {
60
79
}
61
80
}
62
81
82
+ // IsSystemReady shows if the given sub-server ready to handle the a request for
83
+ // the passed request URI. The first returned boolean is true if the system
84
+ // is ready to handle the request. The second returned boolean is true if the
85
+ // system has been disabled.
86
+ func (s * Manager ) IsSystemReady (name , req string ) (bool , bool , error ) {
87
+ s .mu .RLock ()
88
+ defer s .mu .RUnlock ()
89
+
90
+ server , ok := s .subServers [name ]
91
+ if ! ok {
92
+ return false , false , errors .New ("a sub-server with " +
93
+ "name %s has not yet been registered" )
94
+ }
95
+
96
+ if server .Disabled {
97
+ return false , true , nil
98
+ }
99
+
100
+ // If there is no override for this server or if the server is already
101
+ // running then we just return the 'running' status.
102
+ if server .isReadyOverride == nil || server .Running {
103
+ return server .Running , false , nil
104
+ }
105
+
106
+ // Otherwise, we check the override to see if this request is handled
107
+ // by the override and if it is, then if the override permits this call.
108
+ isReady , handled := server .isReadyOverride (req , server .customStatus )
109
+ if handled {
110
+ return isReady , false , nil
111
+ }
112
+
113
+ // Otherwise, we just return the running status.
114
+ return server .Running , false , nil
115
+ }
116
+
63
117
// SubServerStatus queries the current status of a given sub-server.
64
118
//
65
119
// NOTE: this is part of the litrpc.StatusServer interface.
0 commit comments