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. How--to-deploy-smart-contracts-on

    The following smart contract code is only an example and is NOT to be used in Production systems. pr ...

  2. LambdaToSql 发布 兰姆达转换sql

    文档目录索引 查询.函数.分组.排序.分页 添加 Insert into 编辑 Update set 删除 Delete 生成实体 内置常用工具类库  文档完善中... 事务处理 Join 连接查询 ...

  3. AngularJs 指令directive之require

    controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编 写,使用起来比较简单:另一种方法则是require An ...

  4. JasperReport的安装

    下载网址http://community.jaspersoft.com/community-download

  5. wamp 服务监控和启动

    近日我的 wamp 莫名其妙的崩溃重启,apache 能自动起来, mysql 却悲剧了. 于是有了下面的wamp服务监控和启动的批处理文件 @echo off rem define loop tim ...

  6. java面试题之分析(二)

    QUESTION NO:2 package com.cdu.test;  public class Test { static boolean foo(char c) { System.out.pri ...

  7. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  8. javap

    本词条缺少概述.信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具. j ...

  9. Python flask中的配置

    当你开始学习Flask时,配置看上去是小菜一碟.你仅仅需要在config.py定义几个变量,然后万事大吉. 然而当你不得不管理一个生产上的应用的配置时,这一切将变得棘手万分. 你不得不设法保护API密 ...

  10. 如何优雅的关闭Java线程池

    面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的. 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常 ...