From ebb75fa690d9bbaa9f544d3b230c3976e3e34b55 Mon Sep 17 00:00:00 2001
From: pcherenkov <pcherenkov@gmail.com>
Date: Tue, 24 Jan 2012 17:37:47 +0400
Subject: [PATCH] fix for bug920951: server crashes on cat command

---
 core/log_io.m       |  23 +-
 test/box/cat.result | 506 ++++++++++++++++++++++++++++++++++++++++++++
 test/box/cat.test   |  24 +++
 3 files changed, 546 insertions(+), 7 deletions(-)
 create mode 100644 test/box/cat.result
 create mode 100644 test/box/cat.test

diff --git a/core/log_io.m b/core/log_io.m
index 1b1d54739d..f07331f370 100644
--- a/core/log_io.m
+++ b/core/log_io.m
@@ -62,11 +62,6 @@ const char *xlog_mark = "XLOG\n";
 
 static struct tbuf *row_reader_v11(FILE *f, struct palloc_pool *pool);
 
-/* Will be set to either HW or SW CRC32 calculation routine depending on CPU
-   capabilities. */
-static u_int32_t (*calc_crc32c)(u_int32_t crc, const unsigned char *buf,
-				unsigned int len) = NULL;
-
 struct log_io_iter {
 	struct tarantool_coro coro;
 	struct log_io *log;
@@ -77,6 +72,19 @@ struct log_io_iter {
 	int io_rate_limit;
 };
 
+typedef u_int32_t (*crc32_func_t)(u_int32_t crc, const unsigned char *buf,
+		unsigned int len);
+
+static crc32_func_t
+pick_crc32_func ()
+{
+	static crc32_func_t impl = NULL;
+	if (!impl)
+		impl = cpu_has (cpuf_sse4_2) ? &crc32c_hw : &crc32c;
+
+	return impl;
+}
+
 
 void
 wait_lsn_set(struct wait_lsn *wait_lsn, i64 lsn)
@@ -454,6 +462,7 @@ static struct tbuf *
 row_reader_v11(FILE *f, struct palloc_pool *pool)
 {
 	struct tbuf *m = tbuf_alloc(pool);
+	crc32_func_t calc_crc32c = pick_crc32_func ();
 
 	u32 header_crc, data_crc;
 
@@ -1191,6 +1200,7 @@ write_to_disk(void *_state, struct tbuf *t)
 	struct tbuf *reply, *header;
 	struct recovery_state *r = _state;
 	u32 result = 0;
+	crc32_func_t calc_crc32c = pick_crc32_func ();
 
 	/* we're not running inside ev_loop, so update ev_now manually */
 	ev_now_update();
@@ -1337,8 +1347,6 @@ recover_init(const char *snap_dirname, const char *wal_dirname,
 	r->wal_class->fsync_delay = fsync_delay;
 	wait_lsn_clear(&r->wait_lsn);
 
-	calc_crc32c = cpu_has (cpuf_sse4_2) ? &crc32c_hw : &crc32c;
-
 	if ((flags & RECOVER_READONLY) == 0)
 		r->wal_writer = spawn_child("wal_writer", inbox_size, write_to_disk, r);
 
@@ -1372,6 +1380,7 @@ write_rows(struct log_io_iter *i)
 {
 	struct log_io *l = i->log;
 	struct tbuf *row, *data;
+	crc32_func_t calc_crc32c = pick_crc32_func ();
 
 	row = tbuf_alloc(eter_pool);
 	tbuf_ensure(row, sizeof(struct row_v11));
diff --git a/test/box/cat.result b/test/box/cat.result
new file mode 100644
index 0000000000..6d6d507f2f
--- /dev/null
+++ b/test/box/cat.result
@@ -0,0 +1,506 @@
+
+# Verify that the server starts from a pre-recorded snapshot.
+# This way we check that the server can read old snapshots (v11)
+# going forward.
+
+tarantool_box --cat=00000000000000000500.snap
+n:0 1: {'I am a tuple 1'}
+n:0 2: {'I am a tuple 2'}
+n:0 3: {'I am a tuple 3'}
+n:0 4: {'I am a tuple 4'}
+n:0 5: {'I am a tuple 5'}
+n:0 6: {'I am a tuple 6'}
+n:0 7: {'I am a tuple 7'}
+n:0 8: {'I am a tuple 8'}
+n:0 9: {'I am a tuple 9'}
+n:0 10: {'I am a tuple 10'}
+n:0 11: {'I am a tuple 11'}
+n:0 12: {'I am a tuple 12'}
+n:0 13: {'I am a tuple 13'}
+n:0 14: {'I am a tuple 14'}
+n:0 15: {'I am a tuple 15'}
+n:0 16: {'I am a tuple 16'}
+n:0 17: {'I am a tuple 17'}
+n:0 18: {'I am a tuple 18'}
+n:0 19: {'I am a tuple 19'}
+n:0 20: {'I am a tuple 20'}
+n:0 21: {'I am a tuple 21'}
+n:0 22: {'I am a tuple 22'}
+n:0 23: {'I am a tuple 23'}
+n:0 24: {'I am a tuple 24'}
+n:0 25: {'I am a tuple 25'}
+n:0 26: {'I am a tuple 26'}
+n:0 27: {'I am a tuple 27'}
+n:0 28: {'I am a tuple 28'}
+n:0 29: {'I am a tuple 29'}
+n:0 30: {'I am a tuple 30'}
+n:0 31: {'I am a tuple 31'}
+n:0 32: {'I am a tuple 32'}
+n:0 33: {'I am a tuple 33'}
+n:0 34: {'I am a tuple 34'}
+n:0 35: {'I am a tuple 35'}
+n:0 36: {'I am a tuple 36'}
+n:0 37: {'I am a tuple 37'}
+n:0 38: {'I am a tuple 38'}
+n:0 39: {'I am a tuple 39'}
+n:0 40: {'I am a tuple 40'}
+n:0 41: {'I am a tuple 41'}
+n:0 42: {'I am a tuple 42'}
+n:0 43: {'I am a tuple 43'}
+n:0 44: {'I am a tuple 44'}
+n:0 45: {'I am a tuple 45'}
+n:0 46: {'I am a tuple 46'}
+n:0 47: {'I am a tuple 47'}
+n:0 48: {'I am a tuple 48'}
+n:0 49: {'I am a tuple 49'}
+n:0 50: {'I am a tuple 50'}
+n:0 51: {'I am a tuple 51'}
+n:0 52: {'I am a tuple 52'}
+n:0 53: {'I am a tuple 53'}
+n:0 54: {'I am a tuple 54'}
+n:0 55: {'I am a tuple 55'}
+n:0 56: {'I am a tuple 56'}
+n:0 57: {'I am a tuple 57'}
+n:0 58: {'I am a tuple 58'}
+n:0 59: {'I am a tuple 59'}
+n:0 60: {'I am a tuple 60'}
+n:0 61: {'I am a tuple 61'}
+n:0 62: {'I am a tuple 62'}
+n:0 63: {'I am a tuple 63'}
+n:0 64: {'I am a tuple 64'}
+n:0 65: {'I am a tuple 65'}
+n:0 66: {'I am a tuple 66'}
+n:0 67: {'I am a tuple 67'}
+n:0 68: {'I am a tuple 68'}
+n:0 69: {'I am a tuple 69'}
+n:0 70: {'I am a tuple 70'}
+n:0 71: {'I am a tuple 71'}
+n:0 72: {'I am a tuple 72'}
+n:0 73: {'I am a tuple 73'}
+n:0 74: {'I am a tuple 74'}
+n:0 75: {'I am a tuple 75'}
+n:0 76: {'I am a tuple 76'}
+n:0 77: {'I am a tuple 77'}
+n:0 78: {'I am a tuple 78'}
+n:0 79: {'I am a tuple 79'}
+n:0 80: {'I am a tuple 80'}
+n:0 81: {'I am a tuple 81'}
+n:0 82: {'I am a tuple 82'}
+n:0 83: {'I am a tuple 83'}
+n:0 84: {'I am a tuple 84'}
+n:0 85: {'I am a tuple 85'}
+n:0 86: {'I am a tuple 86'}
+n:0 87: {'I am a tuple 87'}
+n:0 88: {'I am a tuple 88'}
+n:0 89: {'I am a tuple 89'}
+n:0 90: {'I am a tuple 90'}
+n:0 91: {'I am a tuple 91'}
+n:0 92: {'I am a tuple 92'}
+n:0 93: {'I am a tuple 93'}
+n:0 94: {'I am a tuple 94'}
+n:0 95: {'I am a tuple 95'}
+n:0 96: {'I am a tuple 96'}
+n:0 97: {'I am a tuple 97'}
+n:0 98: {'I am a tuple 98'}
+n:0 99: {'I am a tuple 99'}
+n:0 100: {'I am a tuple 100'}
+n:0 101: {'I am a tuple 101'}
+n:0 102: {'I am a tuple 102'}
+n:0 103: {'I am a tuple 103'}
+n:0 104: {'I am a tuple 104'}
+n:0 105: {'I am a tuple 105'}
+n:0 106: {'I am a tuple 106'}
+n:0 107: {'I am a tuple 107'}
+n:0 108: {'I am a tuple 108'}
+n:0 109: {'I am a tuple 109'}
+n:0 110: {'I am a tuple 110'}
+n:0 111: {'I am a tuple 111'}
+n:0 112: {'I am a tuple 112'}
+n:0 113: {'I am a tuple 113'}
+n:0 114: {'I am a tuple 114'}
+n:0 115: {'I am a tuple 115'}
+n:0 116: {'I am a tuple 116'}
+n:0 117: {'I am a tuple 117'}
+n:0 118: {'I am a tuple 118'}
+n:0 119: {'I am a tuple 119'}
+n:0 120: {'I am a tuple 120'}
+n:0 121: {'I am a tuple 121'}
+n:0 122: {'I am a tuple 122'}
+n:0 123: {'I am a tuple 123'}
+n:0 124: {'I am a tuple 124'}
+n:0 125: {'I am a tuple 125'}
+n:0 126: {'I am a tuple 126'}
+n:0 127: {'I am a tuple 127'}
+n:0 128: {'I am a tuple 128'}
+n:0 129: {'I am a tuple 129'}
+n:0 130: {'I am a tuple 130'}
+n:0 131: {'I am a tuple 131'}
+n:0 132: {'I am a tuple 132'}
+n:0 133: {'I am a tuple 133'}
+n:0 134: {'I am a tuple 134'}
+n:0 135: {'I am a tuple 135'}
+n:0 136: {'I am a tuple 136'}
+n:0 137: {'I am a tuple 137'}
+n:0 138: {'I am a tuple 138'}
+n:0 139: {'I am a tuple 139'}
+n:0 140: {'I am a tuple 140'}
+n:0 141: {'I am a tuple 141'}
+n:0 142: {'I am a tuple 142'}
+n:0 143: {'I am a tuple 143'}
+n:0 144: {'I am a tuple 144'}
+n:0 145: {'I am a tuple 145'}
+n:0 146: {'I am a tuple 146'}
+n:0 147: {'I am a tuple 147'}
+n:0 148: {'I am a tuple 148'}
+n:0 149: {'I am a tuple 149'}
+n:0 150: {'I am a tuple 150'}
+n:0 151: {'I am a tuple 151'}
+n:0 152: {'I am a tuple 152'}
+n:0 153: {'I am a tuple 153'}
+n:0 154: {'I am a tuple 154'}
+n:0 155: {'I am a tuple 155'}
+n:0 156: {'I am a tuple 156'}
+n:0 157: {'I am a tuple 157'}
+n:0 158: {'I am a tuple 158'}
+n:0 159: {'I am a tuple 159'}
+n:0 160: {'I am a tuple 160'}
+n:0 161: {'I am a tuple 161'}
+n:0 162: {'I am a tuple 162'}
+n:0 163: {'I am a tuple 163'}
+n:0 164: {'I am a tuple 164'}
+n:0 165: {'I am a tuple 165'}
+n:0 166: {'I am a tuple 166'}
+n:0 167: {'I am a tuple 167'}
+n:0 168: {'I am a tuple 168'}
+n:0 169: {'I am a tuple 169'}
+n:0 170: {'I am a tuple 170'}
+n:0 171: {'I am a tuple 171'}
+n:0 172: {'I am a tuple 172'}
+n:0 173: {'I am a tuple 173'}
+n:0 174: {'I am a tuple 174'}
+n:0 175: {'I am a tuple 175'}
+n:0 176: {'I am a tuple 176'}
+n:0 177: {'I am a tuple 177'}
+n:0 178: {'I am a tuple 178'}
+n:0 179: {'I am a tuple 179'}
+n:0 180: {'I am a tuple 180'}
+n:0 181: {'I am a tuple 181'}
+n:0 182: {'I am a tuple 182'}
+n:0 183: {'I am a tuple 183'}
+n:0 184: {'I am a tuple 184'}
+n:0 185: {'I am a tuple 185'}
+n:0 186: {'I am a tuple 186'}
+n:0 187: {'I am a tuple 187'}
+n:0 188: {'I am a tuple 188'}
+n:0 189: {'I am a tuple 189'}
+n:0 190: {'I am a tuple 190'}
+n:0 191: {'I am a tuple 191'}
+n:0 192: {'I am a tuple 192'}
+n:0 193: {'I am a tuple 193'}
+n:0 194: {'I am a tuple 194'}
+n:0 195: {'I am a tuple 195'}
+n:0 196: {'I am a tuple 196'}
+n:0 197: {'I am a tuple 197'}
+n:0 198: {'I am a tuple 198'}
+n:0 199: {'I am a tuple 199'}
+n:0 200: {'I am a tuple 200'}
+n:0 201: {'I am a tuple 201'}
+n:0 202: {'I am a tuple 202'}
+n:0 203: {'I am a tuple 203'}
+n:0 204: {'I am a tuple 204'}
+n:0 205: {'I am a tuple 205'}
+n:0 206: {'I am a tuple 206'}
+n:0 207: {'I am a tuple 207'}
+n:0 208: {'I am a tuple 208'}
+n:0 209: {'I am a tuple 209'}
+n:0 210: {'I am a tuple 210'}
+n:0 211: {'I am a tuple 211'}
+n:0 212: {'I am a tuple 212'}
+n:0 213: {'I am a tuple 213'}
+n:0 214: {'I am a tuple 214'}
+n:0 215: {'I am a tuple 215'}
+n:0 216: {'I am a tuple 216'}
+n:0 217: {'I am a tuple 217'}
+n:0 218: {'I am a tuple 218'}
+n:0 219: {'I am a tuple 219'}
+n:0 220: {'I am a tuple 220'}
+n:0 221: {'I am a tuple 221'}
+n:0 222: {'I am a tuple 222'}
+n:0 223: {'I am a tuple 223'}
+n:0 224: {'I am a tuple 224'}
+n:0 225: {'I am a tuple 225'}
+n:0 226: {'I am a tuple 226'}
+n:0 227: {'I am a tuple 227'}
+n:0 228: {'I am a tuple 228'}
+n:0 229: {'I am a tuple 229'}
+n:0 230: {'I am a tuple 230'}
+n:0 231: {'I am a tuple 231'}
+n:0 232: {'I am a tuple 232'}
+n:0 233: {'I am a tuple 233'}
+n:0 234: {'I am a tuple 234'}
+n:0 235: {'I am a tuple 235'}
+n:0 236: {'I am a tuple 236'}
+n:0 237: {'I am a tuple 237'}
+n:0 238: {'I am a tuple 238'}
+n:0 239: {'I am a tuple 239'}
+n:0 240: {'I am a tuple 240'}
+n:0 241: {'I am a tuple 241'}
+n:0 242: {'I am a tuple 242'}
+n:0 243: {'I am a tuple 243'}
+n:0 244: {'I am a tuple 244'}
+n:0 245: {'I am a tuple 245'}
+n:0 246: {'I am a tuple 246'}
+n:0 247: {'I am a tuple 247'}
+n:0 248: {'I am a tuple 248'}
+n:0 249: {'I am a tuple 249'}
+n:0 250: {'I am a tuple 250'}
+n:0 251: {'I am a tuple 251'}
+n:0 252: {'I am a tuple 252'}
+n:0 253: {'I am a tuple 253'}
+n:0 254: {'I am a tuple 254'}
+n:0 255: {'I am a tuple 255'}
+n:0 256: {'I am a tuple 256'}
+n:0 257: {'I am a tuple 257'}
+n:0 258: {'I am a tuple 258'}
+n:0 259: {'I am a tuple 259'}
+n:0 260: {'I am a tuple 260'}
+n:0 261: {'I am a tuple 261'}
+n:0 262: {'I am a tuple 262'}
+n:0 263: {'I am a tuple 263'}
+n:0 264: {'I am a tuple 264'}
+n:0 265: {'I am a tuple 265'}
+n:0 266: {'I am a tuple 266'}
+n:0 267: {'I am a tuple 267'}
+n:0 268: {'I am a tuple 268'}
+n:0 269: {'I am a tuple 269'}
+n:0 270: {'I am a tuple 270'}
+n:0 271: {'I am a tuple 271'}
+n:0 272: {'I am a tuple 272'}
+n:0 273: {'I am a tuple 273'}
+n:0 274: {'I am a tuple 274'}
+n:0 275: {'I am a tuple 275'}
+n:0 276: {'I am a tuple 276'}
+n:0 277: {'I am a tuple 277'}
+n:0 278: {'I am a tuple 278'}
+n:0 279: {'I am a tuple 279'}
+n:0 280: {'I am a tuple 280'}
+n:0 281: {'I am a tuple 281'}
+n:0 282: {'I am a tuple 282'}
+n:0 283: {'I am a tuple 283'}
+n:0 284: {'I am a tuple 284'}
+n:0 285: {'I am a tuple 285'}
+n:0 286: {'I am a tuple 286'}
+n:0 287: {'I am a tuple 287'}
+n:0 288: {'I am a tuple 288'}
+n:0 289: {'I am a tuple 289'}
+n:0 290: {'I am a tuple 290'}
+n:0 291: {'I am a tuple 291'}
+n:0 292: {'I am a tuple 292'}
+n:0 293: {'I am a tuple 293'}
+n:0 294: {'I am a tuple 294'}
+n:0 295: {'I am a tuple 295'}
+n:0 296: {'I am a tuple 296'}
+n:0 297: {'I am a tuple 297'}
+n:0 298: {'I am a tuple 298'}
+n:0 299: {'I am a tuple 299'}
+n:0 300: {'I am a tuple 300'}
+n:0 301: {'I am a tuple 301'}
+n:0 302: {'I am a tuple 302'}
+n:0 303: {'I am a tuple 303'}
+n:0 304: {'I am a tuple 304'}
+n:0 305: {'I am a tuple 305'}
+n:0 306: {'I am a tuple 306'}
+n:0 307: {'I am a tuple 307'}
+n:0 308: {'I am a tuple 308'}
+n:0 309: {'I am a tuple 309'}
+n:0 310: {'I am a tuple 310'}
+n:0 311: {'I am a tuple 311'}
+n:0 312: {'I am a tuple 312'}
+n:0 313: {'I am a tuple 313'}
+n:0 314: {'I am a tuple 314'}
+n:0 315: {'I am a tuple 315'}
+n:0 316: {'I am a tuple 316'}
+n:0 317: {'I am a tuple 317'}
+n:0 318: {'I am a tuple 318'}
+n:0 319: {'I am a tuple 319'}
+n:0 320: {'I am a tuple 320'}
+n:0 321: {'I am a tuple 321'}
+n:0 322: {'I am a tuple 322'}
+n:0 323: {'I am a tuple 323'}
+n:0 324: {'I am a tuple 324'}
+n:0 325: {'I am a tuple 325'}
+n:0 326: {'I am a tuple 326'}
+n:0 327: {'I am a tuple 327'}
+n:0 328: {'I am a tuple 328'}
+n:0 329: {'I am a tuple 329'}
+n:0 330: {'I am a tuple 330'}
+n:0 331: {'I am a tuple 331'}
+n:0 332: {'I am a tuple 332'}
+n:0 333: {'I am a tuple 333'}
+n:0 334: {'I am a tuple 334'}
+n:0 335: {'I am a tuple 335'}
+n:0 336: {'I am a tuple 336'}
+n:0 337: {'I am a tuple 337'}
+n:0 338: {'I am a tuple 338'}
+n:0 339: {'I am a tuple 339'}
+n:0 340: {'I am a tuple 340'}
+n:0 341: {'I am a tuple 341'}
+n:0 342: {'I am a tuple 342'}
+n:0 343: {'I am a tuple 343'}
+n:0 344: {'I am a tuple 344'}
+n:0 345: {'I am a tuple 345'}
+n:0 346: {'I am a tuple 346'}
+n:0 347: {'I am a tuple 347'}
+n:0 348: {'I am a tuple 348'}
+n:0 349: {'I am a tuple 349'}
+n:0 350: {'I am a tuple 350'}
+n:0 351: {'I am a tuple 351'}
+n:0 352: {'I am a tuple 352'}
+n:0 353: {'I am a tuple 353'}
+n:0 354: {'I am a tuple 354'}
+n:0 355: {'I am a tuple 355'}
+n:0 356: {'I am a tuple 356'}
+n:0 357: {'I am a tuple 357'}
+n:0 358: {'I am a tuple 358'}
+n:0 359: {'I am a tuple 359'}
+n:0 360: {'I am a tuple 360'}
+n:0 361: {'I am a tuple 361'}
+n:0 362: {'I am a tuple 362'}
+n:0 363: {'I am a tuple 363'}
+n:0 364: {'I am a tuple 364'}
+n:0 365: {'I am a tuple 365'}
+n:0 366: {'I am a tuple 366'}
+n:0 367: {'I am a tuple 367'}
+n:0 368: {'I am a tuple 368'}
+n:0 369: {'I am a tuple 369'}
+n:0 370: {'I am a tuple 370'}
+n:0 371: {'I am a tuple 371'}
+n:0 372: {'I am a tuple 372'}
+n:0 373: {'I am a tuple 373'}
+n:0 374: {'I am a tuple 374'}
+n:0 375: {'I am a tuple 375'}
+n:0 376: {'I am a tuple 376'}
+n:0 377: {'I am a tuple 377'}
+n:0 378: {'I am a tuple 378'}
+n:0 379: {'I am a tuple 379'}
+n:0 380: {'I am a tuple 380'}
+n:0 381: {'I am a tuple 381'}
+n:0 382: {'I am a tuple 382'}
+n:0 383: {'I am a tuple 383'}
+n:0 384: {'I am a tuple 384'}
+n:0 385: {'I am a tuple 385'}
+n:0 386: {'I am a tuple 386'}
+n:0 387: {'I am a tuple 387'}
+n:0 388: {'I am a tuple 388'}
+n:0 389: {'I am a tuple 389'}
+n:0 390: {'I am a tuple 390'}
+n:0 391: {'I am a tuple 391'}
+n:0 392: {'I am a tuple 392'}
+n:0 393: {'I am a tuple 393'}
+n:0 394: {'I am a tuple 394'}
+n:0 395: {'I am a tuple 395'}
+n:0 396: {'I am a tuple 396'}
+n:0 397: {'I am a tuple 397'}
+n:0 398: {'I am a tuple 398'}
+n:0 399: {'I am a tuple 399'}
+n:0 400: {'I am a tuple 400'}
+n:0 401: {'I am a tuple 401'}
+n:0 402: {'I am a tuple 402'}
+n:0 403: {'I am a tuple 403'}
+n:0 404: {'I am a tuple 404'}
+n:0 405: {'I am a tuple 405'}
+n:0 406: {'I am a tuple 406'}
+n:0 407: {'I am a tuple 407'}
+n:0 408: {'I am a tuple 408'}
+n:0 409: {'I am a tuple 409'}
+n:0 410: {'I am a tuple 410'}
+n:0 411: {'I am a tuple 411'}
+n:0 412: {'I am a tuple 412'}
+n:0 413: {'I am a tuple 413'}
+n:0 414: {'I am a tuple 414'}
+n:0 415: {'I am a tuple 415'}
+n:0 416: {'I am a tuple 416'}
+n:0 417: {'I am a tuple 417'}
+n:0 418: {'I am a tuple 418'}
+n:0 419: {'I am a tuple 419'}
+n:0 420: {'I am a tuple 420'}
+n:0 421: {'I am a tuple 421'}
+n:0 422: {'I am a tuple 422'}
+n:0 423: {'I am a tuple 423'}
+n:0 424: {'I am a tuple 424'}
+n:0 425: {'I am a tuple 425'}
+n:0 426: {'I am a tuple 426'}
+n:0 427: {'I am a tuple 427'}
+n:0 428: {'I am a tuple 428'}
+n:0 429: {'I am a tuple 429'}
+n:0 430: {'I am a tuple 430'}
+n:0 431: {'I am a tuple 431'}
+n:0 432: {'I am a tuple 432'}
+n:0 433: {'I am a tuple 433'}
+n:0 434: {'I am a tuple 434'}
+n:0 435: {'I am a tuple 435'}
+n:0 436: {'I am a tuple 436'}
+n:0 437: {'I am a tuple 437'}
+n:0 438: {'I am a tuple 438'}
+n:0 439: {'I am a tuple 439'}
+n:0 440: {'I am a tuple 440'}
+n:0 441: {'I am a tuple 441'}
+n:0 442: {'I am a tuple 442'}
+n:0 443: {'I am a tuple 443'}
+n:0 444: {'I am a tuple 444'}
+n:0 445: {'I am a tuple 445'}
+n:0 446: {'I am a tuple 446'}
+n:0 447: {'I am a tuple 447'}
+n:0 448: {'I am a tuple 448'}
+n:0 449: {'I am a tuple 449'}
+n:0 450: {'I am a tuple 450'}
+n:0 451: {'I am a tuple 451'}
+n:0 452: {'I am a tuple 452'}
+n:0 453: {'I am a tuple 453'}
+n:0 454: {'I am a tuple 454'}
+n:0 455: {'I am a tuple 455'}
+n:0 456: {'I am a tuple 456'}
+n:0 457: {'I am a tuple 457'}
+n:0 458: {'I am a tuple 458'}
+n:0 459: {'I am a tuple 459'}
+n:0 460: {'I am a tuple 460'}
+n:0 461: {'I am a tuple 461'}
+n:0 462: {'I am a tuple 462'}
+n:0 463: {'I am a tuple 463'}
+n:0 464: {'I am a tuple 464'}
+n:0 465: {'I am a tuple 465'}
+n:0 466: {'I am a tuple 466'}
+n:0 467: {'I am a tuple 467'}
+n:0 468: {'I am a tuple 468'}
+n:0 469: {'I am a tuple 469'}
+n:0 470: {'I am a tuple 470'}
+n:0 471: {'I am a tuple 471'}
+n:0 472: {'I am a tuple 472'}
+n:0 473: {'I am a tuple 473'}
+n:0 474: {'I am a tuple 474'}
+n:0 475: {'I am a tuple 475'}
+n:0 476: {'I am a tuple 476'}
+n:0 477: {'I am a tuple 477'}
+n:0 478: {'I am a tuple 478'}
+n:0 479: {'I am a tuple 479'}
+n:0 480: {'I am a tuple 480'}
+n:0 481: {'I am a tuple 481'}
+n:0 482: {'I am a tuple 482'}
+n:0 483: {'I am a tuple 483'}
+n:0 484: {'I am a tuple 484'}
+n:0 485: {'I am a tuple 485'}
+n:0 486: {'I am a tuple 486'}
+n:0 487: {'I am a tuple 487'}
+n:0 488: {'I am a tuple 488'}
+n:0 489: {'I am a tuple 489'}
+n:0 490: {'I am a tuple 490'}
+n:0 491: {'I am a tuple 491'}
+n:0 492: {'I am a tuple 492'}
+n:0 493: {'I am a tuple 493'}
+n:0 494: {'I am a tuple 494'}
+n:0 495: {'I am a tuple 495'}
+n:0 496: {'I am a tuple 496'}
+n:0 497: {'I am a tuple 497'}
+n:0 498: {'I am a tuple 498'}
+n:0 499: {'I am a tuple 499'}
+
diff --git a/test/box/cat.test b/test/box/cat.test
new file mode 100644
index 0000000000..789827230d
--- /dev/null
+++ b/test/box/cat.test
@@ -0,0 +1,24 @@
+# encoding: tarantool
+#
+# Created to test for [Bug 920951]: server crashes on cat command
+#
+import os
+import time
+import yaml
+from signal import SIGUSR1
+
+print """
+# Verify that the server starts from a pre-recorded snapshot.
+# This way we check that the server can read old snapshots (v11)
+# going forward.
+"""
+server.stop()
+snapshot = os.path.join(vardir, "00000000000000000500.snap")
+os.symlink(os.path.abspath("box/00000000000000000500.snap"), snapshot)
+server.test_option("--cat=00000000000000000500.snap")
+# server.start()
+
+# print "# Restore the default server..."
+# server.stop()
+os.unlink(snapshot)
+
-- 
GitLab