storj/satellite/satellitedb/irreparabledb.go

80 lines
2.7 KiB
Go
Raw Normal View History

2019-01-24 20:15:10 +00:00
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package satellitedb
import (
"context"
"storj.io/storj/pkg/datarepair/irreparable"
"storj.io/storj/pkg/utils"
dbx "storj.io/storj/satellite/satellitedb/dbx"
)
type irreparableDB struct {
db *dbx.DB
}
// IncrementRepairAttempts a db entry for to increment the repair attempts field
func (db *irreparableDB) IncrementRepairAttempts(ctx context.Context, segmentInfo *irreparable.RemoteSegmentInfo) (err error) {
tx, err := db.db.Open(ctx)
if err != nil {
return Error.Wrap(err)
}
dbxInfo, err := tx.Get_Irreparabledb_By_Segmentpath(ctx, dbx.Irreparabledb_Segmentpath(segmentInfo.EncryptedSegmentPath))
if err != nil {
// no rows err, so create/insert an entry
_, err = tx.Create_Irreparabledb(
ctx,
dbx.Irreparabledb_Segmentpath(segmentInfo.EncryptedSegmentPath),
dbx.Irreparabledb_Segmentdetail(segmentInfo.EncryptedSegmentDetail),
dbx.Irreparabledb_PiecesLostCount(segmentInfo.LostPiecesCount),
dbx.Irreparabledb_SegDamagedUnixSec(segmentInfo.RepairUnixSec),
dbx.Irreparabledb_RepairAttemptCount(segmentInfo.RepairAttemptCount),
)
if err != nil {
return Error.Wrap(utils.CombineErrors(err, tx.Rollback()))
}
} else {
// row exits increment the attempt counter
dbxInfo.RepairAttemptCount++
updateFields := dbx.Irreparabledb_Update_Fields{}
updateFields.RepairAttemptCount = dbx.Irreparabledb_RepairAttemptCount(dbxInfo.RepairAttemptCount)
updateFields.SegDamagedUnixSec = dbx.Irreparabledb_SegDamagedUnixSec(segmentInfo.RepairUnixSec)
_, err = tx.Update_Irreparabledb_By_Segmentpath(
ctx,
dbx.Irreparabledb_Segmentpath(dbxInfo.Segmentpath),
updateFields,
)
if err != nil {
return Error.Wrap(utils.CombineErrors(err, tx.Rollback()))
}
}
return Error.Wrap(tx.Commit())
}
// Get a irreparable's segment info from the db
func (db *irreparableDB) Get(ctx context.Context, segmentPath []byte) (resp *irreparable.RemoteSegmentInfo, err error) {
dbxInfo, err := db.db.Get_Irreparabledb_By_Segmentpath(ctx, dbx.Irreparabledb_Segmentpath(segmentPath))
if err != nil {
return &irreparable.RemoteSegmentInfo{}, Error.Wrap(err)
}
return &irreparable.RemoteSegmentInfo{
EncryptedSegmentPath: dbxInfo.Segmentpath,
EncryptedSegmentDetail: dbxInfo.Segmentdetail,
LostPiecesCount: dbxInfo.PiecesLostCount,
RepairUnixSec: dbxInfo.SegDamagedUnixSec,
RepairAttemptCount: dbxInfo.RepairAttemptCount,
}, nil
}
// Delete a irreparable's segment info from the db
func (db *irreparableDB) Delete(ctx context.Context, segmentPath []byte) (err error) {
_, err = db.db.Delete_Irreparabledb_By_Segmentpath(ctx, dbx.Irreparabledb_Segmentpath(segmentPath))
return Error.Wrap(err)
}