mirror of
				https://github.com/taigrr/bitcask
				synced 2025-01-18 04:03:17 -08:00 
			
		
		
		
	retain lock file after merge (#201)
* Add test case for Locking after Merge * retain lock file after merge * remove replacing lock file (not needed) Co-authored-by: James Mills <prologic@shortcircuit.net.au> Co-authored-by: yash <yash.chandra@grabpay.com>
This commit is contained in:
		
							parent
							
								
									6e423ae179
								
							
						
					
					
						commit
						f397bec88f
					
				
							
								
								
									
										16
									
								
								bitcask.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								bitcask.go
									
									
									
									
									
								
							| @ -22,6 +22,10 @@ import ( | ||||
| 	"github.com/prologic/bitcask/internal/metadata" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	lockfile = "lock" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// ErrKeyNotFound is the error returned when a key is not found | ||||
| 	ErrKeyNotFound = errors.New("error: key not found") | ||||
| @ -96,13 +100,15 @@ func (b *Bitcask) Stats() (stats Stats, err error) { | ||||
| // database. | ||||
| func (b *Bitcask) Close() error { | ||||
| 	b.mu.RLock() | ||||
| 	defer b.mu.RUnlock() | ||||
| 	defer func() { | ||||
| 		b.mu.RUnlock() | ||||
| 		b.Flock.Unlock() | ||||
| 	}() | ||||
| 
 | ||||
| 	return b.close() | ||||
| } | ||||
| 
 | ||||
| func (b *Bitcask) close() error { | ||||
| 	defer b.Flock.Unlock() | ||||
| 	if err := b.saveIndex(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @ -490,7 +496,7 @@ func (b *Bitcask) Merge() error { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, file := range files { | ||||
| 		if file.IsDir() { | ||||
| 		if file.IsDir() || file.Name() == lockfile { | ||||
| 			continue | ||||
| 		} | ||||
| 		ids, err := internal.ParseIds([]string{file.Name()}) | ||||
| @ -563,7 +569,7 @@ func Open(path string, options ...Option) (*Bitcask, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	bitcask := &Bitcask{ | ||||
| 		Flock:    flock.New(filepath.Join(path, "lock")), | ||||
| 		Flock:    flock.New(filepath.Join(path, lockfile)), | ||||
| 		config:   cfg, | ||||
| 		options:  options, | ||||
| 		path:     path, | ||||
| @ -604,7 +610,7 @@ func (b *Bitcask) Backup(path string) error { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return internal.Copy(b.path, path, []string{"lock"}) | ||||
| 	return internal.Copy(b.path, path, []string{lockfile}) | ||||
| } | ||||
| 
 | ||||
| // saveIndex saves index currently in RAM to disk | ||||
|  | ||||
| @ -1627,6 +1627,27 @@ func TestLocking(t *testing.T) { | ||||
| 	assert.Error(err) | ||||
| } | ||||
| 
 | ||||
| func TestLockingAfterMerge(t *testing.T) { | ||||
| 	assert := assert.New(t) | ||||
| 
 | ||||
| 	testdir, err := ioutil.TempDir("", "bitcask") | ||||
| 	assert.NoError(err) | ||||
| 
 | ||||
| 	db, err := Open(testdir) | ||||
| 	assert.NoError(err) | ||||
| 	defer db.Close() | ||||
| 
 | ||||
| 	_, err = Open(testdir) | ||||
| 	assert.Error(err) | ||||
| 
 | ||||
| 	err = db.Merge() | ||||
| 	assert.NoError(err) | ||||
| 
 | ||||
| 	// This should still error. | ||||
| 	_, err = Open(testdir) | ||||
| 	assert.Error(err) | ||||
| } | ||||
| 
 | ||||
| type benchmarkTestCase struct { | ||||
| 	name string | ||||
| 	size int | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user