@@ -25,52 +25,20 @@ private bool MigrateKeysFromMainStore()
25
25
var bufPtr = buffer . GetValidPointer ( ) ;
26
26
var bufPtrEnd = bufPtr + bufferSize ;
27
27
var o = new SpanByteAndMemory ( bufPtr , ( int ) ( bufPtrEnd - bufPtr ) ) ;
28
+ var migrateTask = migrateTasks [ 0 ] ;
28
29
29
30
try
30
31
{
31
32
// Transition keys to MIGRATING status
32
- migrateTasks [ 0 ] . sketch . SetStatus ( SketchStatus . TRANSMITTING ) ;
33
+ migrateTask . sketch . SetStatus ( SketchStatus . TRANSMITTING ) ;
33
34
WaitForConfigPropagation ( ) ;
34
35
35
- ////////////////
36
- // Build Input//
37
- ////////////////
38
- var input = new RawStringInput ( RespCommandAccessor . MIGRATE ) ;
39
- var keys = migrateTasks [ 0 ] . sketch . Keys ;
40
- for ( var i = 0 ; i < migrateTasks [ 0 ] . sketch . Keys . Count ; i ++ )
36
+ // Transmit keys from main store
37
+ if ( ! migrateTask . TransmitKeys ( StoreType . Main ) )
41
38
{
42
- if ( keys [ i ] . Item2 ) continue ;
43
- var spanByte = keys [ i ] . Item1 . SpanByte ;
44
-
45
- // Read value for key
46
- var status = localServerSessions [ 0 ] . BasicGarnetApi . Read_MainStore ( ref spanByte , ref input , ref o ) ;
47
-
48
- // Skip if key NOTFOUND
49
- if ( status == GarnetStatus . NOTFOUND )
50
- continue ;
51
-
52
- // Get SpanByte from stack if any
53
- ref var value = ref o . SpanByte ;
54
- if ( ! o . IsSpanByte )
55
- {
56
- // Reinterpret heap memory to SpanByte
57
- value = ref SpanByte . ReinterpretWithoutLength ( o . Memory . Memory . Span ) ;
58
- }
59
-
60
- // Write key to network buffer if it has not expired
61
- if ( ! ClusterSession . Expired ( ref value ) && ! WriteOrSendMainStoreKeyValuePair ( ref spanByte , ref value ) )
62
- return false ;
63
-
64
- // Reset SpanByte for next read if any but don't dispose heap buffer as we might re-use it
65
- o . SpanByte = new SpanByte ( ( int ) ( bufPtrEnd - bufPtr ) , ( IntPtr ) bufPtr ) ;
66
-
67
- // Mark for deletion
68
- keys [ i ] = ( keys [ i ] . Item1 , true ) ;
69
- }
70
-
71
- // Flush data in client buffer
72
- if ( ! HandleMigrateTaskResponse ( _gcs . SendAndResetIterationBuffer ( ) ) )
39
+ logger ? . LogError ( "Failed transmitting keys from main store" ) ;
73
40
return false ;
41
+ }
74
42
75
43
DeleteKeys ( ) ;
76
44
}
@@ -93,40 +61,18 @@ private bool MigrateKeysFromMainStore()
93
61
/// <returns>True on success, false otherwise</returns>
94
62
private bool MigrateKeysFromObjectStore ( )
95
63
{
96
- // NOTE: Any keys not found in main store are automatically set to QUEUED before this method is called
97
- // Transition all QUEUED to MIGRATING state
98
- migrateTasks [ 0 ] . sketch . SetStatus ( SketchStatus . TRANSMITTING ) ;
64
+ var migrateTask = migrateTasks [ 0 ] ;
65
+ // NOTE: Any keys not found in main store are automatically set to INITIALIZING before this method is called
66
+ // Transition all INITIALIZING to TRANSMITTING state
67
+ migrateTask . sketch . SetStatus ( SketchStatus . TRANSMITTING ) ;
99
68
WaitForConfigPropagation ( ) ;
100
69
101
- var keys = migrateTasks [ 0 ] . sketch . Keys ;
102
- for ( var i = 0 ; i < migrateTasks [ 0 ] . sketch . Keys . Count ; i ++ )
70
+ // Transmit keys from object store
71
+ if ( ! migrateTask . TransmitKeys ( StoreType . Object ) )
103
72
{
104
- if ( keys [ i ] . Item2 ) continue ;
105
- var keyByteArray = keys [ i ] . Item1 . ToArray ( ) ;
106
-
107
- ObjectInput input = default ;
108
- GarnetObjectStoreOutput value = default ;
109
- var status = localServerSessions [ 0 ] . BasicGarnetApi . Read_ObjectStore ( ref keyByteArray , ref input , ref value ) ;
110
-
111
- // Skip if key NOTFOUND
112
- if ( status == GarnetStatus . NOTFOUND )
113
- continue ;
114
-
115
- if ( ! ClusterSession . Expired ( ref value . GarnetObject ) )
116
- {
117
- var objectData = GarnetObjectSerializer . Serialize ( value . GarnetObject ) ;
118
-
119
- if ( ! WriteOrSendObjectStoreKeyValuePair ( keyByteArray , objectData , value . GarnetObject . Expiration ) )
120
- return false ;
121
- }
122
-
123
- // Mark for deletion
124
- keys [ i ] = ( keys [ i ] . Item1 , true ) ;
125
- }
126
-
127
- // Flush data in client buffer
128
- if ( ! HandleMigrateTaskResponse ( _gcs . SendAndResetIterationBuffer ( ) ) )
73
+ logger ? . LogError ( "Failed transmitting keys from object store" ) ;
129
74
return false ;
75
+ }
130
76
131
77
// Delete keys if COPY option is false or transition KEYS from MIGRATING to MIGRATED status
132
78
DeleteKeys ( ) ;
@@ -138,51 +84,39 @@ private bool MigrateKeysFromObjectStore()
138
84
/// </summary>
139
85
private void DeleteKeys ( )
140
86
{
141
- if ( _copyOption )
142
- goto migrated ;
143
-
144
- // Transition to deleting to block read requests
145
- migrateTasks [ 0 ] . sketch . SetStatus ( SketchStatus . DELETING ) ;
87
+ var migrateTask = migrateTasks [ 0 ] ;
88
+ // Transition to deleting to block read requests
89
+ migrateTask . sketch . SetStatus ( SketchStatus . DELETING ) ;
146
90
WaitForConfigPropagation ( ) ;
147
91
148
- foreach ( var pair in migrateTasks [ 0 ] . sketch . Keys )
149
- {
150
- if ( ! pair . Item2 ) continue ;
151
- var spanByte = pair . Item1 . SpanByte ;
152
- _ = localServerSessions [ 0 ] . BasicGarnetApi . DELETE ( ref spanByte ) ;
153
- }
92
+ // Delete keys
93
+ migrateTask . DeleteKeys ( ) ;
154
94
155
- migrated :
156
95
// Transition to MIGRATED to release waiting operations
157
- migrateTasks [ 0 ] . sketch . SetStatus ( SketchStatus . MIGRATED ) ;
96
+ migrateTask . sketch . SetStatus ( SketchStatus . MIGRATED ) ;
158
97
WaitForConfigPropagation ( ) ;
159
98
}
160
99
161
100
/// <summary>
162
101
/// Method used to migrate keys from main and object stores.
163
102
/// This method is used to process the MIGRATE KEYS transfer option.
164
103
/// </summary>
165
- /// <param name="storeType"></param>
166
104
/// <returns></returns>
167
- public bool MigrateKeys ( StoreType storeType = StoreType . All )
105
+ public bool MigrateKeys ( )
168
106
{
169
107
try
170
108
{
171
- if ( ! CheckConnection ( ) )
109
+ var migrateTask = migrateTasks [ 0 ] ;
110
+ if ( ! migrateTask . Initialize ( ) )
172
111
return false ;
173
112
174
- if ( storeType is StoreType . All or StoreType . Main )
175
- {
176
- // Migrate main store keys
177
- _gcs . InitializeIterationBuffer ( clusterProvider . storeWrapper . loggingFrequency ) ;
178
- if ( ! MigrateKeysFromMainStore ( ) )
179
- return false ;
180
- }
113
+ // Migrate main store keys
114
+ if ( ! MigrateKeysFromMainStore ( ) )
115
+ return false ;
181
116
182
117
// Migrate object store keys
183
- if ( ! clusterProvider . serverOptions . DisableObjects && storeType is StoreType . All or StoreType . Object )
118
+ if ( ! clusterProvider . serverOptions . DisableObjects )
184
119
{
185
- _gcs . InitializeIterationBuffer ( clusterProvider . storeWrapper . loggingFrequency ) ;
186
120
if ( ! MigrateKeysFromObjectStore ( ) )
187
121
return false ;
188
122
}
0 commit comments