walSeek.c 3.6 KB
Newer Older
L
Liu Jicong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#define _DEFAULT_SOURCE
#include "os.h"
#include "taoserror.h"
#include "tref.h"
#include "tfile.h"
#include "walInt.h"

L
Liu Jicong 已提交
23
static int walSeekFilePos(SWal* pWal, int64_t ver) {
L
Liu Jicong 已提交
24
  int code = 0;
L
Liu Jicong 已提交
25

L
Liu Jicong 已提交
26 27
  int64_t idxTfd = pWal->writeIdxTfd;
  int64_t logTfd = pWal->writeLogTfd;
L
Liu Jicong 已提交
28 29
  
  //seek position
L
Liu Jicong 已提交
30
  int64_t offset = (ver - walGetCurFileFirstVer(pWal)) * WAL_IDX_ENTRY_SIZE;
L
Liu Jicong 已提交
31 32
  code = tfLseek(idxTfd, offset, SEEK_SET);
  if(code != 0) {
L
Liu Jicong 已提交
33
    return -1;
L
Liu Jicong 已提交
34 35 36 37
  }
  int64_t readBuf[2];
  code = tfRead(idxTfd, readBuf, sizeof(readBuf));
  if(code != 0) {
L
Liu Jicong 已提交
38
    return -1;
L
Liu Jicong 已提交
39 40 41 42 43
  }
  //TODO:deserialize
  ASSERT(readBuf[0] == ver);
  code = tfLseek(logTfd, readBuf[1], SEEK_CUR);
  if (code != 0) {
L
Liu Jicong 已提交
44
    return -1;
L
Liu Jicong 已提交
45 46 47 48
  }
  return code;
}

L
Liu Jicong 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
int walChangeFileToLast(SWal *pWal) {
  int64_t idxTfd, logTfd;
  WalFileInfo* pRet = taosArrayGetLast(pWal->fileInfoSet);
  ASSERT(pRet != NULL);
  int64_t fileFirstVer = pRet->firstVer;

  char fnameStr[WAL_FILE_LEN];
  walBuildIdxName(pWal, fileFirstVer, fnameStr);
  idxTfd = tfOpenReadWrite(fnameStr);
  if(idxTfd < 0) {
    return -1;
  }
  walBuildLogName(pWal, fileFirstVer, fnameStr);
  logTfd = tfOpenReadWrite(fnameStr);
  if(logTfd < 0) {
    return -1;
  }
  //switch file
  pWal->writeIdxTfd = idxTfd;
  pWal->writeLogTfd = logTfd;
  //change status
  pWal->curStatus = WAL_CUR_FILE_WRITABLE;
  return 0;
}

int walChangeFile(SWal *pWal, int64_t ver) {
L
Liu Jicong 已提交
75 76 77
  int code = 0;
  int64_t idxTfd, logTfd;
  char fnameStr[WAL_FILE_LEN];
L
Liu Jicong 已提交
78
  code = tfClose(pWal->writeLogTfd);
L
Liu Jicong 已提交
79 80 81
  if(code != 0) {
   //TODO 
  }
L
Liu Jicong 已提交
82
  code = tfClose(pWal->writeIdxTfd);
L
Liu Jicong 已提交
83 84 85
  if(code != 0) {
   //TODO 
  }
L
Liu Jicong 已提交
86 87
  WalFileInfo tmpInfo;
  tmpInfo.firstVer = ver;
L
Liu Jicong 已提交
88
  //bsearch in fileSet
L
Liu Jicong 已提交
89
  WalFileInfo* pRet = taosArraySearch(pWal->fileInfoSet, &tmpInfo, compareWalFileInfo, TD_LE);
L
Liu Jicong 已提交
90
  ASSERT(pRet != NULL);
L
Liu Jicong 已提交
91 92 93
  int64_t fileFirstVer = pRet->firstVer;
  //closed
  if(taosArrayGetLast(pWal->fileInfoSet) != pRet) {
L
Liu Jicong 已提交
94
    pWal->curStatus &= ~WAL_CUR_FILE_WRITABLE;
L
Liu Jicong 已提交
95
    walBuildIdxName(pWal, fileFirstVer, fnameStr);
L
Liu Jicong 已提交
96
    idxTfd = tfOpenRead(fnameStr);
L
Liu Jicong 已提交
97
    walBuildLogName(pWal, fileFirstVer, fnameStr);
L
Liu Jicong 已提交
98 99 100
    logTfd = tfOpenRead(fnameStr);
  } else {
    pWal->curStatus |= WAL_CUR_FILE_WRITABLE;
L
Liu Jicong 已提交
101
    walBuildIdxName(pWal, fileFirstVer, fnameStr);
L
Liu Jicong 已提交
102
    idxTfd = tfOpenReadWrite(fnameStr);
L
Liu Jicong 已提交
103
    walBuildLogName(pWal, fileFirstVer, fnameStr);
L
Liu Jicong 已提交
104 105 106
    logTfd = tfOpenReadWrite(fnameStr);
  }

L
Liu Jicong 已提交
107 108
  pWal->writeLogTfd = logTfd;
  pWal->writeIdxTfd = idxTfd;
L
Liu Jicong 已提交
109
  return code;
L
Liu Jicong 已提交
110 111
}

L
Liu Jicong 已提交
112 113 114 115 116
int walGetVerOffset(SWal* pWal, int64_t ver) {
  int code;
  return 0;
}

L
Liu Jicong 已提交
117
int walSeekVer(SWal *pWal, int64_t ver) {
L
Liu Jicong 已提交
118
  int code;
L
Liu Jicong 已提交
119
  if(ver == pWal->lastVersion) {
L
Liu Jicong 已提交
120 121
    return 0;
  }
L
Liu Jicong 已提交
122
  if(ver > pWal->lastVersion || ver < pWal->firstVersion) {
L
Liu Jicong 已提交
123 124 125
    return -1;
  }
  if(ver < pWal->snapshotVersion) {
L
Liu Jicong 已提交
126
    //TODO: set flag to prevent roll back
L
Liu Jicong 已提交
127
  }
L
Liu Jicong 已提交
128
  if(ver < walGetCurFileFirstVer(pWal) || (ver > walGetCurFileLastVer(pWal))) {
L
Liu Jicong 已提交
129 130 131 132
    code = walChangeFile(pWal, ver);
    if(code != 0) {
      return -1;
    }
L
Liu Jicong 已提交
133
  }
L
Liu Jicong 已提交
134 135 136 137 138
  code = walSeekFilePos(pWal, ver);
  if(code != 0) {
    return -1;
  }
   
L
Liu Jicong 已提交
139 140
  return 0;
}