/* * MemoryAccounting_ToCSV * Converts a memory account tree rooted at "root" to string using tree * walker and repeated calls of MemoryAccountToCSV * * root: The root of the tree (used recursively) * str: The output buffer * prefix: A common prefix for each csv line */ void MemoryAccounting_ToCSV(MemoryAccount *root, StringInfoData *str, char *prefix) { MemoryAccountSerializerCxt cxt; cxt.buffer = str; cxt.memoryAccountCount = 0; cxt.prefix = prefix; uint32 totalWalked = 0; int64 vmem_reserved = VmemTracker_GetMaxReservedVmemBytes(); /* * Add vmem reserved as reported by memprot. We report the vmem reserved in the * "allocated" and "peak" fields. We set the freed to 0. */ appendStringInfo(str, "%s,%d,%u,%u,%" PRIu64 ",%" PRIu64 ",%" PRIu64 ",%" PRIu64 "\n", prefix, MEMORY_STAT_TYPE_VMEM_RESERVED, totalWalked /* Child walk serial */, totalWalked /* Parent walk serial */, (int64) 0 /* Quota */, vmem_reserved /* Peak */, vmem_reserved /* Allocated */, (int64) 0 /* Freed */); /* * Add peak memory observed from inside memory accounting among all allocations. */ appendStringInfo(str, "%s,%d,%u,%u,%" PRIu64 ",%" PRIu64 ",%" PRIu64 ",%" PRIu64 "\n", prefix, MEMORY_STAT_TYPE_MEMORY_ACCOUNTING_PEAK, totalWalked /* Child walk serial */, totalWalked /* Parent walk serial */, (int64) 0 /* Quota */, MemoryAccountingPeakBalance /* Peak */, MemoryAccountingPeakBalance /* Allocated */, (int64) 0 /* Freed */); MemoryAccountWalkNode(root, MemoryAccountToCSV, &cxt, 0, &totalWalked, totalWalked); }
/* * MemoryAccounting_SaveToLog * Saves the current memory accounting tree in the log. * * Returns the number of memory accounts written to log. */ uint32 MemoryAccounting_SaveToLog() { MemoryAccountSerializerCxt cxt; cxt.buffer = NULL; cxt.memoryAccountCount = 0; cxt.prefix = NULL; uint32 totalWalked = 0; int64 vmem_reserved = VmemTracker_GetMaxReservedVmemBytes(); /* Write the header for the subsequent lines of memory usage information */ write_stderr("memory: account_name, child_id, parent_id, quota, peak, allocated, freed, current\n"); write_stderr("memory: %s, %u, %u, %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 "\n", "Vmem", totalWalked /* Child walk serial */, totalWalked /* Parent walk serial */, (int64) 0 /* Quota */, vmem_reserved /* Peak */, vmem_reserved /* Allocated */, (int64) 0 /* Freed */, vmem_reserved /* Current */); write_stderr("memory: %s, %u, %u, %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 "\n", "Peak", totalWalked /* Child walk serial */, totalWalked /* Parent walk serial */, (int64) 0 /* Quota */, MemoryAccountingPeakBalance /* Peak */, MemoryAccountingPeakBalance /* Allocated */, (int64) 0 /* Freed */, MemoryAccountingPeakBalance /* Current */); MemoryAccountWalkNode(MemoryAccountTreeLogicalRoot, MemoryAccountToLog, &cxt, 0, &totalWalked, totalWalked); return totalWalked; }
/* * Send a gpdb libpq message. */ void sendQEDetails(void) { StringInfoData buf; pq_beginmessage(&buf, 'w'); pq_sendint(&buf, (int32) Gp_listener_port, sizeof(int32)); pq_sendint64(&buf, VmemTracker_GetMaxReservedVmemBytes()); pq_sendint(&buf, sizeof(PG_VERSION_STR), sizeof(int32)); pq_sendbytes(&buf, PG_VERSION_STR, sizeof(PG_VERSION_STR)); pq_endmessage(&buf); }
/* ---------------- * ReadyForQuery - tell dest that we are ready for a new query * * The ReadyForQuery message is sent in protocol versions 2.0 and up * so that the FE can tell when we are done processing a query string. * In versions 3.0 and up, it also carries a transaction state indicator. * * Note that by flushing the stdio buffer here, we can avoid doing it * most other places and thus reduce the number of separate packets sent. * ---------------- */ void ReadyForQuery(CommandDest dest) { switch (dest) { case DestRemote: case DestRemoteExecute: if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3) { StringInfoData buf; if (Gp_role == GP_ROLE_EXECUTE) { pq_beginmessage(&buf, 'k'); pq_sendint64(&buf, VmemTracker_GetMaxReservedVmemBytes()); pq_endmessage(&buf); } pq_beginmessage(&buf, 'Z'); pq_sendbyte(&buf, TransactionBlockStatusCode()); pq_endmessage(&buf); } else if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2) pq_putemptymessage('Z'); /* Flush output at end of cycle in any case. */ pq_flush(); break; case DestNone: case DestDebug: case DestSPI: case DestTuplestore: case DestIntoRel: case DestCopyOut: break; } }