package engine

import (
    "bytes"
    "encoding/binary"
    "encoding/gob"
    "github.com/huichen/wukong/types"
    "sync/atomic"
)

type persistentStorageIndexDocumentRequest struct {
    docId uint64
    data  types.DocumentIndexData
}

func (engine *Engine) persistentStorageIndexDocumentWorker(shard int) {
    for {
        request := <-engine.persistentStorageIndexDocumentChannels[shard]

        // 得到key
        b := make([]byte, 10)
        length := binary.PutUvarint(b, request.docId)

        // 得到value
        var buf bytes.Buffer
        enc := gob.NewEncoder(&buf)
        err := enc.Encode(request.data)
        if err != nil {
            atomic.AddUint64(&engine.numDocumentsStored, 1)
            continue
        }

        // 将key-value写入数据库
        engine.dbs[shard].Set(b[0:length], buf.Bytes())
        atomic.AddUint64(&engine.numDocumentsStored, 1)
    }
}

func (engine *Engine) persistentStorageRemoveDocumentWorker(docId uint64, shard uint32) {
    // 得到key
    b := make([]byte, 10)
    length := binary.PutUvarint(b, docId)

    // 从数据库删除该key
    engine.dbs[shard].Delete(b[0:length])
}

func (engine *Engine) persistentStorageInitWorker(shard int) {
    engine.dbs[shard].ForEach(func(k, v []byte) error {
        key, value := k, v
        // 得到docID
        docId, _ := binary.Uvarint(key)

        // 得到data
        buf := bytes.NewReader(value)
        dec := gob.NewDecoder(buf)
        var data types.DocumentIndexData
        err := dec.Decode(&data)
        if err == nil {
            // 添加索引
            engine.internalIndexDocument(docId, data, false)
        }
        return nil
    })
    engine.persistentStorageInitChannel <- true
}

persistent_storage_worker.go的更多相关文章

  1. wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里

    前面说过,接收indexerRequest的代码在index_worker.go里: func (engine *Engine) indexerAddDocumentWorker(shard int) ...

随机推荐

  1. DTN学习,theONE模拟器网络相关资料整理

    下面是一个百度空间的: http://hi.baidu.com/jensenliao 博客园的一篇博客:theONE模拟器简介(主要讲述,软件配置,软件结构) http://www.cnblogs.c ...

  2. 恶补web之六:javascript知识(1)

    javascript(下称js)是一种轻量级编程语言,它可以插入html页面然后由浏览器执行. document.write("<h1>...</h1>") ...

  3. 详解基于vue,vue-router, vuex以及addRoutes进行权限控制

    基于vuex, vue-router,vuex的权限控制教程,完整代码地址见https://github.com/linrunzheng/vue-permission-control 接下来让我们模拟 ...

  4. Django处理流程

    用户通过浏览器发送请求 请求到达request中间件,中间件对request请求做预处理或者直接返回response 若未返回response,会到达urlconf路由,找到对应视图函数 视图函数做相 ...

  5. jQuery鼠标移入移出(冒泡版和无冒泡版)

    带冒泡事件的鼠标移入移出(默认的):mouseover和mouseout事件 没有冒泡事件的鼠标移入移出:mouseenter和mouseleave事件

  6. properties类是Hashtable的子类

    properties类是Hashtable的子类 增加了将Hashtable对象中的关键字保存到文件和从文件中读取关键字和值到Hashtable对象中的方法 Properties.store方法存储P ...

  7. MySQL MEB常见用法

    1. 备份成镜像 备份: ./mysqlbackup --socket=/usr/local/mysql-advanced--linux-glibc2.-x86_64/data/mysql.sock ...

  8. windows环境下zookeeper安装和使用

    一.简介        zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...

  9. Spring温故而知新 - bean的装配(续)

    按条件装配bean 就是当满足特定的条件时Spring容器才创建Bean,Spring中通过@Conditional注解来实现条件化配置bean package com.sl.ioc; import ...

  10. eclipse3.7+resin4.0集成配置小结

    1.插件不要用improve公司的了,那个太老了.直接用resin官方的,用eclipse的help->install new software功能,地址用:http://www.caucho. ...