PolarDBforPostgreSQL/external/polar_monitor/polar_monitor_datamax.c

94 lines
3.3 KiB
C

/*-------------------------------------------------------------------------
*
* polar_monitor_datamax.c
* display some information of polardb datamax
*
* Copyright (c) 2020, Alibaba Group Holding Limited
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* IDENTIFICATION
* external/polar_monitor/polar_monitor_datamax.c
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "access/htup_details.h"
#include "access/tupdesc.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "nodes/execnodes.h"
#include "polar_datamax/polar_datamax.h"
#include "utils/pg_lsn.h"
#include "utils/tuplestore.h"
#define NUM_DATAMAX_INFO_ELEM 7
PG_FUNCTION_INFO_V1(polar_get_datamax_info);
Datum
polar_get_datamax_info(PG_FUNCTION_ARGS)
{
int i = 0;
TupleDesc tupdesc;
AttrNumber cols = 1;
Datum values[NUM_DATAMAX_INFO_ELEM];
bool nulls[NUM_DATAMAX_INFO_ELEM];
if (!polar_is_datamax())
elog(ERROR, "current db is not in DataMax mode.");
tupdesc = CreateTemplateTupleDesc(NUM_DATAMAX_INFO_ELEM, false);
TupleDescInitEntry(tupdesc, cols++, "min_received_timeline", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "min_received_lsn", LSNOID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "last_received_timeline", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "last_received_lsn", LSNOID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "last_valid_received_lsn", LSNOID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "clean_reserved_lsn", LSNOID, -1, 0);
TupleDescInitEntry(tupdesc, cols++, "force_clean", BOOLOID, -1, 0);
tupdesc = BlessTupleDesc(tupdesc);
MemSet(nulls, 0, sizeof(nulls));
LWLockAcquire(&polar_datamax_ctl->meta_lock, LW_SHARED);
values[i++] = UInt32GetDatum(polar_datamax_ctl->meta.min_timeline_id);
values[i++] = LSNGetDatum(polar_datamax_ctl->meta.min_received_lsn);
values[i++] = UInt32GetDatum(polar_datamax_ctl->meta.last_timeline_id);
values[i++] = LSNGetDatum(polar_datamax_ctl->meta.last_received_lsn);
values[i++] = LSNGetDatum(polar_datamax_ctl->meta.last_valid_received_lsn);
LWLockRelease(&polar_datamax_ctl->meta_lock);
SpinLockAcquire(&polar_datamax_ctl->lock);
values[i++] = LSNGetDatum(polar_datamax_ctl->clean_task.reserved_lsn);
values[i++] = BoolGetDatum(polar_datamax_ctl->clean_task.force);
SpinLockRelease(&polar_datamax_ctl->lock);
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
}
PG_FUNCTION_INFO_V1(polar_set_datamax_reserved_lsn);
Datum
polar_set_datamax_reserved_lsn(PG_FUNCTION_ARGS)
{
XLogRecPtr reserved_lsn = PG_GETARG_LSN(0);
bool force = PG_GETARG_BOOL(1);
if (!polar_is_datamax())
elog(ERROR, "current db is not in DataMax mode.");
PG_RETURN_BOOL(polar_datamax_set_clean_task(reserved_lsn, force));
}