-
Notifications
You must be signed in to change notification settings - Fork 21.5k
core/rawdb: Enforce readonly in freezer instantiation #24119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
63c9ce9
169e100
41f42bf
a5360a9
8f42a64
114a81e
208c7a9
2ddb5ec
d04392a
163dcbc
e0e70f0
60dd843
b1aecc2
0ad8cf8
6255ab1
803035b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -133,7 +133,7 @@ func newFreezer(datadir string, namespace string, readonly bool, maxTableSize ui | |
|
|
||
| // Create the tables. | ||
| for name, disableSnappy := range tables { | ||
| table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy) | ||
| table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) | ||
| if err != nil { | ||
| for _, table := range freezer.tables { | ||
| table.Close() | ||
|
|
@@ -144,8 +144,15 @@ func newFreezer(datadir string, namespace string, readonly bool, maxTableSize ui | |
| freezer.tables[name] = table | ||
| } | ||
|
|
||
| // Truncate all tables to common length. | ||
| if err := freezer.repair(); err != nil { | ||
| if freezer.readonly { | ||
| // In readonly mode only validate, don't truncate. | ||
| // validate also sets `freezer.frozen`. | ||
| err = freezer.validate() | ||
| } else { | ||
| // Truncate all tables to common length. | ||
| err = freezer.repair() | ||
| } | ||
| if err != nil { | ||
| for _, table := range freezer.tables { | ||
| table.Close() | ||
| } | ||
|
|
@@ -308,6 +315,31 @@ func (f *freezer) Sync() error { | |
| return nil | ||
| } | ||
|
|
||
| // validate checks that every table has the same length. | ||
| // Used instead of `repair` in readonly mode. | ||
| func (f *freezer) validate() error { | ||
| if len(f.tables) == 0 { | ||
| return nil | ||
| } | ||
| var length uint64 | ||
| var name string | ||
| // Hack to get length of any table | ||
| for k, table := range f.tables { | ||
|
||
| length = atomic.LoadUint64(&table.items) | ||
| name = k | ||
| break | ||
| } | ||
| // Now check every table against that length | ||
| for k, table := range f.tables { | ||
| items := atomic.LoadUint64(&table.items) | ||
| if length != items { | ||
| return fmt.Errorf("freezer tables %s and %s have differing lengths: %d != %d", k, name, items, length) | ||
| } | ||
| } | ||
| atomic.StoreUint64(&f.frozen, length) | ||
| return nil | ||
| } | ||
|
|
||
| // repair truncates all data tables to the same length. | ||
| func (f *freezer) repair() error { | ||
| min := uint64(math.MaxUint64) | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.