Skip to content

Commit

Permalink
src: always use diagnostic file sequence number
Browse files Browse the repository at this point in the history
This commit attaches a sequence number to all filenames that
are automatically generated by DiagnosticFilename. This prevents
accidental overwriting of existing files.

PR-URL: #27142
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
  • Loading branch information
cjihrig committed Apr 11, 2019
1 parent 44a3acb commit 547576f
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 17 deletions.
13 changes: 5 additions & 8 deletions src/node_internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,24 +334,21 @@ class DiagnosticFilename {

DiagnosticFilename(Environment* env,
const char* prefix,
const char* ext,
int seq = -1) :
filename_(MakeFilename(env->thread_id(), prefix, ext, seq)) {}
const char* ext) :
filename_(MakeFilename(env->thread_id(), prefix, ext)) {}

DiagnosticFilename(uint64_t thread_id,
const char* prefix,
const char* ext,
int seq = -1) :
filename_(MakeFilename(thread_id, prefix, ext, seq)) {}
const char* ext) :
filename_(MakeFilename(thread_id, prefix, ext)) {}

const char* operator*() const { return filename_.c_str(); }

private:
static std::string MakeFilename(
uint64_t thread_id,
const char* prefix,
const char* ext,
int seq = -1);
const char* ext);

std::string filename_;
};
Expand Down
6 changes: 1 addition & 5 deletions src/node_report.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include <cstring>
#include <ctime>
#include <cwctype>
#include <atomic>
#include <fstream>
#include <iomanip>
#include <climits> // PATH_MAX
Expand Down Expand Up @@ -73,9 +72,6 @@ static void PrintLoadedLibraries(JSONWriter* writer);
static void PrintComponentVersions(JSONWriter* writer);
static void PrintRelease(JSONWriter* writer);

// Global variables
static std::atomic_int seq = {0}; // sequence number for report filenames

// External function to trigger a report, writing to file.
// The 'name' parameter is in/out: an input filename is used
// if supplied, and the actual filename is returned.
Expand All @@ -99,7 +95,7 @@ std::string TriggerNodeReport(Isolate* isolate,
filename = options->report_filename;
} else {
filename = *DiagnosticFilename(env != nullptr ? env->thread_id() : 0,
"report", "json", seq++);
"report", "json");
}

// Open the report file stream for writing. Supports stdout/err,
Expand Down
9 changes: 5 additions & 4 deletions src/util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,13 @@
#include <sys/types.h>
#endif

#include <atomic>
#include <cstdio>
#include <iomanip>
#include <sstream>

static std::atomic_int seq = {0}; // Sequence number for diagnostic filenames.

namespace node {

// Microseconds in a second, as a float.
Expand Down Expand Up @@ -225,8 +228,7 @@ void DiagnosticFilename::LocalTime(TIME_TYPE* tm_struct) {
std::string DiagnosticFilename::MakeFilename(
uint64_t thread_id,
const char* prefix,
const char* ext,
int seq) {
const char* ext) {
std::ostringstream oss;
TIME_TYPE tm_struct;
LocalTime(&tm_struct);
Expand Down Expand Up @@ -262,8 +264,7 @@ std::string DiagnosticFilename::MakeFilename(
#endif
oss << "." << uv_os_getpid();
oss << "." << thread_id;
if (seq >= 0)
oss << "." << std::setfill('0') << std::setw(3) << ++seq;
oss << "." << std::setfill('0') << std::setw(3) << ++seq;
oss << "." << ext;
return oss.str();
}
Expand Down

0 comments on commit 547576f

Please sign in to comment.