@@ -111,29 +111,44 @@ func importSnapshotToDatastoreWithTestingPowerTableFrequency(ctx context.Context
111
111
return err
112
112
}
113
113
ptm := certs .PowerTableArrayToMap (header .InitialPowerTable )
114
- for {
114
+ for i := header . FirstInstance ; ; i += 1 {
115
115
certBytes , err := readSnapshotBlockBytes (snapshot )
116
116
if err == io .EOF {
117
117
break
118
118
} else if err != nil {
119
119
return fmt .Errorf ("failed to decode finality certificate: %w" , err )
120
120
}
121
+
121
122
var cert certs.FinalityCertificate
122
- cert .UnmarshalCBOR (bytes .NewReader (certBytes ))
123
- if err = cs .Put (ctx , & cert ); err != nil {
123
+ if err = cert .UnmarshalCBOR (bytes .NewReader (certBytes )); err != nil {
124
124
return err
125
125
}
126
+
127
+ if i != cert .GPBFTInstance {
128
+ return fmt .Errorf ("the certificate of instance %d is missing" , i )
129
+ }
130
+
131
+ if i > header .LatestInstance {
132
+ return fmt .Errorf ("certificate of instance %d is found, expected latest instance %d" , i , header .LatestInstance )
133
+ }
134
+
135
+ if err := cs .ds .Put (ctx , cs .keyForCert (cert .GPBFTInstance ), certBytes ); err != nil {
136
+ return err
137
+ }
138
+
126
139
if ptm , err = certs .ApplyPowerTableDiffsToMap (ptm , cert .PowerTableDelta ); err != nil {
127
140
return err
128
141
}
142
+
129
143
if (cert .GPBFTInstance + 1 )% cs .powerTableFrequency == 0 {
130
144
pt := certs .PowerTableMapToArray (ptm )
131
145
if err := cs .putPowerTable (ctx , cert .GPBFTInstance + 1 , pt ); err != nil {
132
146
return err
133
147
}
134
148
}
135
149
}
136
- return nil
150
+
151
+ return cs .writeInstanceNumber (ctx , certStoreLatestKey , header .LatestInstance )
137
152
}
138
153
139
154
type SnapshotHeader struct {
0 commit comments