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) } }
func (d *ddl) onCreateSchema(t *meta.Meta, job *model.Job) error { schemaID := job.SchemaID var name model.CIStr if err := job.DecodeArgs(&name); err != nil { // arg error, cancel this job. job.State = model.JobCancelled return errors.Trace(err) } dbInfo := &model.DBInfo{ ID: schemaID, Name: name, State: model.StateNone, } dbs, err := t.ListDatabases() if err != nil { return errors.Trace(err) } for _, db := range dbs { if db.Name.L == name.L { if db.ID != schemaID { // database exists, can't create, we should cancel this job now. job.State = model.JobCancelled return errors.Trace(ErrExists) } dbInfo = db } } _, err = t.GenSchemaVersion() if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StateNone: // none -> delete only job.SchemaState = model.StateDeleteOnly dbInfo.State = model.StateDeleteOnly err = t.CreateDatabase(dbInfo) return errors.Trace(err) case model.StateDeleteOnly: // delete only -> write only job.SchemaState = model.StateWriteOnly dbInfo.State = model.StateWriteOnly err = t.UpdateDatabase(dbInfo) return errors.Trace(err) case model.StateWriteOnly: // write only -> public job.SchemaState = model.StatePublic dbInfo.State = model.StatePublic err = t.UpdateDatabase(dbInfo) if err != nil { return errors.Trace(err) } // finish this job. job.State = model.JobDone return nil default: // we can't enter here. return errors.Errorf("invalid db state %v", dbInfo.State) } }