Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit030832c

Browse files
committed
PGPRO-2065: --amcheck minor fixes
1 parent19405a9 commit030832c

File tree

3 files changed

+67
-94
lines changed

3 files changed

+67
-94
lines changed

‎src/backup.c

Lines changed: 62 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ static void do_amcheck(void);
109109
staticvoid*check_files(void*arg);
110110
staticvoid*check_indexes(void*arg);
111111
staticparray*get_index_list(PGresult*res_db,intdb_number,
112-
bool*first_db_with_amcheck,PGconn*db_conn);
112+
boolfirst_db_with_amcheck,PGconn*db_conn);
113113
staticboolamcheck_one_index(backup_files_arg*arguments,
114114
pg_indexEntry*ind);
115115

@@ -1049,13 +1049,19 @@ do_amcheck(void)
10491049
pgBackupGetPath(&current,database_path,lengthof(database_path),
10501050
DATABASE_DIR);
10511051

1052-
res_db=pgut_execute(backup_conn,"SELECT datname, oid, dattablespace FROM pg_database",
1052+
res_db=pgut_execute(backup_conn,
1053+
"SELECT datname, oid, dattablespace "
1054+
"FROM pg_database "
1055+
"WHERE datname NOT IN ('template0', 'template1')",
10531056
0,NULL);
1057+
10541058
n_databases=PQntuples(res_db);
10551059

10561060
/* TODO Warn user that one connection is used for snaphot */
1057-
if (num_threads>1)
1058-
num_threads--;
1061+
//if (num_threads > 1)
1062+
//num_threads--;
1063+
1064+
elog(INFO,"Start checking instance with amcheck");
10591065

10601066
/* For each database check indexes. In parallel. */
10611067
for(i=0;i<n_databases;i++)
@@ -1069,14 +1075,17 @@ do_amcheck(void)
10691075
}
10701076

10711077
index_list=get_index_list(res_db,i,
1072-
&first_db_with_amcheck,db_conn);
1078+
first_db_with_amcheck,db_conn);
1079+
10731080
if (index_list==NULL)
10741081
{
10751082
if (db_conn)
10761083
pgut_disconnect(db_conn);
10771084
continue;
10781085
}
10791086

1087+
first_db_with_amcheck= false;
1088+
10801089
/* init thread args with own file lists */
10811090
threads= (pthread_t*)palloc(sizeof(pthread_t)*num_threads);
10821091
threads_args= (backup_files_arg*)palloc(sizeof(backup_files_arg)*num_threads);
@@ -1099,8 +1108,6 @@ do_amcheck(void)
10991108

11001109
pgut_atexit_push(threads_conn_disconnect,NULL);
11011110

1102-
elog(INFO,"Start checking indexes with amcheck");
1103-
11041111
/* Run threads */
11051112
for (j=0;j<num_threads;j++)
11061113
{
@@ -1115,24 +1122,24 @@ do_amcheck(void)
11151122
for (j=0;j<num_threads;j++)
11161123
{
11171124
pthread_join(threads[j],NULL);
1118-
if (threads_args[j].ret==1)
1125+
if (threads_args[j].ret>0)
11191126
check_isok= false;
11201127
}
11211128
pgut_disconnect(db_conn);
11221129
}
11231130

11241131
/* TODO write better info message */
11251132
if (check_isok)
1126-
elog(INFO,"Indexes arechecked");
1133+
elog(INFO,"Indexes arevalid");
11271134
else
1128-
elog(ERROR,"Indexs checking failed");
1129-
1130-
if (backup_files_list)
1131-
{
1132-
parray_walk(backup_files_list,pgFileFree);
1133-
parray_free(backup_files_list);
1134-
backup_files_list=NULL;
1135-
}
1135+
elog(ERROR,"Some indexes are corrupted");
1136+
1137+
//if (backup_files_list)
1138+
//{
1139+
//parray_walk(backup_files_list, pgFileFree);
1140+
//parray_free(backup_files_list);
1141+
//backup_files_list = NULL;
1142+
//}
11361143
}
11371144

11381145
/* Entry point of pg_probackup CHECKDB subcommand. */
@@ -1150,8 +1157,8 @@ do_checkdb(bool need_amcheck)
11501157
if (!skip_block_validation)
11511158
do_block_validation();
11521159

1153-
//if (need_amcheck)
1154-
//do_amcheck();
1160+
if (need_amcheck)
1161+
do_amcheck();
11551162

11561163
return0;
11571164
}
@@ -2540,7 +2547,7 @@ threads_conn_disconnect(bool fatal, void *userdata)
25402547
{
25412548
//int i;
25422549

2543-
elog(VERBOSE,"threads_conn_disconnect, num_threads %d",num_threads);
2550+
//elog(VERBOSE, "threads_conn_disconnect, num_threads %d", num_threads);
25442551
// for (i = 0; i < num_threads; i++)
25452552
// {
25462553
// backup_files_arg *arg = &(threads_args[i]);
@@ -2654,7 +2661,9 @@ check_indexes(void *arg)
26542661
if (interrupted||thread_interrupted)
26552662
elog(ERROR,"interrupted during checkdb --amcheck");
26562663

2657-
elog(VERBOSE,"Checking index number %d of %d : \"%s\" ",i,n_indexes,ind->name);
2664+
if (progress)
2665+
elog(INFO,"Progress: (%d/%d). Processing index '%s.%s'",
2666+
i+1,n_indexes,ind->amcheck_nspname,ind->name);
26582667

26592668
if (arguments->backup_conn==NULL)
26602669
{
@@ -2666,34 +2675,20 @@ check_indexes(void *arg)
26662675
ind->dbname,
26672676
instance_config.pguser);
26682677
arguments->cancel_conn=PQgetCancel(arguments->backup_conn);
2669-
2670-
res=pgut_execute_parallel(arguments->backup_conn,
2671-
arguments->cancel_conn,
2672-
"BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;",0,NULL, false);
2673-
PQclear(res);
2674-
2675-
query=palloc(strlen("SET TRANSACTION SNAPSHOT '' ")+strlen(ind->snapshot));
2676-
sprintf(query,"SET TRANSACTION SNAPSHOT '%s'",ind->snapshot);
2677-
2678-
res=pgut_execute_parallel(arguments->backup_conn,
2679-
arguments->cancel_conn,
2680-
query,0,NULL, false);
2681-
PQclear(res);
2682-
2683-
free(query);
26842678
}
26852679

26862680
/* remember that we have a failed check */
26872681
if (!amcheck_one_index(arguments,ind))
2688-
arguments->ret=1;
2682+
arguments->ret=2;
26892683
}
26902684

26912685
/* Close connection */
26922686
if (arguments->backup_conn)
26932687
pgut_disconnect(arguments->backup_conn);
26942688

26952689
/* TODO where should we set arguments->ret to 1? */
2696-
arguments->ret=0;
2690+
if (arguments->ret==1)
2691+
arguments->ret=0;
26972692

26982693
returnNULL;
26992694
}
@@ -3410,7 +3405,7 @@ pg_ptrack_get_block(backup_files_arg *arguments,
34103405
res=pgut_execute_parallel(arguments->backup_conn,
34113406
arguments->cancel_conn,
34123407
"SELECT pg_catalog.pg_ptrack_get_block_2($1, $2, $3, $4)",
3413-
4, (constchar**)params, true);
3408+
4, (constchar**)params, true, false);
34143409

34153410
if (PQnfields(res)!=1)
34163411
{
@@ -3478,38 +3473,39 @@ check_external_for_tablespaces(parray *external_list)
34783473
PQclear(res);
34793474
}
34803475

3481-
/*Clear ptrack files in all databases of the instance we connected to */
3476+
/*Get index list for given database */
34823477
staticparray*
34833478
get_index_list(PGresult*res_db,intdb_number,
3484-
bool*first_db_with_amcheck,PGconn*db_conn)
3479+
boolfirst_db_with_amcheck,PGconn*db_conn)
34853480
{
34863481
PGresult*res;
34873482
char*nspname=NULL;
34883483
char*snapshot=NULL;
34893484
inti;
34903485

34913486
dbname=PQgetvalue(res_db,db_number,0);
3492-
if (strcmp(dbname,"template0")==0)
3493-
returnNULL;
34943487

34953488
db_conn=pgut_connect(instance_config.pghost,instance_config.pgport,
34963489
dbname,
34973490
instance_config.pguser);
34983491

3499-
res=pgut_execute(db_conn,"select extname, nspname, extversion from pg_namespace "
3500-
"n join pg_extension e on n.oid=e.extnamespace where e.extname='amcheck'",
3492+
res=pgut_execute(db_conn,"SELECT extname, nspname, extversion "
3493+
"FROM pg_namespace n "
3494+
"JOIN pg_extension e "
3495+
"ON n.oid=e.extnamespace "
3496+
"WHERE e.extname='amcheck'",
35013497
0,NULL);
35023498

35033499
if (PQresultStatus(res)!=PGRES_TUPLES_OK)
35043500
{
35053501
PQclear(res);
3506-
elog(ERROR,"cannot check if amcheck is installed in database %s: %s",
3502+
elog(ERROR,"Cannot check if amcheck is installed in database %s: %s",
35073503
dbname,PQerrorMessage(db_conn));
35083504
}
35093505

35103506
if (PQntuples(res)<1)
35113507
{
3512-
elog(WARNING,"extension amcheck is not installed in database %s",dbname);
3508+
elog(WARNING,"Extension amcheck is not installed in database %s",dbname);
35133509
returnNULL;
35143510
}
35153511

@@ -3520,56 +3516,32 @@ get_index_list(PGresult *res_db, int db_number,
35203516
* In order to avoid duplicates, select global indexes
35213517
* (tablespace pg_global with oid 1664) only once
35223518
*/
3523-
if (*first_db_with_amcheck)
3519+
if (first_db_with_amcheck)
35243520
{
3525-
res=pgut_execute(db_conn,"BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;",0,NULL);
3526-
PQclear(res);
3527-
3528-
res=pgut_execute(db_conn,"SELECT pg_export_snapshot();",0,NULL);
3529-
3530-
if (PQntuples(res)<1)
3531-
elog(ERROR,"Failed to export snapshot for amcheck in database %s",dbname);
3532-
3533-
snapshot=pgut_malloc(strlen(PQgetvalue(res,0,0))+1);
3534-
strcpy(snapshot,PQgetvalue(res,0,0));
3535-
3536-
PQclear(res);
35373521

3522+
/* select only valid btree and persistent indexes */
35383523
res=pgut_execute(db_conn,"SELECT cls.oid, cls.relname"
35393524
" FROM pg_index idx "
35403525
" JOIN pg_class cls ON cls.oid=idx.indexrelid "
35413526
" JOIN pg_am am ON am.oid=cls.relam "
35423527
" WHERE am.amname='btree' AND cls.relpersistence != 't'"
35433528
" AND idx.indisready AND idx.indisvalid; ",0,NULL);
3544-
*first_db_with_amcheck= false;
35453529
}
35463530
else
35473531
{
3548-
res=pgut_execute(db_conn,"BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;",0,NULL);
3549-
PQclear(res);
3550-
3551-
res=pgut_execute(db_conn,"SELECT pg_export_snapshot();",0,NULL);
3552-
3553-
if (PQntuples(res)<1)
3554-
elog(ERROR,"Failed to export snapshot for amcheck in database %s",dbname);
35553532

3556-
if (snapshot)
3557-
free(snapshot);
3558-
snapshot=pgut_malloc(strlen(PQgetvalue(res,0,0))+1);
3559-
strcpy(snapshot,PQgetvalue(res,0,0));
3560-
3561-
PQclear(res);
3562-
3563-
res=pgut_execute(db_conn,"SELECT cls.oid, cls.relname"
3564-
" FROM pg_index idx "
3565-
" JOIN pg_class cls ON cls.oid=idx.indexrelid "
3566-
" JOIN pg_am am ON am.oid=cls.relam "
3567-
" WHERE am.amname='btree' AND cls.relpersistence != 't'"
3568-
" AND idx.indisready AND idx.indisvalid AND cls.reltablespace!=1664; ",0,NULL);
3533+
res=pgut_execute(db_conn,"SELECT cls.oid, cls.relname "
3534+
"FROM pg_index idx "
3535+
"JOIN pg_class cls ON cls.oid=idx.indexrelid "
3536+
"JOIN pg_am am ON am.oid=cls.relam "
3537+
"JOIN pg_tablespace tbl ON tbl.oid=cls.reltablespace "
3538+
"WHERE am.amname='btree' AND cls.relpersistence != 't' "
3539+
"AND idx.indisready AND idx.indisvalid "
3540+
"AND tbl.spcname !='pg_global'",0,NULL);
35693541
}
35703542

35713543
/* add info needed to check indexes into index_list */
3572-
for(i=0;i<PQntuples(res);i++)
3544+
for(i=0;i<PQntuples(res);i++)
35733545
{
35743546
pg_indexEntry*ind= (pg_indexEntry*)pgut_malloc(sizeof(pg_indexEntry));
35753547
char*name=NULL;
@@ -3582,9 +3554,6 @@ get_index_list(PGresult *res_db, int db_number,
35823554
ind->dbname=pgut_malloc(strlen(dbname)+1);
35833555
strcpy(ind->dbname,dbname);
35843556

3585-
ind->snapshot=pgut_malloc(strlen(snapshot)+1);
3586-
strcpy(ind->snapshot,snapshot);
3587-
35883557
ind->amcheck_nspname=pgut_malloc(strlen(nspname)+1);
35893558
strcpy(ind->amcheck_nspname,nspname);
35903559
pg_atomic_clear_flag(&ind->lock);
@@ -3598,6 +3567,8 @@ get_index_list(PGresult *res_db, int db_number,
35983567

35993568
PQclear(res);
36003569

3570+
elog(INFO,"Amcheck database '%s'",dbname);
3571+
36013572
returnindex_list;
36023573
}
36033574

@@ -3613,27 +3584,26 @@ amcheck_one_index(backup_files_arg *arguments,
36133584

36143585
sprintf(params[0],"%i",ind->indexrelid);
36153586

3616-
elog(VERBOSE,"amcheck index: '%s'",ind->name);
3617-
36183587
query=palloc(strlen(ind->amcheck_nspname)+strlen("SELECT .bt_index_check($1)")+1);
36193588
sprintf(query,"SELECT %s.bt_index_check($1)",ind->amcheck_nspname);
36203589

36213590
res=pgut_execute_parallel(arguments->backup_conn,
36223591
arguments->cancel_conn,
3623-
query,1, (constchar**)params, true);
3592+
query,1, (constchar**)params, true, true);
36243593

36253594
if (PQresultStatus(res)!=PGRES_TUPLES_OK)
36263595
{
3627-
elog(VERBOSE,"amcheck failed for relation oid %u: %s",
3628-
ind->indexrelid,PQresultErrorMessage(res));
3596+
elog(WARNING,"Amcheck failed for index: '%s.%s': %s",
3597+
ind->amcheck_nspname,
3598+
ind->name,PQresultErrorMessage(res));
36293599

36303600
pfree(params[0]);
36313601
PQclear(res);
36323602
return false;
36333603
}
36343604
else
3635-
elog(VERBOSE,"amcheck succeeded forrelation oid %u",
3636-
ind->indexrelid);
3605+
elog(LOG,"Amcheck succeeded forindex: '%s.%s'",
3606+
ind->amcheck_nspname,ind->name);
36373607

36383608
pfree(params[0]);
36393609
PQclear(res);

‎src/utils/pgut.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ PGresult *
359359
pgut_execute_parallel(PGconn*conn,
360360
PGcancel*thread_cancel_conn,constchar*query,
361361
intnParams,constchar**params,
362-
booltext_result)
362+
booltext_result,boolok_error)
363363
{
364364
PGresult*res;
365365

@@ -405,6 +405,9 @@ pgut_execute_parallel(PGconn* conn,
405405
casePGRES_COPY_IN:
406406
break;
407407
default:
408+
if (ok_error&&PQresultStatus(res)==PGRES_FATAL_ERROR)
409+
break;
410+
408411
elog(ERROR,"query failed: %squery was: %s",
409412
PQerrorMessage(conn),query);
410413
break;

‎src/utils/pgut.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ extern PGresult *pgut_execute_extended(PGconn* conn, const char *query, int nPar
5757
constchar**params,booltext_result,boolok_error);
5858
externPGresult*pgut_execute_parallel(PGconn*conn,PGcancel*thread_cancel_conn,
5959
constchar*query,intnParams,
60-
constchar**params,booltext_result);
60+
constchar**params,booltext_result,boolok_error);
6161
externboolpgut_send(PGconn*conn,constchar*query,intnParams,constchar**params,intelevel);
6262
externvoidpgut_cancel(PGconn*conn);
6363
externintpgut_wait(intnum,PGconn*connections[],structtimeval*timeout);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp