/
data_store_status_provider.go
80 lines (74 loc) · 4.15 KB
/
data_store_status_provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package interfaces
// DataStoreStatusProvider is an interface for querying the status of a persistent data store.
//
// An implementation of this interface is returned by
// [github.com/launchdarkly/go-server-sdk/v6.LDClient.GetDataStoreStatusProvider]. Application code
// should not implement this interface.
//
// There are two ways to interact with the data store status. One is to simply get the current status; if
// its Available property is true, then the store is working normally.
//
// status := client.GetDataStoreStatusProvider().GetStatus()
// isValid = status.Available
//
// Second, you can use AddStatusListener to get a channel that provides a status update whenever the
// data store has an error or starts working again.
//
// statusCh := client.GetDataStoreStatusProvider().AddStatusListener()
// go func() {
// for newStatus := range statusCh {
// log.Printf("data store Available is %t", newStatus.Available)
// }
// }()
type DataStoreStatusProvider interface {
// GetStatus returns the current status of the store.
//
// This is only meaningful for persistent stores, or any other DataStore implementation that makes use of
// the reporting mechanism that is provided by DataStoreUpdateSink. For the default in-memory store, the
// status will always be reported as "available".
GetStatus() DataStoreStatus
// Indicates whether the current data store implementation supports status monitoring.
//
// This is normally true for all persistent data stores, and false for the default in-memory store. A true
// value means that any listeners added with AddStatusListener() can expect to be notified if there is
// there is any error in storing data, and then notified again when the error condition is resolved. A
// false value means that the status is not meaningful and listeners should not expect to be notified.
IsStatusMonitoringEnabled() bool
// AddStatusListener subscribes for notifications of status changes. The returned channel will receive a
// new DataStoreStatus value for any change in status.
//
// Applications may wish to know if there is an outage in a persistent data store, since that could mean
// that flag evaluations are unable to get the flag data from the store (unless it is currently cached) and
// therefore might return default values.
//
// If the SDK receives an exception while trying to query or update the data store, then it publishes a
// DataStoreStatus where Available is false, to indicate that the store appears to be offline, and begins
// polling the store at intervals until a query succeeds. Once it succeeds, it publishes a new status where
// Available is true.
//
// If the data store implementation does not support status tracking, such as if you are using the default
// in-memory store rather than a persistent store, it will return a channel that never receives values.
//
// It is the caller's responsibility to consume values from the channel. Allowing values to accumulate in
// the channel can cause an SDK goroutine to be blocked. If you no longer need the channel, call
// RemoveStatusListener.
AddStatusListener() <-chan DataStoreStatus
// RemoveStatusListener unsubscribes from notifications of status changes. The specified channel must be
// one that was previously returned by AddStatusListener(); otherwise, the method has no effect.
RemoveStatusListener(<-chan DataStoreStatus)
}
// DataStoreStatus contains information about the status of a data store, provided by [DataStoreStatusProvider].
type DataStoreStatus struct {
// Available is true if the SDK believes the data store is now available.
//
// This property is normally true. If the SDK receives an exception while trying to query or update the
// data store, then it sets this property to false (notifying listeners, if any) and polls the store at
// intervals until a query succeeds. Once it succeeds, it sets the property back to true (again
// notifying listeners).
Available bool
// NeedsRefresh is true if the store may be out of date due to a previous outage, so the SDK should
// attempt to refresh all feature flag data and rewrite it to the store.
//
// This property is not meaningful to application code.
NeedsRefresh bool
}