11require " ./spec_helper"
2+ # require "../src/lavinmq/message_store"
23
34describe " Message segment metadata files" do
45 describe " Metadata file creation" do
@@ -19,15 +20,16 @@ describe "Message segment metadata files" do
1920 end
2021
2122 # Should have multiple segments or be able to verify metadata behavior
22- total_segments = queue.@msg_store .@segments .size
23+ total_segments = queue.@msg_store .as( LavinMQ :: QueueMessageStore ). @segments .size
2324
2425 # Check behavior: either we have multiple segments with .meta files,
2526 # or we can verify the metadata creation logic works
27+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
2628 if total_segments > 1
2729 # Check that .meta files exist for completed segments
2830 completed_segments_with_meta = 0
29- queue. @msg_store .@segments .each do |seg_id , mfile |
30- next if seg_id == queue. @msg_store .@segments .last_key # skip current writing segment
31+ store .@segments .each do |seg_id , mfile |
32+ next if seg_id == store .@segments .last_key # skip current writing segment
3133 meta_path = " #{ mfile.path } .meta"
3234 if File .exists?(meta_path)
3335 completed_segments_with_meta += 1
@@ -40,7 +42,7 @@ describe "Message segment metadata files" do
4042 else
4143 # If we only have one segment, verify that it doesn't have a .meta file
4244 # since it's the current writing segment
43- mfile = queue. @msg_store .@segments .first_value
45+ mfile = store .@segments .first_value
4446 meta_path = " #{ mfile.path } .meta"
4547 File .exists?(meta_path).should be_false
4648 end
@@ -60,19 +62,20 @@ describe "Message segment metadata files" do
6062 message_size = 50
6163 messages_needed = (segment_size / message_size).to_i + 10
6264
63- initial_segments = queue.@msg_store .@segments .size
65+ store = queue.@msg_store .as(LavinMQ ::AMQP ::StreamMessageStore )
66+ initial_segments = store.@segments .size
6467
6568 messages_needed.times do |i |
6669 q.publish_confirm " message #{ i } "
6770 end
6871
6972 # Should have created new segments
70- final_segments = queue. @msg_store .@segments .size
73+ final_segments = store .@segments .size
7174 final_segments.should be > initial_segments
7275
7376 # Check meta file exists and contains stream-specific data
74- queue. @msg_store .@segments .each do |seg_id , mfile |
75- next if seg_id == queue. @msg_store .@segments .last_key # skip current writing segment
77+ store .@segments .each do |seg_id , mfile |
78+ next if seg_id == store .@segments .last_key # skip current writing segment
7679 meta_path = " #{ mfile.path } .meta"
7780 File .exists?(meta_path).should be_true
7881
@@ -99,13 +102,14 @@ describe "Message segment metadata files" do
99102 with_channel(s, vhost: vhost.name) do |ch |
100103 q = ch.queue(" metadata_load_test" )
101104 queue = vhost.queues[" metadata_load_test" ].as(LavinMQ ::AMQP ::DurableQueue )
105+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
102106
103107 # Publish messages but not enough to trigger new segment
104108 50 .times { |i | q.publish_confirm " message #{ i } " }
105109
106110 # Manually create a new message store to simulate restart behavior
107- msg_dir = queue. @msg_store .@msg_dir
108- new_store = LavinMQ ::MessageStore .new(msg_dir, nil )
111+ msg_dir = store .@msg_dir
112+ new_store = LavinMQ ::QueueMessageStore .new(msg_dir, nil )
109113
110114 # Should have loaded messages correctly
111115 new_store.size.should eq 50
@@ -128,18 +132,19 @@ describe "Message segment metadata files" do
128132 with_channel(s, vhost: vhost.name) do |ch |
129133 q = ch.queue(" fallback_test" )
130134 queue = vhost.queues[" fallback_test" ].as(LavinMQ ::AMQP ::DurableQueue )
135+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
131136
132137 # Publish messages
133138 25 .times { |i | q.publish_confirm " message #{ i } " }
134139
135140 # Get message directory and create new store without metadata
136- msg_dir = queue. @msg_store .@msg_dir
141+ msg_dir = store .@msg_dir
137142
138143 # Remove any .meta files to simulate missing metadata
139144 Dir .glob(File .join(msg_dir, " *.meta" )).each { |path | File .delete(path) }
140145
141146 # Create new store - should fall back to message scanning
142- new_store = LavinMQ ::MessageStore .new(msg_dir, nil )
147+ new_store = LavinMQ ::QueueMessageStore .new(msg_dir, nil )
143148 new_store.size.should eq 25
144149 new_store.close
145150 end
@@ -154,6 +159,7 @@ describe "Message segment metadata files" do
154159 with_channel(s, vhost: vhost.name) do |ch |
155160 q = ch.queue(" delete_test" )
156161 queue = vhost.queues[" delete_test" ].as(LavinMQ ::AMQP ::DurableQueue )
162+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
157163
158164 # Fill multiple segments
159165 segment_size = LavinMQ ::Config .instance.segment_size
@@ -163,12 +169,12 @@ describe "Message segment metadata files" do
163169 messages_needed.times { |i | q.publish_confirm " message #{ i } " }
164170
165171 # Should have multiple segments now
166- queue. @msg_store .@segments .size.should be > 1
172+ store .@segments .size.should be > 1
167173
168174 # Get paths before deletion (only for completed segments that have .meta files)
169175 existing_meta_paths = [] of String
170- queue. @msg_store .@segments .each do |seg_id , mfile |
171- next if seg_id == queue. @msg_store .@segments .last_key # skip current writing segment
176+ store .@segments .each do |seg_id , mfile |
177+ next if seg_id == store .@segments .last_key # skip current writing segment
172178 meta_path = " #{ mfile.path } .meta"
173179 if File .exists?(meta_path)
174180 existing_meta_paths << meta_path
@@ -190,6 +196,7 @@ describe "Message segment metadata files" do
190196 with_channel(s, vhost: vhost.name) do |ch |
191197 q = ch.queue(" purge_test" )
192198 queue = vhost.queues[" purge_test" ].as(LavinMQ ::AMQP ::DurableQueue )
199+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
193200
194201 # Fill segments enough to create multiple segments
195202 segment_size = LavinMQ ::Config .instance.segment_size
@@ -200,8 +207,8 @@ describe "Message segment metadata files" do
200207
201208 # Collect existing meta file paths
202209 existing_meta_paths = [] of String
203- queue. @msg_store .@segments .each do |seg_id , mfile |
204- next if seg_id == queue. @msg_store .@segments .last_key # skip current writing segment
210+ store .@segments .each do |seg_id , mfile |
211+ next if seg_id == store .@segments .last_key # skip current writing segment
205212 meta_path = " #{ mfile.path } .meta"
206213 existing_meta_paths << meta_path if File .exists?(meta_path)
207214 end
@@ -221,6 +228,7 @@ describe "Message segment metadata files" do
221228 with_channel(s, vhost: vhost.name) do |ch |
222229 q = ch.queue(" cleanup_test" )
223230 queue = vhost.queues[" cleanup_test" ].as(LavinMQ ::AMQP ::DurableQueue )
231+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
224232
225233 # Create enough messages to span multiple segments
226234 segment_size = LavinMQ ::Config .instance.segment_size
@@ -229,14 +237,14 @@ describe "Message segment metadata files" do
229237
230238 messages_needed.times { |i | q.publish_confirm " message #{ i } " }
231239
232- initial_segments = queue. @msg_store .@segments .size
240+ initial_segments = store .@segments .size
233241 initial_segments.should be > 1
234242
235243 # Verify only completed segments have .meta files
236244 completed_segments = 0
237- queue. @msg_store .@segments .each do |seg_id , mfile |
245+ store .@segments .each do |seg_id , mfile |
238246 meta_path = " #{ mfile.path } .meta"
239- if seg_id == queue. @msg_store .@segments .last_key
247+ if seg_id == store .@segments .last_key
240248 # Current writing segment should not have .meta file
241249 File .exists?(meta_path).should be_false
242250 else
@@ -263,6 +271,7 @@ describe "Message segment metadata files" do
263271 with_channel(s, vhost: vhost.name) do |ch |
264272 q = ch.queue(" count_test" )
265273 queue = vhost.queues[" count_test" ].as(LavinMQ ::AMQP ::DurableQueue )
274+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
266275
267276 # Create enough messages to fill multiple segments
268277 segment_size = LavinMQ ::Config .instance.segment_size
@@ -272,16 +281,16 @@ describe "Message segment metadata files" do
272281 messages_needed.times { |i | q.publish_confirm " message #{ i } " }
273282
274283 # Verify .meta files contain message counts for completed segments
275- queue. @msg_store .@segments .each do |seg_id , mfile |
276- next if seg_id == queue. @msg_store .@segments .last_key # skip current writing segment
284+ store .@segments .each do |seg_id , mfile |
285+ next if seg_id == store .@segments .last_key # skip current writing segment
277286 meta_path = " #{ mfile.path } .meta"
278287
279288 if File .exists?(meta_path)
280289 count = File .open(meta_path, & .read_bytes(UInt32 ))
281290 count.should be > 0
282291
283292 # The count should match what's stored in the segment
284- stored_count = queue. @msg_store .@segment_msg_count [seg_id]
293+ stored_count = store .@segment_msg_count [seg_id]
285294 count.should eq stored_count
286295 end
287296 end
@@ -295,16 +304,17 @@ describe "Message segment metadata files" do
295304 with_channel(s, vhost: vhost.name) do |ch |
296305 q = ch.queue(" init_test" )
297306 queue = vhost.queues[" init_test" ].as(LavinMQ ::AMQP ::DurableQueue )
307+ store = queue.@msg_store .as(LavinMQ ::QueueMessageStore )
298308
299309 # Publish messages
300310 message_count = 42
301311 message_count.times { |i | q.publish_confirm " message #{ i } " }
302312
303313 # Get the message directory
304- msg_dir = queue. @msg_store .@msg_dir
314+ msg_dir = store .@msg_dir
305315
306316 # Create a new message store instance - should use metadata files if available
307- new_store = LavinMQ ::MessageStore .new(msg_dir, nil )
317+ new_store = LavinMQ ::QueueMessageStore .new(msg_dir, nil )
308318
309319 # Should have correct message count
310320 new_store.size.should eq message_count
0 commit comments