@@ -268,7 +268,12 @@ func (s *Server) JetStreamSnapshotMeta() error {
268
268
return errNotLeader
269
269
}
270
270
271
- return meta .InstallSnapshot (js .metaSnapshot ())
271
+ snap , err := js .metaSnapshot ()
272
+ if err != nil {
273
+ return err
274
+ }
275
+
276
+ return meta .InstallSnapshot (snap )
272
277
}
273
278
274
279
func (s * Server ) JetStreamStepdownStream (account , stream string ) error {
@@ -1341,7 +1346,10 @@ func (js *jetStream) monitorCluster() {
1341
1346
}
1342
1347
// For the meta layer we want to snapshot when asked if we need one or have any entries that we can compact.
1343
1348
if ne , _ := n .Size (); ne > 0 || n .NeedSnapshot () {
1344
- if err := n .InstallSnapshot (js .metaSnapshot ()); err == nil {
1349
+ snap , err := js .metaSnapshot ()
1350
+ if err != nil {
1351
+ s .Warnf ("Error generating JetStream cluster snapshot: %v" , err )
1352
+ } else if err = n .InstallSnapshot (snap ); err == nil {
1345
1353
lastSnapTime = time .Now ()
1346
1354
} else if err != errNoSnapAvailable && err != errNodeClosed {
1347
1355
s .Warnf ("Error snapshotting JetStream cluster state: %v" , err )
@@ -1538,7 +1546,7 @@ func (js *jetStream) clusterStreamConfig(accName, streamName string) (StreamConf
1538
1546
return StreamConfig {}, false
1539
1547
}
1540
1548
1541
- func (js * jetStream ) metaSnapshot () []byte {
1549
+ func (js * jetStream ) metaSnapshot () ( []byte , error ) {
1542
1550
start := time .Now ()
1543
1551
js .mu .RLock ()
1544
1552
s := js .srv
@@ -1578,16 +1586,22 @@ func (js *jetStream) metaSnapshot() []byte {
1578
1586
1579
1587
if len (streams ) == 0 {
1580
1588
js .mu .RUnlock ()
1581
- return nil
1589
+ return nil , nil
1582
1590
}
1583
1591
1584
1592
// Track how long it took to marshal the JSON
1585
1593
mstart := time .Now ()
1586
- b , _ := json .Marshal (streams )
1594
+ b , err := json .Marshal (streams )
1587
1595
mend := time .Since (mstart )
1588
1596
1589
1597
js .mu .RUnlock ()
1590
1598
1599
+ // Must not be possible for a JSON marshalling error to result
1600
+ // in an empty snapshot.
1601
+ if err != nil {
1602
+ return nil , err
1603
+ }
1604
+
1591
1605
// Track how long it took to compress the JSON
1592
1606
cstart := time .Now ()
1593
1607
snap := s2 .Encode (nil , b )
@@ -1597,7 +1611,7 @@ func (js *jetStream) metaSnapshot() []byte {
1597
1611
s .rateLimitFormatWarnf ("Metalayer snapshot took %.3fs (streams: %d, consumers: %d, marshal: %.3fs, s2: %.3fs, uncompressed: %d, compressed: %d)" ,
1598
1612
took .Seconds (), nsa , nca , mend .Seconds (), cend .Seconds (), len (b ), len (snap ))
1599
1613
}
1600
- return snap
1614
+ return snap , nil
1601
1615
}
1602
1616
1603
1617
func (js * jetStream ) applyMetaSnapshot (buf []byte , ru * recoveryUpdates , isRecovering bool ) error {
0 commit comments