/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 | 81.2k | TableCache* table_cache, Iterator* iter, FileMetaData* meta) { |
19 | 81.2k | Status s; |
20 | 81.2k | meta->file_size = 0; |
21 | 81.2k | iter->SeekToFirst(); |
22 | | |
23 | 81.2k | std::string fname = TableFileName(dbname, meta->number); |
24 | 81.2k | if (iter->Valid()) { |
25 | 63.1k | WritableFile* file; |
26 | 63.1k | s = env->NewWritableFile(fname, &file); |
27 | 63.1k | if (!s.ok()) { |
28 | 0 | return s; |
29 | 0 | } |
30 | | |
31 | 63.1k | TableBuilder* builder = new TableBuilder(options, file); |
32 | 63.1k | meta->smallest.DecodeFrom(iter->key()); |
33 | 63.1k | Slice key; |
34 | 1.93M | for (; iter->Valid(); iter->Next()) { |
35 | 1.87M | key = iter->key(); |
36 | 1.87M | builder->Add(key, iter->value()); |
37 | 1.87M | } |
38 | 63.1k | if (!key.empty()) { |
39 | 63.1k | meta->largest.DecodeFrom(key); |
40 | 63.1k | } |
41 | | |
42 | | // Finish and check for builder errors |
43 | 63.1k | s = builder->Finish(); |
44 | 63.1k | if (s.ok()) { |
45 | 63.1k | meta->file_size = builder->FileSize(); |
46 | 63.1k | assert(meta->file_size > 0); |
47 | 63.1k | } |
48 | 63.1k | delete builder; |
49 | | |
50 | | // Finish and check for file errors |
51 | 63.1k | if (s.ok()) { |
52 | 63.1k | s = file->Sync(); |
53 | 63.1k | } |
54 | 63.1k | if (s.ok()) { |
55 | 63.1k | s = file->Close(); |
56 | 63.1k | } |
57 | 63.1k | delete file; |
58 | 63.1k | file = nullptr; |
59 | | |
60 | 63.1k | if (s.ok()) { |
61 | | // Verify that the table is usable |
62 | 63.1k | Iterator* it = table_cache->NewIterator(ReadOptions(), meta->number, |
63 | 63.1k | meta->file_size); |
64 | 63.1k | s = it->status(); |
65 | 63.1k | delete it; |
66 | 63.1k | } |
67 | 63.1k | } |
68 | | |
69 | | // Check for input iterator errors |
70 | 81.2k | if (!iter->status().ok()) { |
71 | 0 | s = iter->status(); |
72 | 0 | } |
73 | | |
74 | 81.2k | if (s.ok() && meta->file_size > 0) { |
75 | | // Keep it |
76 | 63.1k | } else { |
77 | 18.0k | env->RemoveFile(fname); |
78 | 18.0k | } |
79 | 81.2k | return s; |
80 | 81.2k | } |
81 | | |
82 | | } // namespace leveldb |