diff --git a/api.go b/api.go index 9617297..b2e0b4c 100644 --- a/api.go +++ b/api.go @@ -55,8 +55,12 @@ type Options struct { AutoSync bool // At what segment size it will rollover to a new segment. Defaults to 1MB. Rollover int64 - // CheckAndRecover check the head segment for integrity. If it fails in write mode will recover the data. - CheckAndRecover bool + // Check the head segment for integrity, before opening it for reading/writing. + Check bool + // Recover any good prefix from the head segment, before opening it for reading/writing. If the whole + // segment is readable and passing the integrity checks, Recover is a noop. If both Check and Recover are set, + // Open will directly try to recover the segment in read-write mode. + Recover bool // Upgrade specifies how to upgrade the versions Version VersionOptions } diff --git a/log.go b/log.go index fca3d61..7c35362 100644 --- a/log.go +++ b/log.go @@ -82,7 +82,7 @@ func Open(dir string, opts Options) (result Log, err error) { rdr := reopenReader(segment.New(dir, 0, opts.AutoSync), params, opts.Version.NewSegmentsVersion, ix) l.readers = []*reader{rdr} case opts.Readonly: - if opts.CheckAndRecover { + if opts.Check || opts.Recover { head := segments[len(segments)-1] if err := head.Check(params); err != nil { return nil, fmt.Errorf("open check: %w", err) @@ -101,11 +101,17 @@ func Open(dir string, opts Options) (result Log, err error) { l.writer = w l.readers = []*reader{w.reader} default: - if opts.CheckAndRecover { + switch { + case opts.Recover: head := segments[len(segments)-1] if err := head.Recover(params); err != nil { return nil, fmt.Errorf("open recover: %w", err) } + case opts.Check: + head := segments[len(segments)-1] + if err := head.Check(params); err != nil { + return nil, fmt.Errorf("open check: %w", err) + } } if opts.Version.EagerVersionMigrate { diff --git a/log_test.go b/log_test.go index 54172e0..10afbe6 100644 --- a/log_test.go +++ b/log_test.go @@ -1524,10 +1524,10 @@ func TestConcurrent(t *testing.T) { func testConcurrentPubsubRecent(t *testing.T) { defer os.RemoveAll("test_pubsub") s, err := Open("test_pubsub", Options{ - CreateDirs: true, - AutoSync: true, - CheckAndRecover: true, - Rollover: 1024 * 64, + CreateDirs: true, + AutoSync: true, + Check: true, + Rollover: 1024 * 64, }) require.NoError(t, err) defer s.Close()