Re: [Dovecot] dsync crash
On Wed, 2010-09-15 at 18:34 +0400, Василий Шоков wrote:
namespace { hidden = no inbox = yes location = maildir:~/mail/inbox/:INDEX=/var/dovecot_index/%u/inbox prefix = .INBOX.
Uh. Does this really work with IMAP clients? A namespace prefix must not start with hierarchy separator. My guess is that the crash happens because of it. I think I'll add code to give an error if it's tried.
namespace { hidden = no inbox = yes location = maildir:~/mail/inbox/:INDEX=/var/dovecot_index/%u/inbox prefix = .INBOX.
Uh. Does this really work with IMAP clients? A namespace prefix must not start with hierarchy separator. My guess is that the crash happens because of it. I think I'll add code to give an error if it's tried.
I removed hierarchy separator from start of namespace prefix (now it looks like "INBOX.") and moved folders.
Still same result.
Also, after upgrade from dovecot 1.1 to 2.0 (and after to 2.0.2) all of our Outlooks (we use Outlook as IMAP clients) works extermely slow.
Kind regards,
Vasiliy Shokov
On Thu, 2010-09-16 at 14:48 +0400, Vasiliy Shokov wrote:
I removed hierarchy separator from start of namespace prefix (now it looks like "INBOX.") and moved folders.
Still same result.
Could you check with gdb what the invalid name is?
dsync(v.shokov): Panic: file mailbox-list-fs.c: line 150 (fs_list_get_path): assertion failed: (mailbox_list_is_valid_pattern(_list, name))
So probably something like:
ulimit -c unlimited dsync ... gdb dsync core bt full fr 6 p name
(If it doesn't print the name, try a different number to "fr", it's the mailbox_list_is_valid_pattern frame in the bt.)
Could you check with gdb what the invalid name is?
dsync(v.shokov): Panic: file mailbox-list-fs.c: line 150 (fs_list_get_path): assertion failed: (mailbox_list_is_valid_pattern(_list, name))
So probably something like:
ulimit -c unlimited dsync ... gdb dsync core bt full
warning: Can't read pathname for load map: Input/output error. Reading symbols from /usr/lib/dovecot/libdovecot-storage.so.0...(no debugging symbols found)...done. Loaded symbols for /usr/lib/dovecot/libdovecot-storage.so.0 Reading symbols from /usr/lib/dovecot/libdovecot.so.0...(no debugging symbols found)...done. Loaded symbols for /usr/lib/dovecot/libdovecot.so.0 Reading symbols from /lib/libdl.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/libdl.so.2 Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done. Loaded symbols for /lib/librt.so.1 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2... (no debugging symbols found)...done. Loaded symbols for /lib/ld-linux.so.2 Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done. Loaded symbols for /lib/libpthread.so.0 Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found)...done. Loaded symbols for /lib/libgcc_s.so.1 (no debugging symbols found) Core was generated by `dsync -Dv -u v.shokov mirror sdbox:/dsync/v.shokov'. Program terminated with signal 6, Aborted. #0 0x00126402 in __kernel_vsyscall () (gdb) bt all No symbol table is loaded. Use the "file" command. (gdb) bt full #0 0x00126402 in __kernel_vsyscall () No symbol table info available. #1 0x002fbfc0 in raise () from /lib/libc.so.6 No symbol table info available. #2 0x002fd8d1 in abort () from /lib/libc.so.6 No symbol table info available. #3 0x00224aff in ?? () from /usr/lib/dovecot/libdovecot.so.0 No symbol table info available. #4 0x00224be5 in default_fatal_handler () from /usr/lib/dovecot/libdovecot.so.0 No symbol table info available. #5 0x00224178 in i_panic () from /usr/lib/dovecot/libdovecot.so.0 No symbol table info available. #6 0x00181876 in ?? () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #7 0x0014d9bd in mailbox_list_get_path () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #8 0x00182734 in ?? () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #9 0x00182272 in fs_list_iter_next () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #10 0x0014da42 in mailbox_list_iter_next () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #11 0x0014ec7f in ?? () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #12 0x0014da42 in mailbox_list_iter_next () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. #13 0x080580a6 in ?? () No symbol table info available. #14 0x0804ed08 in ?? () No symbol table info available. #15 0x0804e067 in dsync_brain_sync () No symbol table info available. #16 0x0804ef29 in ?? () No symbol table info available. #17 0x0804e016 in dsync_brain_sync () No symbol table info available. #18 0x0804ec08 in dsync_brain_sync_all () No symbol table info available. #19 0x0804d06b in main () No symbol table info available.
fr 6 p name (If it doesn't print the name, try a different number to "fr", it's the mailbox_list_is_valid_pattern frame in the bt.)
I didn't see this pattern in dump. Sorry, I'm not good in C/C++.
Kind regards,
Vasiliy Shokov
On Thu, 2010-09-16 at 21:40 +0400, Vasiliy Shokov wrote:
#7 0x0014d9bd in mailbox_list_get_path () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. ..
(If it doesn't print the name, try a different number to "fr", it's the mailbox_list_is_valid_pattern frame in the bt.)
I didn't see this pattern in dump. Sorry, I'm not good in C/C++.
Yeah, the problem is that the binaries are stripped out of debug symbols. Can you compile non-stripped ones? (It's the default, so how are you compiling Dovecot anyway?)
(If it doesn't print the name, try a different number to "fr", it's
#7 0x0014d9bd in mailbox_list_get_path () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. .. the
mailbox_list_is_valid_pattern frame in the bt.)
I didn't see this pattern in dump. Sorry, I'm not good in C/C++.
Yeah, the problem is that the binaries are stripped out of debug symbols. Can you compile non-stripped ones? (It's the default, so how are you compiling Dovecot anyway?)
I will try to do it at weekend. I compile it from src.rpm.
Kind regards,
Vasiliy Shokov
(If it doesn't print the name, try a different number to "fr", it's
#7 0x0014d9bd in mailbox_list_get_path () from /usr/lib/dovecot/libdovecot-storage.so.0 No symbol table info available. .. the
mailbox_list_is_valid_pattern frame in the bt.)
I didn't see this pattern in dump. Sorry, I'm not good in C/C++.
Yeah, the problem is that the binaries are stripped out of debug symbols. Can you compile non-stripped ones? (It's the default, so how are you compiling Dovecot anyway?)
So, I get information. Sorry for long message.
bt full
#0 0x00126402 in __kernel_vsyscall () No symbol table info available. #1 0x002fbfc0 in raise () from /lib/libc.so.6 No symbol table info available. #2 0x002fd8d1 in abort () from /lib/libc.so.6 No symbol table info available. #3 0x00224aff in default_fatal_finish (type=<value optimized out>, status=0) at failures.c:164 backtrace = 0x96b21d8 "/usr/lib/dovecot/libdovecot.so.0 [0x224af0] -> /usr/lib/dovecot/libdovecot.so.0(default_fatal_handler+0x45) [0x224be5] -> /usr/lib/dovecot/libdovecot.so.0 [0x224178] -> /usr/lib/dovecot/libdovecot-sto"... #4 0x00224be5 in default_fatal_handler (type=LOG_TYPE_PANIC, status=0, format=0x1c9948 "file %s: line %d (%s): assertion failed: (%s)", args=0xbf8b0534 "\224'\035") at failures.c:176 No locals. #5 0x00224178 in i_panic (format=0x1c9948 "file %s: line %d (%s): assertion failed: (%s)") at failures.c:230 args = 0xbf8b0534 "\224'\035" #6 0x00181876 in fs_list_get_path (_list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list-fs.c:150 set = (const struct mailbox_list_settings *) 0x96d4764 root_dir = <value optimized out> __FUNCTION__ = "fs_list_get_path" #7 0x0014d9bd in mailbox_list_get_path (list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list.c:696 No locals. #8 0x00182734 in fs_list_subs (ctx=0x97119a8) at mailbox-list-fs-iter.c:683 node = <value optimized out> flags = MAILBOX_SUBSCRIBED ns = (struct mail_namespace *) 0x96cc6e0 path = <value optimized out> dir = <value optimized out> fname = <value optimized out> storage_name = 0x96b21a0 "/INBOX" st = {st_dev = 10736181289418848, __pad1 = 1544, __st_ino = 158015880, st_mode = 3213559416, st_nlink = 2351838, st_uid = 3213559304, st_gid = 3213559448, st_rdev = 9610569145384976, __pad2 = 0, st_size = -4644611340797739008, st_blksize = 2499712, st_blocks = 73014444049, st_atim = { tv_sec = 0, tv_nsec = 0}, st_mtim = {tv_sec = 0, tv_nsec = 0}, st_ctim = {tv_sec = -1081407944, tv_nsec = 2237248}, st_ino = 0} #9 0x00182272 in fs_list_iter_next (_ctx=0x97119a8) at mailbox-list-fs-iter.c:356 _data_stack_cur_id = 2 info = (const struct mailbox_info *) 0x0 __FUNCTION__ = "fs_list_iter_next" #10 0x0014da42 in mailbox_list_iter_next (ctx=0x97119a8) at mailbox-list.c:1029 info = <value optimized out> #11 0x0014ec7f in mailbox_list_ns_iter_next (_ctx=0x9706210) at mailbox-list.c:926 info = (const struct mailbox_info *) 0x0 #12 0x0014da42 in mailbox_list_iter_next (ctx=0x9706210) at mailbox-list.c:1029 info = <value optimized out> #13 0x080580a6 in local_worker_subs_iter_next (_iter=0x970d518, rec_r=0xbf8b0734) at dsync-worker-local.c:672 worker = <value optimized out> change_lookup = {name_sha1 = {guid = {62 '>', 22 '\026', 223 '▒', 168 '▒', 228 '▒', 61 '=', 188 '▒', 248 '▒', 128 '\200', 36 '$', 38 '&', 0 '\0', 52 '4', 7 '\a', 139 '\213', 191 '▒'}}, list = 0x0, last_rename = -1081407720, last_delete = 2233906, last_subs_change = 158378704, unsubscribed = 0, ---Type <return> to continue, or q <return> to quit--- deleted_dir = 0} info = <value optimized out> subs_ns = <value optimized out> storage_name = <value optimized out> #14 0x0804ed08 in dsync_worker_subs_input (context=0x970aab0) at dsync-brain.c:199 subs = {vname = 0x0, storage_name = 0x0, ns_prefix = 0x0, last_change = 0} unsubs = {name_sha1 = {guid = {192 '▒', 181 '▒', 176 '▒', 80 'P', 77 'M', 163 '▒', 226 '▒', 109 'm', 7 '\a', 203 '▒', 251 '▒', 123 '{', 197 '▒', 215 '▒', 226 '▒', 214 '▒'}}, ns_prefix = 0x96e3b98 "", last_change = 1284621231} ret = <value optimized out> #15 0x0804e067 in dsync_brain_sync (brain=0x96cc760) at dsync-brain.c:832 __FUNCTION__ = "dsync_brain_sync" #16 0x0804ef29 in dsync_worker_mailbox_input (context=0x96e5ee0) at dsync-brain.c:99 dsync_box = {name = 0x0, name_sep = 0 '\0', name_sha1 = {guid = {0 '\0' <repeats 16 times>}}, mailbox_guid = {guid = {0 '\0' <repeats 16 times>}}, uid_validity = 0, uid_next = 0, message_count = 0, highest_modseq = 0, last_change = 0, flags = 0, cache_fields = {arr = {buffer = 0x0, element_size = 0}, v = 0x0, v_modifiable = 0x0}} dup_box = (struct dsync_mailbox *) 0x96ff348 ret = <value optimized out> #17 0x0804e016 in dsync_brain_sync (brain=0x96cc760) at dsync-brain.c:823 __FUNCTION__ = "dsync_brain_sync" #18 0x0804ec08 in dsync_brain_sync_all (brain=0x96cc760) at dsync-brain.c:887 __FUNCTION__ = "dsync_brain_sync_all" #19 0x0804d06b in main (argc=Cannot access memory at address 0x5f ) at dsync.c:292 set_parser = <value optimized out> ssflags = 134 brain_flags = 10 storage_service = (struct mail_storage_service_ctx *) 0x96ba310 service_user = (struct mail_storage_service_user *) 0x96babd0 input = {module = 0x805a371 "mail", service = 0x8058dc3 "dsync", username = 0x96b91e9 "v.shokov", local_ip = {family = 0, u = {ip6 = {in6_u = { u6_addr8 = {0 '\0' <repeats 16 times>}, u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, u6_addr32 = {0, 0, 0, 0}}}, ip4 = {s_addr = 0}}}, remote_ip = { family = 0, u = {ip6 = {in6_u = {u6_addr8 = {0 '\0' <repeats 16 times>}, u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, u6_addr32 = {0, 0, 0, 0}}}, ip4 = { s_addr = 0}}}, userdb_fields = 0x0} mail_user = (struct mail_user *) 0x96d06f0 mail_user2 = (struct mail_user *) 0x96d7c98 worker1 = (struct dsync_worker *) 0x96d4f00 worker2 = (struct dsync_worker *) 0x96dcab8 workertmp = <value optimized out> error = <value optimized out> username = 0x96b91e9 "v.shokov" cmd_name = 0x96b91f2 "mirror" mailbox = 0x0 local_location = 0x96b91f9 "sdbox:/dsync/v.shokov" remote_cmd_args = (const char * const *) 0x0 dsync_server = false unexpected_changes = <value optimized out> dsync_debug = true ---Type <return> to continue, or q <return> to quit--- reverse_workers = false alt_char = 95 '_' c = <value optimized out> ret = <value optimized out> fd_in = <value optimized out> fd_out = <value optimized out> __FUNCTION__ = "main" (gdb) (gdb) fr 6 #6 0x00181876 in fs_list_get_path (_list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list-fs.c:150 150 i_assert(mailbox_list_is_valid_pattern(_list, name)); (gdb) fr 7 #7 0x0014d9bd in mailbox_list_get_path (list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list.c:696 696 return list->v.get_path(list, name, type); (gdb) fr 6 #6 0x00181876 in fs_list_get_path (_list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list-fs.c:150 150 i_assert(mailbox_list_is_valid_pattern(_list, name)); (gdb) p name $1 = 0x96b21a0 "/INBOX" (gdb) bt full #0 0x00126402 in __kernel_vsyscall () No symbol table info available. #1 0x002fbfc0 in raise () from /lib/libc.so.6 No symbol table info available. #2 0x002fd8d1 in abort () from /lib/libc.so.6 No symbol table info available. #3 0x00224aff in default_fatal_finish (type=<value optimized out>, status=0) at failures.c:164 backtrace = 0x96b21d8 "/usr/lib/dovecot/libdovecot.so.0 [0x224af0] -> /usr/lib/dovecot/libdovecot.so.0(default_fatal_handler+0x45) [0x224be5] -> /usr/lib/dovecot/libdovecot.so.0 [0x224178] -> /usr/lib/dovecot/libdovecot-sto"... #4 0x00224be5 in default_fatal_handler (type=LOG_TYPE_PANIC, status=0, format=0x1c9948 "file %s: line %d (%s): assertion failed: (%s)", args=0xbf8b0534 "\224'\035") at failures.c:176 No locals. #5 0x00224178 in i_panic (format=0x1c9948 "file %s: line %d (%s): assertion failed: (%s)") at failures.c:230 args = 0xbf8b0534 "\224'\035" #6 0x00181876 in fs_list_get_path (_list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list-fs.c:150 set = (const struct mailbox_list_settings *) 0x96d4764 root_dir = <value optimized out> __FUNCTION__ = "fs_list_get_path" #7 0x0014d9bd in mailbox_list_get_path (list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list.c:696 No locals. #8 0x00182734 in fs_list_subs (ctx=0x97119a8) at mailbox-list-fs-iter.c:683 node = <value optimized out> flags = MAILBOX_SUBSCRIBED ns = (struct mail_namespace *) 0x96cc6e0 path = <value optimized out> dir = <value optimized out> fname = <value optimized out> storage_name = 0x96b21a0 "/INBOX" st = {st_dev = 10736181289418848, __pad1 = 1544, __st_ino = 158015880, st_mode = 3213559416, st_nlink = 2351838, st_uid = 3213559304, st_gid = 3213559448, st_rdev = 9610569145384976, __pad2 = 0, st_size = -4644611340797739008, st_blksize = 2499712, st_blocks = 73014444049, st_atim = { tv_sec = 0, tv_nsec = 0}, st_mtim = {tv_sec = 0, tv_nsec = 0}, st_ctim = {tv_sec = -1081407944, tv_nsec = 2237248}, st_ino = 0} #9 0x00182272 in fs_list_iter_next (_ctx=0x97119a8) at mailbox-list-fs-iter.c:356 _data_stack_cur_id = 2 info = (const struct mailbox_info *) 0x0 __FUNCTION__ = "fs_list_iter_next" #10 0x0014da42 in mailbox_list_iter_next (ctx=0x97119a8) at mailbox-list.c:1029 info = <value optimized out> #11 0x0014ec7f in mailbox_list_ns_iter_next (_ctx=0x9706210) at mailbox-list.c:926 info = (const struct mailbox_info *) 0x0 #12 0x0014da42 in mailbox_list_iter_next (ctx=0x9706210) at mailbox-list.c:1029 info = <value optimized out> #13 0x080580a6 in local_worker_subs_iter_next (_iter=0x970d518, rec_r=0xbf8b0734) at dsync-worker-local.c:672 worker = <value optimized out> change_lookup = {name_sha1 = {guid = {62 '>', 22 '\026', 223 '▒', 168 '▒', 228 '▒', 61 '=', 188 '▒', 248 '▒', 128 '\200', 36 '$', 38 '&', 0 '\0', 52 '4', 7 '\a', 139 '\213', 191 '▒'}}, list = 0x0, last_rename = -1081407720, last_delete = 2233906, last_subs_change = 158378704, unsubscribed = 0, info = <value optimized out> subs_ns = <value optimized out> storage_name = <value optimized out> #14 0x0804ed08 in dsync_worker_subs_input (context=0x970aab0) at dsync-brain.c:199 subs = {vname = 0x0, storage_name = 0x0, ns_prefix = 0x0, last_change = 0} unsubs = {name_sha1 = {guid = {192 '▒', 181 '▒', 176 '▒', 80 'P', 77 'M', 163 '▒', 226 '▒', 109 'm', 7 '\a', 203 '▒', 251 '▒', 123 '{', 197 '▒', 215 '▒', 226 '▒', 214 '▒'}}, ns_prefix = 0x96e3b98 "", last_change = 1284621231} ret = <value optimized out> #15 0x0804e067 in dsync_brain_sync (brain=0x96cc760) at dsync-brain.c:832 __FUNCTION__ = "dsync_brain_sync" #16 0x0804ef29 in dsync_worker_mailbox_input (context=0x96e5ee0) at dsync-brain.c:99 dsync_box = {name = 0x0, name_sep = 0 '\0', name_sha1 = {guid = {0 '\0' <repeats 16 times>}}, mailbox_guid = {guid = {0 '\0' <repeats 16 times>}}, uid_validity = 0, uid_next = 0, message_count = 0, highest_modseq = 0, last_change = 0, flags = 0, cache_fields = {arr = {buffer = 0x0, element_size = 0}, v = 0x0, v_modifiable = 0x0}} dup_box = (struct dsync_mailbox *) 0x96ff348 ret = <value optimized out> #17 0x0804e016 in dsync_brain_sync (brain=0x96cc760) at dsync-brain.c:823 __FUNCTION__ = "dsync_brain_sync" #18 0x0804ec08 in dsync_brain_sync_all (brain=0x96cc760) at dsync-brain.c:887 __FUNCTION__ = "dsync_brain_sync_all" #19 0x0804d06b in main (argc=Cannot access memory at address 0x5f ) at dsync.c:292 set_parser = <value optimized out> ssflags = 134 brain_flags = 10 storage_service = (struct mail_storage_service_ctx *) 0x96ba310 service_user = (struct mail_storage_service_user *) 0x96babd0 input = {module = 0x805a371 "mail", service = 0x8058dc3 "dsync", username = 0x96b91e9 "v.shokov", local_ip = {family = 0, u = {ip6 = {in6_u = { u6_addr8 = {0 '\0' <repeats 16 times>}, u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, u6_addr32 = {0, 0, 0, 0}}}, ip4 = {s_addr = 0}}}, remote_ip = { family = 0, u = {ip6 = {in6_u = {u6_addr8 = {0 '\0' <repeats 16 times>}, u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, u6_addr32 = {0, 0, 0, 0}}}, ip4 = { s_addr = 0}}}, userdb_fields = 0x0} mail_user = (struct mail_user *) 0x96d06f0 mail_user2 = (struct mail_user *) 0x96d7c98 worker1 = (struct dsync_worker *) 0x96d4f00 worker2 = (struct dsync_worker *) 0x96dcab8 workertmp = <value optimized out> error = <value optimized out> username = 0x96b91e9 "v.shokov" cmd_name = 0x96b91f2 "mirror" mailbox = 0x0 local_location = 0x96b91f9 "sdbox:/dsync/v.shokov" remote_cmd_args = (const char * const *) 0x0 dsync_server = false unexpected_changes = <value optimized out> dsync_debug = true reverse_workers = false alt_char = 95 '_' c = <value optimized out> ret = <value optimized out> fd_in = <value optimized out> fd_out = <value optimized out> __FUNCTION__ = "main"
fr 6
#6 0x00181876 in fs_list_get_path (_list=0x96d46f8, name=0x96b21a0 "/INBOX", type=MAILBOX_LIST_PATH_TYPE_DIR) at mailbox-list-fs.c:150 150 i_assert(mailbox_list_is_valid_pattern(_list, name));
p name
$1 = 0x96b21a0 "/INBOX"
Kind regards,
Vasiliy Shokov
On 16.9.2010, at 20.54, Vasiliy Shokov wrote:
$1 = 0x96b21a0 "/INBOX"
What do you have in subscriptions files? I guess in dbox's side there's "/INBOX" which was added while you still had the ".INBOX." namespace prefix and that causes it to still crash?
On Thu, 2010-09-16 at 21:04 +0100, Timo Sirainen wrote:
On 16.9.2010, at 20.54, Vasiliy Shokov wrote:
$1 = 0x96b21a0 "/INBOX"
What do you have in subscriptions files? I guess in dbox's side there's "/INBOX" which was added while you still had the ".INBOX." namespace prefix and that causes it to still crash?
http://hg.dovecot.org/dovecot-2.0/rev/f7bd4059c6af should fix it, but you should get rid of that subscription.
participants (2)
-
Timo Sirainen
-
Vasiliy Shokov