github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/server/sticky_engine_test.go (about) 1 // Copyright 2019 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package server 12 13 import ( 14 "context" 15 "testing" 16 17 "github.com/cockroachdb/cockroach/pkg/roachpb" 18 "github.com/cockroachdb/cockroach/pkg/storage" 19 "github.com/cockroachdb/cockroach/pkg/storage/enginepb" 20 "github.com/cockroachdb/cockroach/pkg/util/leaktest" 21 "github.com/stretchr/testify/require" 22 ) 23 24 func TestStickyEngines(t *testing.T) { 25 defer leaktest.AfterTest(t)() 26 27 ctx := context.Background() 28 engineType := enginepb.EngineTypeRocksDB 29 attrs := roachpb.Attributes{} 30 cacheSize := int64(1 << 20) 31 32 engine1, err := getOrCreateStickyInMemEngine(ctx, "engine1", engineType, attrs, cacheSize) 33 require.NoError(t, err) 34 require.False(t, engine1.Closed()) 35 36 engine2, err := getOrCreateStickyInMemEngine(ctx, "engine2", engineType, attrs, cacheSize) 37 require.NoError(t, err) 38 require.False(t, engine2.Closed()) 39 40 // Regetting the engine whilst it is not closed will fail. 41 _, err = getOrCreateStickyInMemEngine(ctx, "engine1", engineType, attrs, cacheSize) 42 require.EqualError(t, err, "sticky engine engine1 has not been closed") 43 44 // Close the engine, which allows it to be refetched. 45 engine1.Close() 46 require.True(t, engine1.Closed()) 47 require.False(t, engine1.(*stickyInMemEngine).Engine.Closed()) 48 49 // Refetching the engine should give back the same engine. 50 engine1Refetched, err := getOrCreateStickyInMemEngine(ctx, "engine1", engineType, attrs, cacheSize) 51 require.NoError(t, err) 52 require.Equal(t, engine1, engine1Refetched) 53 require.False(t, engine1.Closed()) 54 55 // Closing an engine that does not exist will error. 56 err = CloseStickyInMemEngine("engine3") 57 require.EqualError(t, err, "sticky in-mem engine engine3 does not exist") 58 59 // Cleaning up the engine should result in a new engine. 60 err = CloseStickyInMemEngine("engine1") 61 require.NoError(t, err) 62 require.True(t, engine1.Closed()) 63 require.True(t, engine1.(*stickyInMemEngine).Engine.Closed()) 64 65 newEngine1, err := getOrCreateStickyInMemEngine(ctx, "engine1", engineType, attrs, cacheSize) 66 require.NoError(t, err) 67 require.NotEqual(t, engine1, newEngine1) 68 69 // Cleaning up everything asserts everything is closed. 70 CloseAllStickyInMemEngines() 71 require.Len(t, stickyInMemEnginesRegistry.entries, 0) 72 for _, engine := range []storage.Engine{engine1, newEngine1, engine2} { 73 require.True(t, engine.Closed()) 74 require.True(t, engine.(*stickyInMemEngine).Engine.Closed()) 75 } 76 }