Coverage Report

Created: 2023-01-25 06:32

/src/leveldb/db/builder.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5
#include "db/builder.h"
6
7
#include "db/dbformat.h"
8
#include "db/filename.h"
9
#include "db/table_cache.h"
10
#include "db/version_edit.h"
11
#include "leveldb/db.h"
12
#include "leveldb/env.h"
13
#include "leveldb/iterator.h"
14
15
namespace leveldb {
16
17
Status BuildTable(const std::string& dbname, Env* env, const Options& options,
18
67.4k
                  TableCache* table_cache, Iterator* iter, FileMetaData* meta) {
19
67.4k
  Status s;
20
67.4k
  meta->file_size = 0;
21
67.4k
  iter->SeekToFirst();
22
23
67.4k
  std::string fname = TableFileName(dbname, meta->number);
24
67.4k
  if (iter->Valid()) {
25
53.1k
    WritableFile* file;
26
53.1k
    s = env->NewWritableFile(fname, &file);
27
53.1k
    if (!s.ok()) {
28
0
      return s;
29
0
    }
30
31
53.1k
    TableBuilder* builder = new TableBuilder(options, file);
32
53.1k
    meta->smallest.DecodeFrom(iter->key());
33
53.1k
    Slice key;
34
1.70M
    for (; iter->Valid(); iter->Next()) {
35
1.65M
      key = iter->key();
36
1.65M
      builder->Add(key, iter->value());
37
1.65M
    }
38
53.1k
    if (!key.empty()) {
39
53.1k
      meta->largest.DecodeFrom(key);
40
53.1k
    }
41
42
    // Finish and check for builder errors
43
53.1k
    s = builder->Finish();
44
53.1k
    if (s.ok()) {
45
53.1k
      meta->file_size = builder->FileSize();
46
53.1k
      assert(meta->file_size > 0);
47
53.1k
    }
48
53.1k
    delete builder;
49
50
    // Finish and check for file errors
51
53.1k
    if (s.ok()) {
52
53.1k
      s = file->Sync();
53
53.1k
    }
54
53.1k
    if (s.ok()) {
55
53.1k
      s = file->Close();
56
53.1k
    }
57
53.1k
    delete file;
58
53.1k
    file = nullptr;
59
60
53.1k
    if (s.ok()) {
61
      // Verify that the table is usable
62
53.1k
      Iterator* it = table_cache->NewIterator(ReadOptions(), meta->number,
63
53.1k
                                              meta->file_size);
64
53.1k
      s = it->status();
65
53.1k
      delete it;
66
53.1k
    }
67
53.1k
  }
68
69
  // Check for input iterator errors
70
67.4k
  if (!iter->status().ok()) {
71
0
    s = iter->status();
72
0
  }
73
74
67.4k
  if (s.ok() && meta->file_size > 0) {
75
    // Keep it
76
53.1k
  } else {
77
14.3k
    env->RemoveFile(fname);
78
14.3k
  }
79
67.4k
  return s;
80
67.4k
}
81
82
}  // namespace leveldb