ea0a7586b8
12 lines above, there is an "if (!s.ok()) { return s; }" block of code. "s" is never modified between that block and the "if" removed by this CL, so "s.ok()" must be true. The code most likely intended to say "if (!builder->ok())", because the builder->Add() call above can modify the TableBuilder's status, as a side-effect. However, this approach would have required setting "s = builder.status()" in the "else" branch, near the "builder.Abandon()" call. So, removing the "if" outright is simpler than following that line of thought. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=167326229
85 lines
2.0 KiB
C++
85 lines
2.0 KiB
C++
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
#include "db/builder.h"
|
|
|
|
#include "db/filename.h"
|
|
#include "db/dbformat.h"
|
|
#include "db/table_cache.h"
|
|
#include "db/version_edit.h"
|
|
#include "leveldb/db.h"
|
|
#include "leveldb/env.h"
|
|
#include "leveldb/iterator.h"
|
|
|
|
namespace leveldb {
|
|
|
|
Status BuildTable(const std::string& dbname,
|
|
Env* env,
|
|
const Options& options,
|
|
TableCache* table_cache,
|
|
Iterator* iter,
|
|
FileMetaData* meta) {
|
|
Status s;
|
|
meta->file_size = 0;
|
|
iter->SeekToFirst();
|
|
|
|
std::string fname = TableFileName(dbname, meta->number);
|
|
if (iter->Valid()) {
|
|
WritableFile* file;
|
|
s = env->NewWritableFile(fname, &file);
|
|
if (!s.ok()) {
|
|
return s;
|
|
}
|
|
|
|
TableBuilder* builder = new TableBuilder(options, file);
|
|
meta->smallest.DecodeFrom(iter->key());
|
|
for (; iter->Valid(); iter->Next()) {
|
|
Slice key = iter->key();
|
|
meta->largest.DecodeFrom(key);
|
|
builder->Add(key, iter->value());
|
|
}
|
|
|
|
// Finish and check for builder errors
|
|
s = builder->Finish();
|
|
if (s.ok()) {
|
|
meta->file_size = builder->FileSize();
|
|
assert(meta->file_size > 0);
|
|
}
|
|
delete builder;
|
|
|
|
// Finish and check for file errors
|
|
if (s.ok()) {
|
|
s = file->Sync();
|
|
}
|
|
if (s.ok()) {
|
|
s = file->Close();
|
|
}
|
|
delete file;
|
|
file = NULL;
|
|
|
|
if (s.ok()) {
|
|
// Verify that the table is usable
|
|
Iterator* it = table_cache->NewIterator(ReadOptions(),
|
|
meta->number,
|
|
meta->file_size);
|
|
s = it->status();
|
|
delete it;
|
|
}
|
|
}
|
|
|
|
// Check for input iterator errors
|
|
if (!iter->status().ok()) {
|
|
s = iter->status();
|
|
}
|
|
|
|
if (s.ok() && meta->file_size > 0) {
|
|
// Keep it
|
|
} else {
|
|
env->DeleteFile(fname);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
} // namespace leveldb
|