Skip to content

Commit 35c062a

Browse files
authored
fix delivery restart (#430)
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 79739ca commit 35c062a

File tree

1 file changed

+60
-47
lines changed

1 file changed

+60
-47
lines changed

platform/fabric/core/generic/delivery/delivery.go

Lines changed: 60 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ import (
2828
var logger = flogging.MustGetLogger("fabric-sdk.delivery")
2929

3030
var (
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

3439
type 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+
265278
func (d *Delivery) cleanup() {
266279
if d.client != nil {
267280
d.client.Close()

0 commit comments

Comments
 (0)