// Create a mock index that uses a feeder function to provide query results. // Creates an index with single partition, single slice with a snapshot. func (s *scannerTestHarness) createIndex(name, bucket string, feeder snapshotFeeder) c.IndexDefnId { s.indexCount++ pc := c.NewKeyPartitionContainer() pId := c.PartitionId(0) endpt := c.Endpoint("localhost:1000") pDef := c.KeyPartitionDefn{Id: pId, Endpts: []c.Endpoint{endpt}} pc.AddPartition(pId, pDef) instId := c.IndexInstId(s.indexCount) defnId := c.IndexDefnId(0xABBA) indDefn := c.IndexDefn{Name: name, Bucket: bucket, DefnId: defnId} indInst := c.IndexInst{InstId: instId, State: c.INDEX_STATE_ACTIVE, Defn: indDefn, Pc: pc, } // TODO: Use cmdch to update map s.scanner.indexInstMap[instId] = indInst sc := NewHashedSliceContainer() partInst := PartitionInst{Defn: pDef, Sc: sc} partInstMap := PartitionInstMap{pId: partInst} snap := &mockSnapshot{feeder: feeder} snap.SetTimestamp(s.scanTS) slice := &mockSlice{} slId := SliceId(0) sc.AddSlice(slId, slice) // TODO: Use cmdch to update map s.scanner.indexPartnMap[instId] = partInstMap return defnId }
func addPartnInfoToProtoInst(cfg c.Config, cinfo *c.ClusterInfoCache, indexInst c.IndexInst, streamId c.StreamId, protoInst *protobuf.IndexInst) { switch partn := indexInst.Pc.(type) { case *c.KeyPartitionContainer: //Right now the fill the SinglePartition as that is the only //partition structure supported partnDefn := partn.GetAllPartitions() //TODO move this to indexer init. These addresses cannot change. //Better to get these once and store. cinfo.Lock() defer cinfo.Unlock() err := cinfo.Fetch() c.CrashOnError(err) nid := cinfo.GetCurrentNode() streamMaintAddr, err := cinfo.GetServiceAddress(nid, "indexStreamMaint") c.CrashOnError(err) streamInitAddr, err := cinfo.GetServiceAddress(nid, "indexStreamInit") c.CrashOnError(err) streamCatchupAddr, err := cinfo.GetServiceAddress(nid, "indexStreamCatchup") c.CrashOnError(err) var endpoints []string for _, p := range partnDefn { for _, e := range p.Endpoints() { //Set the right endpoint based on streamId switch streamId { case c.MAINT_STREAM: e = c.Endpoint(streamMaintAddr) case c.CATCHUP_STREAM: e = c.Endpoint(streamCatchupAddr) case c.INIT_STREAM: e = c.Endpoint(streamInitAddr) } endpoints = append(endpoints, string(e)) } } protoInst.SinglePartn = &protobuf.SinglePartition{ Endpoints: endpoints, } } }
func (meta *metaNotifier) makeDefaultPartitionContainer() common.PartitionContainer { pc := common.NewKeyPartitionContainer() //Add one partition for now addr := net.JoinHostPort("", meta.config["streamMaintPort"].String()) endpt := []common.Endpoint{common.Endpoint(addr)} partnDefn := common.KeyPartitionDefn{Id: common.PartitionId(1), Endpts: endpt} pc.AddPartition(common.PartitionId(1), partnDefn) return pc }
func newIndexMetaData(info *indexInfo, queryport string) *mclient.IndexMetadata { defn := &common.IndexDefn{ DefnId: common.IndexDefnId(info.DefnID), Name: info.Name, Using: common.IndexType(info.Using), Bucket: info.Bucket, IsPrimary: info.IsPrimary, ExprType: common.ExprType(info.ExprType), SecExprs: info.SecExprs, PartitionKey: info.PartnExpr, } instances := []*mclient.InstanceDefn{ &mclient.InstanceDefn{ InstId: common.IndexInstId(info.DefnID), // TODO: defnID as InstID State: common.INDEX_STATE_READY, Endpts: []common.Endpoint{common.Endpoint(queryport)}, }, } imeta := &mclient.IndexMetadata{ Definition: defn, Instances: instances, } return imeta }
//create func (cbq *cbqBridge) handleCreate(w http.ResponseWriter, r *http.Request) { var res IndexMetaResponse indexinfo := indexRequest(r).Index logging.Debugf("CbqBridge::handleCreate Received CreateIndex %v", indexinfo) //generate a new unique id defnID := rand.Int() idxDefn := common.IndexDefn{DefnId: common.IndexDefnId(defnID), Name: indexinfo.Name, Using: common.ForestDB, Bucket: indexinfo.Bucket, IsPrimary: indexinfo.IsPrimary, SecExprs: indexinfo.SecExprs, ExprType: common.N1QL, PartitionScheme: common.SINGLE, PartitionKey: indexinfo.PartnExpr, WhereExpr: indexinfo.WhereExpr} idxInst := common.IndexInst{InstId: common.IndexInstId(defnID), Defn: idxDefn, State: common.INDEX_STATE_INITIAL, } if !cbq.config["enableManager"].Bool() { pc := common.NewKeyPartitionContainer() //Add one partition for now partnId := common.PartitionId(0) addr := net.JoinHostPort("", cbq.config["streamMaintPort"].String()) endpt := []common.Endpoint{common.Endpoint(addr)} partnDefn := common.KeyPartitionDefn{Id: partnId, Endpts: endpt} pc.AddPartition(partnId, partnDefn) idxInst.Pc = pc } indexinfo.DefnID = uint64(defnID) respCh := make(MsgChannel) cbq.supvRespch <- &MsgCreateIndex{mType: CBQ_CREATE_INDEX_DDL, indexInst: idxInst, respCh: respCh} //wait for response from indexer msg := <-respCh if msg.GetMsgType() == MSG_SUCCESS { res = IndexMetaResponse{ Status: RESP_SUCCESS, Indexes: []IndexInfo{indexinfo}, } cbq.indexMap[idxInst.InstId] = indexinfo } else { err := msg.(*MsgError).GetError() logging.Debugf("CbqBridge::handleCreate Received Error %s", err.cause) ierr := IndexError{Code: string(RESP_ERROR), Msg: err.cause.Error()} res = IndexMetaResponse{ Status: RESP_ERROR, Errors: []IndexError{ierr}, } } sendResponse(w, res) }