BUG #6184: Inconsistencies in log messages - Mailing list pgsql-bugs
From | Ding Yuan |
---|---|
Subject | BUG #6184: Inconsistencies in log messages |
Date | |
Msg-id | 201108300715.p7U7FJDQ062871@wwwmaster.postgresql.org Whole thread Raw |
List | pgsql-bugs |
The following bug has been logged online: Bug reference: 6184 Logged by: Ding Yuan Email address: ding.yuan.90@hotmail.com PostgreSQL version: 8.4.8 Operating system: All Description: Inconsistencies in log messages Details: Hi Postgres developers, (I reported this a day ago and for some reason did not see my message appear in the archive, so I am resending it again and I apologize if it seems duplicated). I am a student doing research on improving software's diagnosability by improving the error messages. Recently I run a static checker on postgres-8.4.8 and found that some inconsistencies in log messages in similar situations. While we suspect some of them should be fixed, we are not 100% sure since we do not have domain expertise in Squid code. I am reporting 10 such cases in this report. We truly appreciate your feedback on whether our findings make sense. Thanks, Ding ================== Report 1 ======================== The two elog messages are of similar situations but with different verbosity levels. Pattern: 7478 ---------------- src/backend/executor/nodeResult.c --------------------- @@ line: 171 @@ 171: void 172: ExecResultMarkPos(ResultState *node) 173: { 174: PlanState *outerPlan = outerPlanState(node); 175: 176: if (outerPlan != NULL) 177: ExecMarkPos(outerPlan); 178: else 179: elog(DEBUG2, "Result nodes do not support mark/restore"); ---------------- src/backend/executor/nodeResult.c --------------------- @@ line: 186 @@ 186: void 187: ExecResultRestrPos(ResultState *node) 188: { 189: PlanState *outerPlan = outerPlanState(node); 190: 191: if (outerPlan != NULL) 192: ExecRestrPos(outerPlan); 193: else 194: elog(ERROR, "Result nodes do not support mark/restore"); ======================== Report 2 ========================================== The verbosity level for error return for CreateEvent is not consistent! Pattern: 6490 ---------------- src/backend/port/win32/socket.c --------------------- @@ line: 128 @@ 128: waitevent = CreateEvent(NULL, TRUE, FALSE, NULL); 129: 130: if (waitevent == INVALID_HANDLE_VALUE) 131: ereport(ERROR, 132: (errmsg_internal("Failed to create socket waiting event: %i", (int) GetLastError()))); ---------------- src/backend/port/win32/signal.c --------------------- @@ line: 83 @@ 83: pgwin32_signal_event = CreateEvent(NULL, TRUE, FALSE, NULL); 84: if (pgwin32_signal_event == NULL) 85: ereport(FATAL, 86: (errmsg_internal("failed to create signal event: %d", (int) GetLastError()))); ======================== Report 3 ========================================== The log message in the first snippet (line 3487) has ERROR level, while PANIC is logged in other similar situations. Pattern: 4207 ---------------- src/backend/access/heap/heapam.c --------------------- @@ line: 3483 @@ 3483: if (PageGetMaxOffsetNumber(page) >= offnum) 3484: lp = PageGetItemId(page, offnum); 3485: 3486: if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp)) 3487: elog(ERROR, "heap_inplace_update: invalid lp"); 3488: 3489: htup = (HeapTupleHeader) PageGetItem(page, lp); 3490: 3491: oldlen = ItemIdGetLength(lp) - htup->t_hoff; ---------------- src/backend/access/heap/heapam.c --------------------- @@ line: 4732 @@ 4732: if (PageGetMaxOffsetNumber(page) >= offnum) 4733: lp = PageGetItemId(page, offnum); 4734: 4735: if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp)) 4736: elog(PANIC, "heap_inplace_redo: invalid lp"); 4737: 4738: htup = (HeapTupleHeader) PageGetItem(page, lp); 4739: 4740: oldlen = ItemIdGetLength(lp) - htup->t_hoff; ---------------- src/backend/access/heap/heapam.c --------------------- @@ line: 4268 @@ 4268: if (PageGetMaxOffsetNumber(page) >= offnum) 4269: lp = PageGetItemId(page, offnum); 4270: 4271: if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp)) 4272: elog(PANIC, "heap_delete_redo: invalid lp"); 4273: 4274: htup = (HeapTupleHeader) PageGetItem(page, lp); ---------------- src/backend/access/heap/heapam.c --------------------- @@ line: 4469 @@ 4469: if (PageGetMaxOffsetNumber(page) >= offnum) 4470: lp = PageGetItemId(page, offnum); 4471: 4472: if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp)) 4473: elog(PANIC, "heap_update_redo: invalid lp"); 4474: 4475: htup = (HeapTupleHeader) PageGetItem(page, lp); ---------------- src/backend/access/heap/heapam.c --------------------- @@ line: 4673 @@ 4673: if (PageGetMaxOffsetNumber(page) >= offnum) 4674: lp = PageGetItemId(page, offnum); 4675: 4676: if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp)) 4677: elog(PANIC, "heap_lock_redo: invalid lp"); 4678: 4679: htup = (HeapTupleHeader) PageGetItem(page, lp); ======================== Report 4 ========================================== There is no error message in the 2nd snippet, when: 3089: if (!SplitIdentifierString(rawname, ',', &namelist)) occurred, while there is one at line 62 under similar situations. Pattern: 4440 ---------------- src/backend/commands/variable.c --------------------- @@ line: 46 @@ 46: char *rawstring; 47: char *result; 48: List *elemlist; 49: ListCell *l; 50: 51: /* Need a modifiable copy of string */ 52: rawstring = pstrdup(value); 53: 54: /* Parse string into list of identifiers */ 55: if (!SplitIdentifierString(rawstring, ',', &elemlist)) 56: { 57: /* syntax error in list */ 58: pfree(rawstring); 59: list_free(elemlist); 60: ereport(GUC_complaint_elevel(source), 61: (errcode(ERRCODE_INVALID_PARAMETER_VALUE), 62: errmsg("invalid list syntax for parameter \"datestyle\""))); 63: return NULL; 64: } 65: 66: foreach(l, elemlist) ---------------- src/backend/catalog/namespace.c --------------------- @@ line: 3081 @@ 3081: char *rawname; 3082: List *namelist; 3083: ListCell *l; 3084: 3085: /* Need a modifiable copy of string */ 3086: rawname = pstrdup(newval); 3087: 3088: /* Parse string into list of identifiers */ 3089: if (!SplitIdentifierString(rawname, ',', &namelist)) 3090: { 3091: /* syntax error in name list */ 3092: pfree(rawname); 3093: list_free(namelist); 3094: return NULL; 3095: } 3096: 3097: /* 3098: * If we aren't inside a transaction, we cannot do database access so 3099: * cannot verify the individual names. Must accept the list on faith. 3100: */ 3101: if (source >= PGC_S_INTERACTIVE && IsTransactionState()) 3102: { 3103: /* 3104: * Verify that all the names are either valid namespace names or 3105: * "$user" or "pg_temp". We do not require $user to correspond to a 3106: * valid namespace, and pg_temp might not exist yet. We do not check 3107: * for USAGE rights, either; should we? 3108: * 3109: * When source == PGC_S_TEST, we are checking the argument of an ALTER 3110: * DATABASE SET or ALTER USER SET command. It could be that the 3111: * intended use of the search path is for some other database, so we 3112: * should not error out if it mentions schemas not present in the 3113: * current database. We reduce the message to NOTICE instead. 3114: */ 3115: foreach(l, namelist) ======================== Report 5 ========================================== The first log message at line 2221 is of ERROR level, while the other log messages in similar situations are FATAL! Pattern: 3948 ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 2210 @@ 2210: case TBLOCK_BEGIN: 2211: case TBLOCK_SUBBEGIN: 2212: case TBLOCK_END: 2213: case TBLOCK_SUBEND: 2214: case TBLOCK_ABORT_END: 2215: case TBLOCK_SUBABORT_END: 2216: case TBLOCK_ABORT_PENDING: 2217: case TBLOCK_SUBABORT_PENDING: 2218: case TBLOCK_SUBRESTART: 2219: case TBLOCK_SUBABORT_RESTART: 2220: case TBLOCK_PREPARE: 2221: elog(ERROR, "StartTransactionCommand: unexpected state %s", 2222: BlockStateAsString(s->blockState)); 2223: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 2890 @@ 2890: case TBLOCK_BEGIN: 2891: case TBLOCK_SUBBEGIN: 2892: case TBLOCK_END: 2893: case TBLOCK_SUBEND: 2894: case TBLOCK_ABORT_END: 2895: case TBLOCK_SUBABORT_END: 2896: case TBLOCK_ABORT_PENDING: 2897: case TBLOCK_SUBABORT_PENDING: 2898: case TBLOCK_SUBRESTART: 2899: case TBLOCK_SUBABORT_RESTART: 2900: case TBLOCK_PREPARE: 2901: elog(FATAL, "BeginTransactionBlock: unexpected state %s", 2902: BlockStateAsString(s->blockState)); 2903: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3058 @@ 3058: case TBLOCK_BEGIN: 3059: case TBLOCK_SUBBEGIN: 3060: case TBLOCK_END: 3061: case TBLOCK_SUBEND: 3062: case TBLOCK_ABORT_END: 3063: case TBLOCK_SUBABORT_END: 3064: case TBLOCK_ABORT_PENDING: 3065: case TBLOCK_SUBABORT_PENDING: 3066: case TBLOCK_SUBRESTART: 3067: case TBLOCK_SUBABORT_RESTART: 3068: case TBLOCK_PREPARE: 3069: elog(FATAL, "EndTransactionBlock: unexpected state %s", 3070: BlockStateAsString(s->blockState)); 3071: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3150 @@ 3150: case TBLOCK_BEGIN: 3151: case TBLOCK_SUBBEGIN: 3152: case TBLOCK_END: 3153: case TBLOCK_SUBEND: 3154: case TBLOCK_ABORT_END: 3155: case TBLOCK_SUBABORT_END: 3156: case TBLOCK_ABORT_PENDING: 3157: case TBLOCK_SUBABORT_PENDING: 3158: case TBLOCK_SUBRESTART: 3159: case TBLOCK_SUBABORT_RESTART: 3160: case TBLOCK_PREPARE: 3161: elog(FATAL, "UserAbortTransactionBlock: unexpected state %s", 3162: BlockStateAsString(s->blockState)); 3163: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3351 @@ 3351: case TBLOCK_BEGIN: 3352: case TBLOCK_SUBBEGIN: 3353: case TBLOCK_END: 3354: case TBLOCK_SUBEND: 3355: case TBLOCK_ABORT_END: 3356: case TBLOCK_SUBABORT_END: 3357: case TBLOCK_ABORT_PENDING: 3358: case TBLOCK_SUBABORT_PENDING: 3359: case TBLOCK_SUBRESTART: 3360: case TBLOCK_SUBABORT_RESTART: 3361: case TBLOCK_PREPARE: 3362: elog(FATAL, "RollbackToSavepoint: unexpected state %s", 3363: BlockStateAsString(s->blockState)); 3364: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3524 @@ 3524: case TBLOCK_BEGIN: 3525: case TBLOCK_SUBBEGIN: 3526: case TBLOCK_INPROGRESS: 3527: case TBLOCK_END: 3528: case TBLOCK_SUBEND: 3529: case TBLOCK_ABORT: 3530: case TBLOCK_ABORT_END: 3531: case TBLOCK_SUBABORT_END: 3532: case TBLOCK_ABORT_PENDING: 3533: case TBLOCK_SUBABORT_PENDING: 3534: case TBLOCK_SUBRESTART: 3535: case TBLOCK_SUBABORT_RESTART: 3536: case TBLOCK_PREPARE: 3537: elog(FATAL, "RollbackAndReleaseCurrentSubTransaction: unexpected state %s", 3538: BlockStateAsString(s->blockState)); 3539: break; ======================== Report 6 ========================================== The verbosity level of log messages are inconsistent! Pattern: 3894 ---------------- src/backend/access/transam/xlog.c --------------------- @@ line: 7537 @@ 7537: if (fscanf(lfp, "START WAL LOCATION: %X/%X (file %24s)%c", 7538: &startpoint.xlogid, &startpoint.xrecoff, startxlogfilename, 7539: &ch) != 4 || ch != '\n') 7540: ereport(ERROR, 7541: (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 7542: errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); ---------------- src/backend/access/transam/xlog.c --------------------- @@ line: 7915 @@ 7915: if (fscanf(fp, "START WAL LOCATION: %X/%X (file %24s)%c", 7916: &startpoint.xlogid, &startpoint.xrecoff, startxlogfilename, 7917: &ch) != 4 || ch != '\n') 7918: ereport(FATAL, 7919: (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 7920: errmsg("invalid data in file \"%s\"", histfilename))); ---------------- src/backend/access/transam/xlog.c --------------------- @@ line: 7921 @@ 7921: if (fscanf(fp, "STOP WAL LOCATION: %X/%X (file %24s)%c", 7922: &stoppoint.xlogid, &stoppoint.xrecoff, stopxlogfilename, 7923: &ch) != 4 || ch != '\n') 7924: ereport(FATAL, 7925: (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 7926: errmsg("invalid data in file \"%s\"", histfilename))); ======================== Report 7 ========================================== The log message at line 3050 and line 3142 have inconsistent verbosity levels! Pattern: 3955 ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3022 @@ 3022: case TBLOCK_SUBABORT: 3023: while (s->parent != NULL) 3024: { 3025: if (s->blockState == TBLOCK_SUBINPROGRESS) 3026: s->blockState = TBLOCK_SUBABORT_PENDING; 3027: else if (s->blockState == TBLOCK_SUBABORT) 3028: s->blockState = TBLOCK_SUBABORT_END; 3029: else 3030: elog(FATAL, "EndTransactionBlock: unexpected state %s", 3031: BlockStateAsString(s->blockState)); 3032: s = s->parent; 3033: } 3034: if (s->blockState == TBLOCK_INPROGRESS) 3035: s->blockState = TBLOCK_ABORT_PENDING; 3036: else if (s->blockState == TBLOCK_ABORT) 3037: s->blockState = TBLOCK_ABORT_END; 3038: else 3039: elog(FATAL, "EndTransactionBlock: unexpected state %s", 3040: BlockStateAsString(s->blockState)); 3041: break; 3042: 3043: /* 3044: * The user issued COMMIT when not inside a transaction. Issue a 3045: * WARNING, staying in TBLOCK_STARTED state. The upcoming call to 3046: * CommitTransactionCommand() will then close the transaction and 3047: * put us back into the default state. 3048: */ 3049: case TBLOCK_STARTED: 3050: ereport(WARNING, 3051: (errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION), 3052: errmsg("there is no transaction in progress"))); 3053: result = true; 3054: break; 3055: 3056: /* These cases are invalid. */ 3057: case TBLOCK_DEFAULT: 3058: case TBLOCK_BEGIN: 3059: case TBLOCK_SUBBEGIN: 3060: case TBLOCK_END: 3061: case TBLOCK_SUBEND: 3062: case TBLOCK_ABORT_END: 3063: case TBLOCK_SUBABORT_END: 3064: case TBLOCK_ABORT_PENDING: 3065: case TBLOCK_SUBABORT_PENDING: 3066: case TBLOCK_SUBRESTART: 3067: case TBLOCK_SUBABORT_RESTART: 3068: case TBLOCK_PREPARE: 3069: elog(FATAL, "EndTransactionBlock: unexpected state %s", 3070: BlockStateAsString(s->blockState)); 3071: break; ---------------- src/backend/access/transam/xact.c --------------------- @@ line: 3114 @@ 3114: case TBLOCK_SUBABORT: 3115: while (s->parent != NULL) 3116: { 3117: if (s->blockState == TBLOCK_SUBINPROGRESS) 3118: s->blockState = TBLOCK_SUBABORT_PENDING; 3119: else if (s->blockState == TBLOCK_SUBABORT) 3120: s->blockState = TBLOCK_SUBABORT_END; 3121: else 3122: elog(FATAL, "UserAbortTransactionBlock: unexpected state %s", 3123: BlockStateAsString(s->blockState)); 3124: s = s->parent; 3125: } 3126: if (s->blockState == TBLOCK_INPROGRESS) 3127: s->blockState = TBLOCK_ABORT_PENDING; 3128: else if (s->blockState == TBLOCK_ABORT) 3129: s->blockState = TBLOCK_ABORT_END; 3130: else 3131: elog(FATAL, "UserAbortTransactionBlock: unexpected state %s", 3132: BlockStateAsString(s->blockState)); 3133: break; 3134: 3135: /* 3136: * The user issued ABORT when not inside a transaction. Issue a 3137: * WARNING and go to abort state. The upcoming call to 3138: * CommitTransactionCommand() will then put us back into the 3139: * default state. 3140: */ 3141: case TBLOCK_STARTED: 3142: ereport(NOTICE, 3143: (errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION), 3144: errmsg("there is no transaction in progress"))); 3145: s->blockState = TBLOCK_ABORT_PENDING; 3146: break; 3147: 3148: /* These cases are invalid. */ 3149: case TBLOCK_DEFAULT: 3150: case TBLOCK_BEGIN: 3151: case TBLOCK_SUBBEGIN: 3152: case TBLOCK_END: 3153: case TBLOCK_SUBEND: 3154: case TBLOCK_ABORT_END: 3155: case TBLOCK_SUBABORT_END: 3156: case TBLOCK_ABORT_PENDING: 3157: case TBLOCK_SUBABORT_PENDING: 3158: case TBLOCK_SUBRESTART: 3159: case TBLOCK_SUBABORT_RESTART: 3160: case TBLOCK_PREPARE: 3161: elog(FATAL, "UserAbortTransactionBlock: unexpected state %s", 3162: BlockStateAsString(s->blockState)); 3163: break; ======================== Report 8 ========================================== The log message at 2292 is ERROR, inconsistent with the line @line 2521 (PANIC). Pattern: 3850 ---------------- src/backend/access/transam/xlog.c --------------------- @@ line: 2289 @@ 2289: fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method), 2290: S_IRUSR | S_IWUSR); 2291: if (fd < 0) 2292: ereport(ERROR, 2293: (errcode_for_file_access(), 2294: errmsg("could not open file \"%s\" (log file %u, segment %u): %m", 2295: path, log, seg))); 2296: 2297: elog(DEBUG2, "done creating and filling new WAL file"); 2298: 2299: return fd; ---------------- src/backend/access/transam/xlog.c --------------------- @@ line: 2518 @@ 2518: fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method), 2519: S_IRUSR | S_IWUSR); 2520: if (fd < 0) 2521: ereport(PANIC, 2522: (errcode_for_file_access(), 2523: errmsg("could not open file \"%s\" (log file %u, segment %u): %m", 2524: path, log, seg))); 2525: 2526: return fd; ======================== Report 9 ========================================== The 2 log messages: 624@comment.c and 663@comment.c have different verbosity levels! Pattern: 8162 ---------------- src/backend/commands/comment.c --------------------- @@ line: 607 @@ 607: ereport(ERROR, 608: (errcode(ERRCODE_SYNTAX_ERROR), 609: errmsg("database name cannot be qualified"))); 610: database = strVal(linitial(qualname)); 611: 612: /* 613: * When loading a dump, we may see a COMMENT ON DATABASE for the old name 614: * of the database. Erroring out would prevent pg_restore from completing 615: * (which is really pg_restore's fault, but for now we will work around 616: * the problem here). Consensus is that the best fix is to treat wrong 617: * database name as a WARNING not an ERROR. 618: */ 619: 620: /* First get the database OID */ 621: oid = get_database_oid(database); 622: if (!OidIsValid(oid)) 623: { 624: ereport(WARNING, 625: (errcode(ERRCODE_UNDEFINED_DATABASE), 626: errmsg("database \"%s\" does not exist", database))); 627: return; ---------------- src/backend/commands/comment.c --------------------- @@ line: 655 @@ 655: ereport(ERROR, 656: (errcode(ERRCODE_SYNTAX_ERROR), 657: errmsg("tablespace name cannot be qualified"))); 658: tablespace = strVal(linitial(qualname)); 659: 660: oid = get_tablespace_oid(tablespace); 661: if (!OidIsValid(oid)) 662: { 663: ereport(ERROR, 664: (errcode(ERRCODE_UNDEFINED_OBJECT), 665: errmsg("tablespace \"%s\" does not exist", tablespace))); 666: return; ======================== Report 10 ========================================== The first log message has WARNING while the others have ERROR! Pattern: 3126 ---------------- src/backend/utils/misc/guc.c --------------------- @@ line: 7029 @@ 7029: ParseLongOption(s, &name, &value); 7030: if (!value) 7031: { 7032: ereport(WARNING, 7033: (errcode(ERRCODE_SYNTAX_ERROR), 7034: errmsg("could not parse setting for parameter \"%s\"", 7035: name))); ---------------- src/backend/postmaster/postmaster.c --------------------- @@ line: 647 @@ 647: ParseLongOption(optarg, &name, &value); 648: if (!value) 649: { 650: if (opt == '-') 651: ereport(ERROR, 652: (errcode(ERRCODE_SYNTAX_ERROR), 653: errmsg("--%s requires a value", 654: optarg))); ---------------- src/backend/bootstrap/bootstrap.c --------------------- @@ line: 288 @@ 288: ParseLongOption(optarg, &name, &value); 289: if (!value) 290: { 291: if (flag == '-') 292: ereport(ERROR, 293: (errcode(ERRCODE_SYNTAX_ERROR), 294: errmsg("--%s requires a value", 295: optarg))); ---------------- src/backend/tcop/postgres.c --------------------- @@ line: 3175 @@ 3175: ParseLongOption(optarg, &name, &value); 3176: if (!value) 3177: { 3178: if (flag == '-') 3179: ereport(ERROR, 3180: (errcode(ERRCODE_SYNTAX_ERROR), 3181: errmsg("--%s requires a value", 3182: optarg)));
pgsql-bugs by date: