fix: crash in globalTierJournal when TierConfig is not initialized (#17791)

This commit is contained in:
Harshavardhana 2023-08-03 14:16:15 -07:00 committed by GitHub
parent b762fbaf21
commit 239ccc9c40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 21 deletions

View File

@ -346,7 +346,7 @@ var (
globalTierConfigMgr *TierConfigMgr globalTierConfigMgr *TierConfigMgr
globalTierJournal *tierJournal globalTierJournal *TierJournal
globalConsoleSrv *restapi.Server globalConsoleSrv *restapi.Server

View File

@ -362,6 +362,7 @@ func initAllSubsystems(ctx context.Context) {
// Create new ILM tier configuration subsystem // Create new ILM tier configuration subsystem
globalTierConfigMgr = NewTierConfigMgr() globalTierConfigMgr = NewTierConfigMgr()
globalTierJournal = NewTierJournal()
globalTransitionState = newTransitionState(GlobalContext) globalTransitionState = newTransitionState(GlobalContext)
globalSiteResyncMetrics = newSiteResyncMetrics(GlobalContext) globalSiteResyncMetrics = newSiteResyncMetrics(GlobalContext)
@ -798,14 +799,10 @@ func serverMain(ctx *cli.Context) {
go func() { go func() {
// Initialize transition tier configuration manager // Initialize transition tier configuration manager
bootstrapTrace("globalTierConfigMgr.Init") bootstrapTrace("globalTierConfigMgr.Init")
err := globalTierConfigMgr.Init(GlobalContext, newObject) if err := globalTierConfigMgr.Init(GlobalContext, newObject); err != nil {
if err != nil {
logger.LogIf(GlobalContext, err) logger.LogIf(GlobalContext, err)
} else { } else {
globalTierJournal, err = initTierDeletionJournal(GlobalContext) logger.FatalIf(globalTierJournal.Init(GlobalContext), "Unable to initialize remote tier pending deletes journal")
if err != nil {
logger.FatalIf(err, "Unable to initialize remote tier pending deletes journal")
}
} }
}() }()

View File

@ -32,7 +32,7 @@ import (
) )
//go:generate msgp -file $GOFILE -unexported //go:generate msgp -file $GOFILE -unexported
//msgp:ignore tierJournal tierDiskJournal walkfn //msgp:ignore TierJournal tierDiskJournal walkfn
type tierDiskJournal struct { type tierDiskJournal struct {
sync.RWMutex sync.RWMutex
@ -40,7 +40,8 @@ type tierDiskJournal struct {
file *os.File // active journal file file *os.File // active journal file
} }
type tierJournal struct { // TierJournal holds an in-memory and an on-disk delete journal of tiered content.
type TierJournal struct {
*tierDiskJournal // for processing legacy journal entries *tierDiskJournal // for processing legacy journal entries
*tierMemJournal // for processing new journal entries *tierMemJournal // for processing new journal entries
} }
@ -62,24 +63,28 @@ func newTierDiskJournal() *tierDiskJournal {
return &tierDiskJournal{} return &tierDiskJournal{}
} }
// initTierDeletionJournal intializes an in-memory journal built using a // NewTierJournal initializes tier deletion journal
// buffered channel for new journal entries. It also initializes the on-disk func NewTierJournal() *TierJournal {
// journal only to process existing journal entries made from previous versions. j := &TierJournal{
func initTierDeletionJournal(ctx context.Context) (*tierJournal, error) { tierMemJournal: newTierMemJournal(1000),
j := &tierJournal{
tierMemJournal: newTierMemJoural(1000),
tierDiskJournal: newTierDiskJournal(), tierDiskJournal: newTierDiskJournal(),
} }
return j
}
// Init intializes an in-memory journal built using a
// buffered channel for new journal entries. It also initializes the on-disk
// journal only to process existing journal entries made from previous versions.
func (t *TierJournal) Init(ctx context.Context) error {
for _, diskPath := range globalEndpoints.LocalDisksPaths() { for _, diskPath := range globalEndpoints.LocalDisksPaths() {
j.diskPath = diskPath t.diskPath = diskPath
go j.deletePending(ctx) // for existing journal entries from previous MinIO versions go t.deletePending(ctx) // for existing journal entries from previous MinIO versions
go j.processEntries(ctx) // for newer journal entries circa free-versions go t.processEntries(ctx) // for newer journal entries circa free-versions
return j, nil return nil
} }
return nil, errors.New("no local drive found") return errors.New("no local drive found")
} }
// rotate rotates the journal. If a read-only journal already exists it does // rotate rotates the journal. If a read-only journal already exists it does

View File

@ -28,7 +28,7 @@ type tierMemJournal struct {
entries chan jentry entries chan jentry
} }
func newTierMemJoural(nevents int) *tierMemJournal { func newTierMemJournal(nevents int) *tierMemJournal {
return &tierMemJournal{ return &tierMemJournal{
entries: make(chan jentry, nevents), entries: make(chan jentry, nevents),
} }