func (d *ddl) onDropSchema(t *meta.Meta, job *model.Job) error { dbInfo, err := t.GetDatabase(job.SchemaID) if err != nil { return errors.Trace(err) } if dbInfo == nil { job.State = model.JobCancelled return errors.Trace(infoschema.ErrDatabaseDropExists) } ver, err := updateSchemaVersion(t, job) if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StatePublic: // public -> write only job.SchemaState = model.StateWriteOnly dbInfo.State = model.StateWriteOnly err = t.UpdateDatabase(dbInfo) case model.StateWriteOnly: // write only -> delete only job.SchemaState = model.StateDeleteOnly dbInfo.State = model.StateDeleteOnly err = t.UpdateDatabase(dbInfo) case model.StateDeleteOnly: dbInfo.State = model.StateNone tables, err := t.ListTables(job.SchemaID) if err != nil { return errors.Trace(err) } err = t.UpdateDatabase(dbInfo) if err = t.DropDatabase(dbInfo.ID); err != nil { break } // finish this job addDBHistoryInfo(job, ver, dbInfo) if len(tables) > 0 { job.Args = append(job.Args, getIDs(tables)) } job.State = model.JobDone job.SchemaState = model.StateNone default: // we can't enter here. err = errors.Errorf("invalid db state %v", dbInfo.State) } return errors.Trace(err) }
func (d *ddl) onDropSchema(t *meta.Meta, job *model.Job) error { dbInfo, err := t.GetDatabase(job.SchemaID) if err != nil { return errors.Trace(err) } if dbInfo == nil { job.State = model.JobCancelled return errors.Trace(infoschema.ErrDatabaseNotExists) } _, err = t.GenSchemaVersion() if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StatePublic: // public -> write only job.SchemaState = model.StateWriteOnly dbInfo.State = model.StateWriteOnly err = t.UpdateDatabase(dbInfo) case model.StateWriteOnly: // write only -> delete only job.SchemaState = model.StateDeleteOnly dbInfo.State = model.StateDeleteOnly err = t.UpdateDatabase(dbInfo) case model.StateDeleteOnly: dbInfo.State = model.StateDeleteReorganization err = t.UpdateDatabase(dbInfo) if err = t.DropDatabase(dbInfo.ID); err != nil { break } // finish this job job.Args = []interface{}{dbInfo} job.State = model.JobDone job.SchemaState = model.StateNone default: // we can't enter here. err = errors.Errorf("invalid db state %v", dbInfo.State) } return errors.Trace(err) }
func (d *ddl) onDropSchema(t *meta.Meta, job *model.Job) error { dbInfo, err := t.GetDatabase(job.SchemaID) if err != nil { return errors.Trace(err) } if dbInfo == nil { job.State = model.JobCancelled return errors.Trace(ErrNotExists) } _, err = t.GenSchemaVersion() if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StatePublic: // public -> write only job.SchemaState = model.StateWriteOnly dbInfo.State = model.StateWriteOnly err = t.UpdateDatabase(dbInfo) return errors.Trace(err) case model.StateWriteOnly: // write only -> delete only job.SchemaState = model.StateDeleteOnly dbInfo.State = model.StateDeleteOnly err = t.UpdateDatabase(dbInfo) return errors.Trace(err) case model.StateDeleteOnly: // delete only -> reorganization job.SchemaState = model.StateDeleteReorganization dbInfo.State = model.StateDeleteReorganization err = t.UpdateDatabase(dbInfo) return errors.Trace(err) case model.StateDeleteReorganization: // wait reorganization jobs done and drop meta. var tables []*model.TableInfo tables, err = t.ListTables(dbInfo.ID) if err != nil { return errors.Trace(err) } err = d.runReorgJob(func() error { return d.dropSchemaData(dbInfo, tables) }) if terror.ErrorEqual(err, errWaitReorgTimeout) { // if timeout, we should return, check for the owner and re-wait job done. return nil } if err != nil { return errors.Trace(err) } // all reorganization jobs done, drop this database if err = t.DropDatabase(dbInfo.ID); err != nil { return errors.Trace(err) } // finish this job job.State = model.JobDone job.SchemaState = model.StateNone return nil default: // we can't enter here. return errors.Errorf("invalid db state %v", dbInfo.State) } }