@@ -72,8 +72,9 @@ func (p watcherClientPair) Stop(drain bool) {
7272// https://github.com/grafana/loki/issues/8197, this Manager will be
7373// responsible for instantiating all client types: Logger, Multi and WAL.
7474type Manager struct {
75- clients []Client
76- pairs []watcherClientPair
75+ clients []Client
76+ pairs []watcherClientPair
77+ walWriter * wal.Writer
7778
7879 entries chan loki.Entry
7980 once sync.Once
@@ -82,20 +83,34 @@ type Manager struct {
8283}
8384
8485// NewManager creates a new Manager
85- func NewManager (metrics * Metrics , logger log.Logger , reg prometheus.Registerer , walCfg wal.Config , notifier WriterEventsNotifier , clientCfgs ... Config ) (* Manager , error ) {
86+ func NewManager (metrics * Metrics , logger log.Logger , reg prometheus.Registerer , walCfg wal.Config , clientCfgs ... Config ) (* Manager , error ) {
8687 var fake struct {}
8788
88- walWatcherMetrics := wal .NewWatcherMetrics (reg )
89- walMarkerMetrics := internal .NewMarkerMetrics (reg )
90- queueClientMetrics := NewQueueClientMetrics (reg )
91-
9289 if len (clientCfgs ) == 0 {
9390 return nil , fmt .Errorf ("at least one client config must be provided" )
9491 }
9592
96- clientsCheck := make (map [string ]struct {})
97- clients := make ([]Client , 0 , len (clientCfgs ))
98- pairs := make ([]watcherClientPair , 0 , len (clientCfgs ))
93+ var walWriter * wal.Writer
94+ if walCfg .Enabled {
95+ var err error
96+ walWriter , err = wal .NewWriter (walCfg , logger , reg )
97+ if err != nil {
98+ return nil , fmt .Errorf ("error creating wal writer: %w" , err )
99+ }
100+ }
101+
102+ var (
103+ walWatcherMetrics = wal .NewWatcherMetrics (reg )
104+ walMarkerMetrics = internal .NewMarkerMetrics (reg )
105+ queueClientMetrics = NewQueueClientMetrics (reg )
106+ )
107+
108+ var (
109+ clientsCheck = make (map [string ]struct {})
110+ clients = make ([]Client , 0 , len (clientCfgs ))
111+ pairs = make ([]watcherClientPair , 0 , len (clientCfgs ))
112+ )
113+
99114 for _ , cfg := range clientCfgs {
100115 // Don't allow duplicate clients, we have client specific metrics that need at least one unique label value (name).
101116 clientName := getClientName (cfg )
@@ -120,13 +135,13 @@ func NewManager(metrics *Metrics, logger log.Logger, reg prometheus.Registerer,
120135 return nil , fmt .Errorf ("error starting queue client: %w" , err )
121136 }
122137
138+ watcher := wal .NewWatcher (walCfg .Dir , clientName , walWatcherMetrics , queue , wlog , walCfg .WatchConfig , markerHandler )
139+
123140 // subscribe watcher's wal.WriteTo to writer events. This will make the writer trigger the cleanup of the wal.WriteTo
124141 // series cache whenever a segment is deleted.
125- notifier .SubscribeCleanup (queue )
126-
127- watcher := wal .NewWatcher (walCfg .Dir , clientName , walWatcherMetrics , queue , wlog , walCfg .WatchConfig , markerHandler )
142+ walWriter .SubscribeCleanup (queue )
128143 // subscribe watcher to wal write events
129- notifier .SubscribeWrite (watcher )
144+ walWriter .SubscribeWrite (watcher )
130145
131146 level .Debug (logger ).Log ("msg" , "starting WAL watcher for client" , "client" , clientName )
132147 watcher .Start ()
@@ -149,9 +164,10 @@ func NewManager(metrics *Metrics, logger log.Logger, reg prometheus.Registerer,
149164 }
150165 }
151166 manager := & Manager {
152- clients : clients ,
153- pairs : pairs ,
154- entries : make (chan loki.Entry ),
167+ clients : clients ,
168+ pairs : pairs ,
169+ walWriter : walWriter ,
170+ entries : make (chan loki.Entry ),
155171 }
156172
157173 if walCfg .Enabled {
@@ -187,6 +203,9 @@ func (m *Manager) startWithForward() {
187203}
188204
189205func (m * Manager ) Chan () chan <- loki.Entry {
206+ if m .walWriter != nil {
207+ return m .walWriter .Chan ()
208+ }
190209 return m .entries
191210}
192211
@@ -195,11 +214,15 @@ func (m *Manager) Stop() {
195214 m .StopWithDrain (false )
196215}
197216
198- // StopWithDrain will stop the manager, its Write-Ahead Log watchers, and clients accordingly. If drain is enabled,
217+ // StopWithDrain will stop the manager, its WalWriter, Write-Ahead Log watchers, and clients accordingly. If drain is enabled,
199218// the Watchers will attempt to drain the WAL completely.
200- // The shutdown procedure first stops the Watchers, allowing them to flush as much data into the clients as possible. Then
201- // the clients are shut down accordingly.
219+ // The shutdown procedure first stops the WalWriter, Then Watchers, allowing them to flush as much data into the clients as possible.
220+ // Lastly the clients are shut down accordingly.
202221func (m * Manager ) StopWithDrain (drain bool ) {
222+ if m .walWriter != nil {
223+ m .walWriter .Stop ()
224+ }
225+
203226 // first stop the receiving channel
204227 m .once .Do (func () { close (m .entries ) })
205228 m .wg .Wait ()
0 commit comments