@@ -104,36 +104,51 @@ func importSnapshotToDatastoreWithTestingPowerTableFrequency(ctx context.Context
104
104
dsb := autobatch .NewAutoBatching (ds , 1000 )
105
105
defer dsb .Flush (ctx )
106
106
cs , err := OpenOrCreateStore (ctx , dsb , header .FirstInstance , header .InitialPowerTable )
107
- if testingPowerTableFrequency > 0 {
108
- cs .powerTableFrequency = testingPowerTableFrequency
109
- }
110
107
if err != nil {
111
108
return err
112
109
}
110
+ if testingPowerTableFrequency > 0 {
111
+ cs .powerTableFrequency = testingPowerTableFrequency
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