func filterTableState(tableDesc *sqlbase.TableDescriptor) error { switch { case tableDesc.Dropped(): return errTableDropped case tableDesc.Adding(): return errTableAdding case tableDesc.State != sqlbase.TableDescriptor_PUBLIC: return errors.Errorf("table in unknown state: %s", tableDesc.State.String()) } return nil }
// runBackfill runs the backfill for the schema changer. func (sc *SchemaChanger) runBackfill(lease *sqlbase.TableDescriptor_SchemaChangeLease) error { if err := sc.ExtendLease(lease); err != nil { return err } // Mutations are applied in a FIFO order. Only apply the first set of // mutations. Collect the elements that are part of the mutation. var droppedColumnDescs []sqlbase.ColumnDescriptor var droppedIndexDescs []sqlbase.IndexDescriptor var addedColumnDescs []sqlbase.ColumnDescriptor var addedIndexDescs []sqlbase.IndexDescriptor // Indexes within the Mutations slice for checkpointing. mutationSentinel := -1 var columnMutationIdx, addedIndexMutationIdx, droppedIndexMutationIdx int var tableDesc *sqlbase.TableDescriptor if err := sc.db.Txn(context.TODO(), func(txn *client.Txn) error { var err error tableDesc, err = sqlbase.GetTableDescFromID(txn, sc.tableID) return err }); err != nil { return err } // Short circuit the backfill if the table has been deleted. if tableDesc.Dropped() { return nil } version := tableDesc.Version for i, m := range tableDesc.Mutations { if m.MutationID != sc.mutationID { break } switch m.Direction { case sqlbase.DescriptorMutation_ADD: switch t := m.Descriptor_.(type) { case *sqlbase.DescriptorMutation_Column: addedColumnDescs = append(addedColumnDescs, *t.Column) if columnMutationIdx == mutationSentinel { columnMutationIdx = i } case *sqlbase.DescriptorMutation_Index: addedIndexDescs = append(addedIndexDescs, *t.Index) if addedIndexMutationIdx == mutationSentinel { addedIndexMutationIdx = i } default: return errors.Errorf("unsupported mutation: %+v", m) } case sqlbase.DescriptorMutation_DROP: switch t := m.Descriptor_.(type) { case *sqlbase.DescriptorMutation_Column: droppedColumnDescs = append(droppedColumnDescs, *t.Column) if columnMutationIdx == mutationSentinel { columnMutationIdx = i } case *sqlbase.DescriptorMutation_Index: droppedIndexDescs = append(droppedIndexDescs, *t.Index) if droppedIndexMutationIdx == mutationSentinel { droppedIndexMutationIdx = i } default: return errors.Errorf("unsupported mutation: %+v", m) } } } // First drop indexes, then add/drop columns, and only then add indexes. // Drop indexes. if err := sc.truncateIndexes( lease, version, droppedIndexDescs, droppedIndexMutationIdx, ); err != nil { return err } // Add and drop columns. if err := sc.truncateAndBackfillColumns( lease, version, addedColumnDescs, droppedColumnDescs, columnMutationIdx, ); err != nil { return err } // Add new indexes. if err := sc.backfillIndexes( lease, version, addedIndexDescs, addedIndexMutationIdx, ); err != nil { return err } return nil }