@@ -19,12 +19,14 @@ package store
19
19
20
20
import (
21
21
"bytes"
22
+ "encoding/binary"
22
23
"encoding/json"
23
24
"errors"
24
25
"fmt"
25
26
"github.com/casbin/casbin-mesh/pkg/adapter"
26
27
"github.com/casbin/casbin-mesh/pkg/auth"
27
28
"io"
29
+ "io/ioutil"
28
30
"log"
29
31
"sync"
30
32
"time"
@@ -302,6 +304,15 @@ type persistData struct {
302
304
CredentialStore []byte
303
305
}
304
306
307
+ // SnapshotHdr is used to identify the snapshot protocol version.
308
+ // length 8 bytes
309
+ func SnapshotHdr () []byte {
310
+ hdr := [8 ]byte {}
311
+ // protocol version
312
+ binary .LittleEndian .PutUint16 (hdr [0 :], uint16 (1 ))
313
+ return hdr [:]
314
+ }
315
+
305
316
// Persist implements persistence of states
306
317
func (f fsmSnapshot ) Persist (sink raft.SnapshotSink ) error {
307
318
defer func () {
@@ -318,7 +329,7 @@ func (f fsmSnapshot) Persist(sink raft.SnapshotSink) error {
318
329
return err
319
330
}
320
331
// JSON the cluster Enforcers.
321
- if _ , err := sink .Write (data ); err != nil {
332
+ if _ , err := sink .Write (append ( SnapshotHdr (), data ... ) ); err != nil {
322
333
return err
323
334
}
324
335
@@ -383,7 +394,8 @@ func (s *Store) Snapshot() (raft.FSMSnapshot, error) {
383
394
func (s * Store ) Restore (closer io.ReadCloser ) error {
384
395
var err error
385
396
var data persistData
386
- err = json .NewDecoder (closer ).Decode (& data )
397
+ snap , err := ioutil .ReadAll (closer )
398
+ err = json .Unmarshal (snap [8 :], & data )
387
399
if err != nil {
388
400
s .logger .Println ("failed to decode restore data" , err )
389
401
return err
0 commit comments