OceanBase 数据库日志中常见 EAGAIN 重试的信息,比如以下报错中,因为数据导入时内存不足、转储异常而超过了 EAGAIN 重试的次数。
[2022-05-20 15:09:29.531874] ERROR [STORAGE.REPLAY] check_eagain_too_many_ (ob_replay_status.cpp:577) [104404][0][Y0-0000000000000000-0-0] [lt=128] [dc=0] retry submit on EAGAIN too many times(eagain_count_=5982308, eagain_start_ts_=1653029112858384, last_task_info_={log_id_:18446744073709551615, log_type_:0}, result={ret_code_:-4023, is_out_of_memstore_mem_:true, has_barrier_:false, is_pre_barrier_:false, need_wait_schema_refresh_:false, pkey_:{tid:1142392581401953, partition_id:0, part_cnt:0}, task_info_:{log_id_:1, log_type_:328}}) BACKTRACE:0xc0e1e37 0x3ca1d72 0x3cd2cb5 0x3cfc6a4 0x7eb5934 0x7eb5ab7 0x7eb5be2 0x7eb6808 0x8118e81 0x8119b46 0x3bf7598 0x42ab298 0xbf7cd04 0xbf7c8b2 0xbf73a8f
EAGAIN 是 Linux 系统中非阻断操作的重试机制,本文对 EAGAIN 进行简单的介绍。
EAGAIN
在Linux环境下开发经常会碰到很多错误(设置 errno),其中 EAGAIN 是其中比较常见的一个错误(比如用在非阻塞操作中)。从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或 socket)的时候。
例如,以
O_NONBLOCK的标志打开file/socket/FIFO,如果你连续做 read 操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返回,read 函数会返回一个错误 EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。又例如,当一个系统调用(比如 fork),因为没有足够的资源(比如虚拟内存)而执行失败,返回 EAGAIN,提示其再调用一次(也许下次就能成功)。
适用版本
OceanBase 数据库所有版本。