@@ -109,18 +109,39 @@ func (logger *WebsocketLivelogger) SendLog(lines *protocol.TimelineRecordFeedLin
109109 return wsjson .Write (ctx , ws , lines )
110110}
111111
112+ func (logger * WebsocketLivelogger ) ReConnectAndSendLog (lines * protocol.TimelineRecordFeedLinesWrapper ) error {
113+ if err := logger .Connect (); err != nil {
114+ return err
115+ }
116+ if err := logger .SendLog (lines ); err != nil {
117+ return err
118+ }
119+ return nil
120+ }
121+
122+ type currentLogger struct {
123+ logger LiveLogger
124+ wsLogger * WebsocketLivelogger
125+ }
126+
127+ func (c * currentLogger ) isValid () bool {
128+ return c != nil && c .logger != nil
129+ }
130+
112131type WebsocketLiveloggerWithFallback struct {
113132 JobRequest * protocol.AgentJobRequestMessage
114133 Connection * protocol.VssConnection
115- currentLogger atomic.Pointer [LiveLogger ]
134+ currentLogger atomic.Pointer [currentLogger ]
116135 FeedStreamURL string
117136 ForceWebsock bool
118137}
119138
120- func (logger * WebsocketLiveloggerWithFallback ) initializeVssLogger () LiveLogger {
121- l := & VssLiveLogger {
122- JobRequest : logger .JobRequest ,
123- Connection : logger .Connection ,
139+ func (logger * WebsocketLiveloggerWithFallback ) initializeVssLogger () * currentLogger {
140+ l := & currentLogger {
141+ logger : & VssLiveLogger {
142+ JobRequest : logger .JobRequest ,
143+ Connection : logger .Connection ,
144+ },
124145 }
125146 _ = logger .replace (l ) // Ignore error for cleanup
126147 return l
@@ -130,7 +151,7 @@ func (logger *WebsocketLiveloggerWithFallback) InitializeVssLogger() {
130151 logger .initializeVssLogger ()
131152}
132153
133- func (logger * WebsocketLiveloggerWithFallback ) initialize () LiveLogger {
154+ func (logger * WebsocketLiveloggerWithFallback ) initialize () * currentLogger {
134155 if logger .FeedStreamURL != "" {
135156 wslogger := & WebsocketLivelogger {
136157 JobRequest : logger .JobRequest ,
@@ -139,8 +160,12 @@ func (logger *WebsocketLiveloggerWithFallback) initialize() LiveLogger {
139160 }
140161 err := wslogger .Connect ()
141162 if err == nil {
142- _ = logger .replace (wslogger ) // Ignore error for cleanup
143- return wslogger
163+ cl := & currentLogger {
164+ logger : wslogger ,
165+ wsLogger : wslogger ,
166+ }
167+ _ = logger .replace (cl ) // Ignore error for cleanup
168+ return cl
144169 } else if logger .Connection .Trace {
145170 fmt .Printf ("Failed to connect to websocket %s, fallback to vsslogger\n " , err .Error ())
146171 }
@@ -170,65 +195,61 @@ func (e *errorLogger) SendLog(lines *protocol.TimelineRecordFeedLinesWrapper) er
170195 return ErrMissingLoggerConnection
171196}
172197
173- func makePointer [T any ](p T ) * T {
174- return & p
175- }
176-
177- func getPointer [T any ](p * T ) T {
178- if p == nil {
179- var zero T
180- return zero
181- }
182- return * p
183- }
184-
185- func (logger * WebsocketLiveloggerWithFallback ) replace (n LiveLogger ) error {
186- if currentLogger := logger .currentLogger .Swap (makePointer (n )); getPointer (currentLogger ) != nil {
187- return (* currentLogger ).Close ()
198+ func (logger * WebsocketLiveloggerWithFallback ) replace (n * currentLogger ) error {
199+ if currentLogger := logger .currentLogger .Swap (n ); currentLogger .isValid () {
200+ return currentLogger .logger .Close ()
188201 }
189202 return nil
190203}
191204
192205func (logger * WebsocketLiveloggerWithFallback ) Close () error {
193- return logger .replace (& errorLogger {})
206+ return logger .replace (& currentLogger {
207+ logger : & errorLogger {},
208+ })
194209}
195210
196211func (logger * WebsocketLiveloggerWithFallback ) sendLogFallback (
197- err error , reason string , wrapper * protocol.TimelineRecordFeedLinesWrapper ,
212+ err error , wrapper * protocol.TimelineRecordFeedLinesWrapper ,
198213) error {
199214 if ! logger .ForceWebsock {
200215 if logger .Connection .Trace {
201- fmt .Printf ("Failed to %s to websocket %s, fallback to vsslogger\n " , reason , err .Error ())
216+ fmt .Printf ("Failed to send to websocket %s, fallback to vsslogger\n " , err .Error ())
202217 }
203218 currentLogger := logger .initializeVssLogger ()
204219 if currentLogger == nil {
205- return fmt .Errorf ("failed to initialize VSS logger after websocket %s failure: %w" , reason , err )
220+ return fmt .Errorf ("failed to initialize VSS logger after websocket send failure: %w" , err )
206221 }
207- return currentLogger .SendLog (wrapper )
222+ return currentLogger .logger . SendLog (wrapper )
208223 }
209224 return err
210225}
211226
227+ func (logger * WebsocketLiveloggerWithFallback ) getOrInitializeLogger () (* currentLogger , error ) {
228+ currentLogger := logger .currentLogger .Load ()
229+ if currentLogger .isValid () {
230+ return currentLogger , nil
231+ }
232+ currentLogger = logger .initialize ()
233+ if currentLogger .isValid () {
234+ return currentLogger , nil
235+ }
236+ return nil , fmt .Errorf ("failed to initialize live logger: no logger instance available (ForceWebsock=%t)" , logger .ForceWebsock )
237+ }
238+
212239func (logger * WebsocketLiveloggerWithFallback ) SendLog (wrapper * protocol.TimelineRecordFeedLinesWrapper ) error {
213- currentLogger := getPointer (logger .currentLogger .Load ())
214- if currentLogger == nil {
215- currentLogger = logger .initialize ()
216- if currentLogger == nil {
217- return fmt .Errorf ("failed to initialize live logger: no logger instance available (ForceWebsock=%t)" , logger .ForceWebsock )
218- }
240+ currentLogger , err := logger .getOrInitializeLogger ()
241+ if err != nil {
242+ return err
219243 }
220- err : = currentLogger .SendLog (wrapper )
244+ err = currentLogger . logger .SendLog (wrapper )
221245 if err != nil {
222246 if logger .Connection .Trace {
223247 fmt .Printf ("Failed to send webconsole log %s\n " , err .Error ())
224248 }
225- if wslogger , ok := currentLogger .(* WebsocketLivelogger ); ok {
226- if err = wslogger .Connect (); err != nil {
227- return logger .sendLogFallback (err , "reconnect" , wrapper )
228- }
229- err = currentLogger .SendLog (wrapper )
230- if err != nil {
231- return logger .sendLogFallback (err , "send" , wrapper )
249+ wsLogger := currentLogger .wsLogger
250+ if wsLogger != nil {
251+ if err = currentLogger .wsLogger .ReConnectAndSendLog (wrapper ); err != nil {
252+ return logger .sendLogFallback (err , wrapper )
232253 }
233254 return nil
234255 }
0 commit comments