func (e *XSelectIndexExec) doIndexRequest(txn kv.Transaction) (*xapi.SelectResult, error) { selIdxReq := new(tipb.SelectRequest) startTs := txn.StartTS() selIdxReq.StartTs = &startTs selIdxReq.IndexInfo = tablecodec.IndexToProto(e.table.Meta(), e.indexPlan.Index) var err error selIdxReq.Ranges, err = indexRangesToPBRanges(e.indexPlan.Ranges) if err != nil { return nil, errors.Trace(err) } return xapi.Select(txn.GetClient(), selIdxReq, 1) }
func (do *Domain) loadInfoSchema(txn kv.Transaction) (err error) { defer func() { if err != nil { do.SchemaValidity.setLastFailedTS(txn.StartTS()) } }() m := meta.NewMeta(txn) schemaMetaVersion, err := m.GetSchemaVersion() if err != nil { return errors.Trace(err) } info := do.infoHandle.Get() if info != nil && schemaMetaVersion <= info.SchemaMetaVersion() { // info may be changed by other txn, so here its version may be bigger than schema version, // so we don't need to reload. log.Debugf("[ddl] schema version is still %d, no need reload", schemaMetaVersion) return nil } schemas, err := m.ListDatabases() if err != nil { return errors.Trace(err) } for _, di := range schemas { if di.State != model.StatePublic { // schema is not public, can't be used outside. continue } tables, err1 := m.ListTables(di.ID) if err1 != nil { err = err1 return errors.Trace(err1) } di.Tables = make([]*model.TableInfo, 0, len(tables)) for _, tbl := range tables { if tbl.State != model.StatePublic { // schema is not public, can't be used outsiee. continue } di.Tables = append(di.Tables, tbl) } } log.Infof("[ddl] loadInfoSchema %d", schemaMetaVersion) err = do.infoHandle.Set(schemas, schemaMetaVersion) return errors.Trace(err) }
func (d *ddl) fetchRowColVals(txn kv.Transaction, t table.Table, handles []int64, indexInfo *model.IndexInfo) ( []*indexRecord, error) { // Through handles access to get all row keys. handlesLen := len(handles) rowKeys := make([]kv.Key, 0, handlesLen) for _, h := range handles { rowKey := tablecodec.EncodeRecordKey(t.RecordPrefix(), h) rowKeys = append(rowKeys, rowKey) } // Get corresponding raw values for rowKeys. ver := kv.Version{Ver: txn.StartTS()} snap, err := d.store.GetSnapshot(ver) if err != nil { return nil, errors.Trace(err) } pairMap, err := snap.BatchGet(rowKeys) if err != nil { return nil, errors.Trace(err) } // Get corresponding values for pairMap. cols := t.Cols() colMap := make(map[int64]*types.FieldType) for _, v := range indexInfo.Columns { col := cols[v.Offset] colMap[col.ID] = &col.FieldType } idxRecords := make([]*indexRecord, 0, handlesLen) for i, rowKey := range rowKeys { rawVal, ok := pairMap[string(rowKey)] if !ok { // Row doesn't exist, skip it. continue } row, err := tablecodec.DecodeRow(rawVal, colMap) if err != nil { return nil, errors.Trace(err) } rowVal := make([]types.Datum, 0, len(indexInfo.Columns)) for _, v := range indexInfo.Columns { col := cols[v.Offset] rowVal = append(rowVal, row[col.ID]) } idxRecord := &indexRecord{handle: handles[i], key: rowKey, vals: rowVal} idxRecords = append(idxRecords, idxRecord) } return idxRecords, nil }
func (e *XSelectIndexExec) doTableRequest(txn kv.Transaction, handles []int64) (*xapi.SelectResult, error) { selTableReq := new(tipb.SelectRequest) startTs := txn.StartTS() selTableReq.StartTs = &startTs selTableReq.TableInfo = tablecodec.TableToProto(e.indexPlan.Table) selTableReq.Fields = resultFieldsToPBExpression(e.indexPlan.Fields()) for _, h := range handles { if h == math.MaxInt64 { // We can't convert MaxInt64 into an left closed, right open range. continue } pbRange := new(tipb.KeyRange) pbRange.Low = codec.EncodeInt(nil, h) pbRange.High = codec.EncodeInt(nil, h) selTableReq.Ranges = append(selTableReq.Ranges, pbRange) } selTableReq.Where = conditionsToPBExpression(e.indexPlan.FilterConditions...) return xapi.Select(txn.GetClient(), selTableReq, 10) }
func (d *ddl) isReorgRunnable(txn kv.Transaction, flag JobType) error { if d.isClosed() { // worker is closed, can't run reorganization. return errors.Trace(errInvalidWorker.Gen("worker is closed")) } t := meta.NewMeta(txn) owner, err := d.getJobOwner(t, flag) if err != nil { return errors.Trace(err) } if owner == nil || owner.OwnerID != d.uuid { // if no owner, we will try later, so here just return error. // or another server is owner, return error too. log.Infof("[ddl] %s job, self id %s owner %s, txnTS:%d", flag, d.uuid, owner, txn.StartTS()) return errors.Trace(errNotOwner) } return nil }