@@ -28,7 +28,12 @@ import (
2828var logger = flogging .MustGetLogger ("fabric-sdk.delivery" )
2929
3030var (
31- ErrComm = errors .New ("communication issue" )
31+ ErrComm = errors .New ("communication issue" )
32+ StartGenesis = & ab.SeekPosition {
33+ Type : & ab.SeekPosition_Oldest {
34+ Oldest : & ab.SeekOldest {},
35+ },
36+ }
3237)
3338
3439type Callback func (block * common.Block ) (bool , error )
@@ -196,57 +201,12 @@ func (d *Delivery) connect(ctx context.Context) (DeliverStream, error) {
196201 return nil , errors .Wrapf (err , "failed to get delivery stream" )
197202 }
198203
199- start := & ab.SeekPosition {}
200- if d .lastBlockReceived != 0 {
201- if logger .IsEnabledFor (zapcore .DebugLevel ) {
202- logger .Debugf ("restarting from the last block received [%d]" , d .lastBlockReceived )
203- }
204-
205- start .Type = & ab.SeekPosition_Specified {
206- Specified : & ab.SeekSpecified {
207- Number : d .lastBlockReceived ,
208- },
209- }
210- } else {
211- lastTxID , err := d .vault .GetLastTxID ()
212- if err != nil {
213- return nil , errors .WithMessagef (err , "failed getting last transaction committed/discarted from the vault" )
214- }
215-
216- if len (lastTxID ) != 0 && ! strings .HasPrefix (lastTxID , committer .ConfigTXPrefix ) {
217- // Retrieve block from Fabric
218- ch , err := d .network .Channel (d .channel )
219- if err != nil {
220- return nil , errors .WithMessagef (err , "failed getting channeln [%s]" , d .channel )
221- }
222- blockNumber , err := ch .GetBlockNumberByTxID (lastTxID )
223- if err != nil {
224- return nil , errors .WithMessagef (err , "failed getting block number for transaction [%s]" , lastTxID )
225- }
226- start .Type = & ab.SeekPosition_Specified {
227- Specified : & ab.SeekSpecified {
228- Number : blockNumber ,
229- },
230- }
231- if logger .IsEnabledFor (zapcore .DebugLevel ) {
232- logger .Debugf ("restarting from block [%d], tx [%s]" , blockNumber , lastTxID )
233- }
234- } else {
235- start .Type = & ab.SeekPosition_Oldest {
236- Oldest : & ab.SeekOldest {},
237- }
238- if logger .IsEnabledFor (zapcore .DebugLevel ) {
239- logger .Debugf ("starting from the beginning, no last transaction found" )
240- }
241- }
242- }
243-
244204 blockEnvelope , err := CreateDeliverEnvelope (
245205 d .channel ,
246206 d .network .LocalMembership ().DefaultSigningIdentity (),
247207 deliverClient .Certificate (),
248208 hash .GetHasher (d .sp ),
249- start ,
209+ d . GetStartPosition () ,
250210 )
251211 if err != nil {
252212 return nil , errors .Wrap (err , "failed to create deliver envelope" )
@@ -262,6 +222,59 @@ func (d *Delivery) connect(ctx context.Context) (DeliverStream, error) {
262222 return stream , nil
263223}
264224
225+ func (d * Delivery ) GetStartPosition () * ab.SeekPosition {
226+ if d .lastBlockReceived != 0 {
227+ if logger .IsEnabledFor (zapcore .DebugLevel ) {
228+ logger .Debugf ("restarting from the last block received [%d]" , d .lastBlockReceived )
229+ }
230+
231+ return & ab.SeekPosition {
232+ Type : & ab.SeekPosition_Specified {
233+ Specified : & ab.SeekSpecified {
234+ Number : d .lastBlockReceived ,
235+ },
236+ },
237+ }
238+ }
239+
240+ if logger .IsEnabledFor (zapcore .DebugLevel ) {
241+ logger .Debugf ("no last block received set [%d], check last TxID in the vault" , d .lastBlockReceived )
242+ }
243+
244+ lastTxID , err := d .vault .GetLastTxID ()
245+ if err != nil {
246+ logger .Errorf ("failed getting last transaction committed/discarded from the vault [%s], restarting from genesis" , err )
247+ return StartGenesis
248+ }
249+
250+ if len (lastTxID ) != 0 && ! strings .HasPrefix (lastTxID , committer .ConfigTXPrefix ) {
251+ // Retrieve block from Fabric
252+ ch , err := d .network .Channel (d .channel )
253+ if err != nil {
254+ logger .Errorf ("failed getting channel [%s], restarting from genesis: [%s]" , d .channel , err )
255+ return StartGenesis
256+ }
257+ blockNumber , err := ch .GetBlockNumberByTxID (lastTxID )
258+ if err != nil {
259+ logger .Errorf ("failed getting block number for transaction [%s], restart from genesis [%s]" , lastTxID , err )
260+ return StartGenesis
261+ }
262+ if logger .IsEnabledFor (zapcore .DebugLevel ) {
263+ logger .Debugf ("restarting from block [%d], tx [%s]" , blockNumber , lastTxID )
264+ }
265+
266+ return & ab.SeekPosition {
267+ Type : & ab.SeekPosition_Specified {
268+ Specified : & ab.SeekSpecified {
269+ Number : blockNumber ,
270+ },
271+ },
272+ }
273+ }
274+
275+ return StartGenesis
276+ }
277+
265278func (d * Delivery ) cleanup () {
266279 if d .client != nil {
267280 d .client .Close ()
0 commit comments