-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
883 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
Copyright 2018 Banco Bilbao Vizcaya Argentaria, S.A. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
package rocksdb | ||
|
||
// #include <stdlib.h> | ||
// #include <rocksdb/c.h> | ||
import "C" | ||
import ( | ||
"errors" | ||
"unsafe" | ||
) | ||
|
||
// Checkpoint provides Checkpoint functionality. | ||
// A checkpoint is an openable snapshot of a database at a point in time. | ||
type Checkpoint struct { | ||
c *C.rocksdb_checkpoint_t | ||
} | ||
|
||
// NewNativeCheckpoint creates a new checkpoint. | ||
func NewNativeCheckpoint(c *C.rocksdb_checkpoint_t) *Checkpoint { | ||
return &Checkpoint{c: c} | ||
} | ||
|
||
// CreateCheckpoint builds an openable snapshot of RocksDB on the same disk, which | ||
// accepts an output directory on the same disk, and under the directory | ||
// (1) hard-linked SST files pointing to existing live SST files | ||
// SST files will be copied if output directory is on a different filesystem | ||
// (2) a copied manifest files and other files | ||
// The directory should not already exist and will be created by this API. | ||
// The directory will be an absolute path | ||
// logSizeForFlush: if the total log file size is equal or larger than | ||
// this value, then a flush is triggered for all the column families. The | ||
// default value is 0, which means flush is always triggered. If you move | ||
// away from the default, the checkpoint may not contain up-to-date data | ||
// if WAL writing is not always enabled. | ||
// Flush will always trigger if it is 2PC. | ||
func (cp *Checkpoint) CreateCheckpoint(checkpointDir string, logSizeForFlush uint64) error { | ||
var cErr *C.char | ||
cDir := C.CString(checkpointDir) | ||
defer C.free(unsafe.Pointer(cDir)) | ||
|
||
C.rocksdb_checkpoint_create(cp.c, cDir, C.uint64_t(logSizeForFlush), &cErr) | ||
if cErr != nil { | ||
defer C.free(unsafe.Pointer(cErr)) | ||
return errors.New(C.GoString(cErr)) | ||
} | ||
return nil | ||
} | ||
|
||
// Destroy deallocates the Checkpoint object. | ||
func (cp *Checkpoint) Destroy() { | ||
C.rocksdb_checkpoint_object_destroy(cp.c) | ||
cp.c = nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
Copyright 2018 Banco Bilbao Vizcaya Argentaria, S.A. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package rocksdb | ||
|
||
import ( | ||
"io/ioutil" | ||
"os" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestCheckpoint(t *testing.T) { | ||
|
||
checkDir, err := ioutil.TempDir("", "rocksdb-checkpoint") | ||
require.NoError(t, err) | ||
err = os.RemoveAll(checkDir) | ||
require.NoError(t, err) | ||
|
||
db := newTestDB(t, "TestCheckpoint", nil) | ||
defer db.Close() | ||
|
||
// insert keys | ||
givenKeys := [][]byte{ | ||
[]byte("key1"), | ||
[]byte("key2"), | ||
[]byte("key3"), | ||
} | ||
givenValue := []byte("value") | ||
wo := NewDefaultWriteOptions() | ||
for _, k := range givenKeys { | ||
require.NoError(t, db.Put(wo, k, givenValue)) | ||
} | ||
|
||
checkpoint, err := db.NewCheckpoint() | ||
require.NoError(t, err) | ||
require.NotNil(t, checkpoint) | ||
defer checkpoint.Destroy() | ||
|
||
err = checkpoint.CreateCheckpoint(checkDir, 0) | ||
require.NoError(t, err) | ||
|
||
opts := NewDefaultOptions() | ||
dbCheck, err := OpenDBForReadOnly(checkDir, opts, true) | ||
require.NoError(t, err) | ||
defer dbCheck.Close() | ||
|
||
// test keys | ||
var value *Slice | ||
ro := NewDefaultReadOptions() | ||
for _, k := range givenKeys { | ||
value, err = dbCheck.Get(ro, k) | ||
defer value.Free() | ||
require.NoError(t, err) | ||
require.Equal(t, value.Data(), givenValue) | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
/* | ||
Copyright 2018 Banco Bilbao Vizcaya Argentaria, S.A. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package rocksdb | ||
|
||
// #include <rocksdb/c.h> | ||
import "C" | ||
|
||
// FlushOptions represent all of the available options when manual flushing the | ||
// database. | ||
type FlushOptions struct { | ||
opts *C.rocksdb_flushoptions_t | ||
} | ||
|
||
// NewDefaultFlushOptions creates a default FlushOptions object. | ||
func NewDefaultFlushOptions() *FlushOptions { | ||
return &FlushOptions{C.rocksdb_flushoptions_create()} | ||
} | ||
|
||
// SetWait specify if the flush will wait until the flush is done. | ||
// Default: true | ||
func (o *FlushOptions) SetWait(value bool) { | ||
C.rocksdb_flushoptions_set_wait(o.opts, boolToUchar(value)) | ||
} | ||
|
||
// Destroy deallocates the FlushOptions object. | ||
func (o *FlushOptions) Destroy() { | ||
C.rocksdb_flushoptions_destroy(o.opts) | ||
o.opts = nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
Copyright 2018 Banco Bilbao Vizcaya Argentaria, S.A. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package rocksdb | ||
|
||
import ( | ||
"io/ioutil" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func newTestDB(t *testing.T, name string, applyOpts func(opts *Options)) *DB { | ||
dir, err := ioutil.TempDir("", "rocksdb-"+name) | ||
require.NoError(t, err) | ||
|
||
opts := NewDefaultOptions() | ||
opts.SetCreateIfMissing(true) | ||
if applyOpts != nil { | ||
applyOpts(opts) | ||
} | ||
|
||
db, err := OpenDB(dir, opts) | ||
require.NoError(t, err) | ||
|
||
return db | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.