From 65779c7d83e8a8ba776a319e050d6df016398af6 Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Wed, 14 Nov 2018 17:15:14 -0600 Subject: [PATCH 1/4] MCOL-1844. Preserve user-added args in 'myCnf-include-args.text' across upgrades. Conflicts: oamapps/postConfigure/mycnfUpgrade.cpp --- oam/install_scripts/pre-uninstall | 1 + oamapps/postConfigure/mycnfUpgrade.cpp | 56 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/oam/install_scripts/pre-uninstall b/oam/install_scripts/pre-uninstall index 3154e1db4..139ec5353 100755 --- a/oam/install_scripts/pre-uninstall +++ b/oam/install_scripts/pre-uninstall @@ -132,6 +132,7 @@ if [ $quiet != 1 ]; then #make copy of Columnstore.xml /bin/cp -f $installdir/etc/Columnstore.xml $installdir/etc/Columnstore.xml.rpmsave > /dev/null 2>&1 /bin/cp -f $installdir/mysql/my.cnf $installdir/mysql/my.cnf.rpmsave > /dev/null 2>&1 + cp $installdir/bin/myCnf-include-args.text $installdir/bin/myCnf-include-args.text.rpmsave >& /dev/null rm -f $installdir/etc/AlarmConfig.xml.installSave fi diff --git a/oamapps/postConfigure/mycnfUpgrade.cpp b/oamapps/postConfigure/mycnfUpgrade.cpp index 6d2967a43..a7c7308bc 100644 --- a/oamapps/postConfigure/mycnfUpgrade.cpp +++ b/oamapps/postConfigure/mycnfUpgrade.cpp @@ -54,6 +54,58 @@ using namespace std; using namespace oam; +/* MCOL-1844. On an upgrade, the user may have customized options in their old + * myCnf-include-args.text file. Merge it with the packaged version, and then process as we + * have before. + */ +string rtrim(const string &in) { + string::const_reverse_iterator rbegin = in.rbegin(); + while (rbegin != in.rend() && isspace(*rbegin)) + ++rbegin; + return string(in.begin(), rbegin.base()); +} + +void mergeMycnfIncludeArgs() +{ + string userArgsFilename = startup::StartUp::installDir() + "/bin/myCnf-include-args.text.rpmsave"; + string packagedArgsFilename = startup::StartUp::installDir() + "/bin/myCnf-include-args.text"; + ifstream userArgs(userArgsFilename.c_str()); + fstream packagedArgs(packagedArgsFilename.c_str(), ios::in); + + if (!userArgs || !packagedArgs) + return; + + // de-dup the args and comments in both files + set argMerger; + set comments; + string line; + while (getline(packagedArgs, line)) { + line = rtrim(line); + if (line[0] == '#') + comments.insert(line); + else if (line.size() > 0) + argMerger.insert(line); + } + while (getline(userArgs, line)) { + line = rtrim(line); + if (line[0] == '#') + comments.insert(line); + else if (line.size() > 0) + argMerger.insert(line); + } + userArgs.close(); + packagedArgs.close(); + + // write the merged version, comments first. They'll get ordered + // alphabetically but, meh. + packagedArgs.open(packagedArgsFilename.c_str(), ios::out | ios::trunc); + for (set::iterator it = comments.begin(); it != comments.end(); it++) + packagedArgs << *it << endl; + for (set::iterator it = argMerger.begin(); it != argMerger.end(); it++) + packagedArgs << *it << endl; + packagedArgs.close(); +} + int main(int argc, char* argv[]) { Oam oam; @@ -90,6 +142,10 @@ int main(int argc, char* argv[]) exit (1); } + // MCOL-1844. The user may have added options to their myCnf-include-args file. Merge + // myCnf-include-args.text with myCnf-include-args.text.rpmsave, save in myCnf-include-args.text + mergeMycnfIncludeArgs(); + //include arguments file string includeFile = startup::StartUp::installDir() + "/bin/myCnf-include-args.text"; ifstream includefile (includeFile.c_str()); From 86c64d6dc002e8f26354af31483846008a5b6030 Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Thu, 15 Nov 2018 15:33:50 -0600 Subject: [PATCH 2/4] MCOL-1558. This likely covers it. First cut. --- procmon/processmonitor.cpp | 5 +++-- versioning/BRM/save_brm.cpp | 4 +++- versioning/BRM/slavecomm.cpp | 16 ++++++++++------ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/procmon/processmonitor.cpp b/procmon/processmonitor.cpp index 752961854..c8170f384 100644 --- a/procmon/processmonitor.cpp +++ b/procmon/processmonitor.cpp @@ -1736,7 +1736,7 @@ void ProcessMonitor::processMessage(messageqcpp::ByteStream msg, messageqcpp::IO break; } - + case PROCUNMOUNT: { string dbrootID; @@ -2581,7 +2581,8 @@ pid_t ProcessMonitor::startProcess(string processModuleType, string processName, char line[200] = {0}; oldFile->pread(line, 0, fileSize - 1); // skip the \n line[fileSize] = '\0'; // not necessary, but be sure. - string dbrmFile = line; + // MCOL-1558 - the _current file is now relative to DBRMRoot + string dbrmFile = DBRMroot + line; // if ( !gOAMParentModuleFlag ) { diff --git a/versioning/BRM/save_brm.cpp b/versioning/BRM/save_brm.cpp index 74b7ada19..b3d33168c 100644 --- a/versioning/BRM/save_brm.cpp +++ b/versioning/BRM/save_brm.cpp @@ -100,7 +100,9 @@ int main (int argc, char** argv) #ifndef _MSC_VER prefix += '\n'; #endif - currentFile->write(prefix.c_str(), prefix.length()); + // for MCOL-1558. Make the _current file relative to DBRMRoot + string relative = prefix.substr(prefix.find_last_of('/')); + currentFile->write(relative.c_str(), relative.length()); } catch (exception& e) { diff --git a/versioning/BRM/slavecomm.cpp b/versioning/BRM/slavecomm.cpp index fab93d605..55fe3a15b 100644 --- a/versioning/BRM/slavecomm.cpp +++ b/versioning/BRM/slavecomm.cpp @@ -100,7 +100,7 @@ SlaveComm::SlaveComm(string hostname, SlaveDBRMNode* s) : } } } - + string tmpDir = startup::StartUp::tmpDir(); /* NOTE: this string has to match whatever is designated as the first slave */ @@ -2038,9 +2038,11 @@ void SlaveComm::do_confirm() if (currentSaveFile) { - err = currentSaveFile->write(tmp.c_str(), tmp.length()); + // MCOL-1558. Make the _current file relative to DBRMRoot. + string relative = tmp.substr(tmp.find_last_of('/') + 1); + err = currentSaveFile->write(relative.c_str(), relative.length()); - if (err < (int) tmp.length()) + if (err < (int) relative.length()) { ostringstream os; os << "WorkerComm: currentfile write() returned " << err @@ -2070,9 +2072,11 @@ void SlaveComm::do_confirm() else { lseek(currentSaveFD, 0, SEEK_SET); - err = write(currentSaveFD, tmp.c_str(), tmp.length()); + // MCOL-1558. Make the _current file relative to DBRMRoot. + string relative = tmp.substr(tmp.find_last_of('/') + 1); + err = write(currentSaveFD, relative.c_str(), relative.length()); - if (err < (int) tmp.length()) + if (err < (int) relative.length()) { ostringstream os; os << "WorkerComm: currentfile write() returned " << err @@ -2089,7 +2093,7 @@ void SlaveComm::do_confirm() _chsize_s(currentSaveFD, tmp.length()); _commit(currentSaveFD); #else - err = ftruncate(currentSaveFD, tmp.length()); + err = ftruncate(currentSaveFD, relative.length()); fsync(currentSaveFD); #endif saveFileToggle = !saveFileToggle; From 69046633d23357617c727d9bcfeafc241cc19ac8 Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Thu, 15 Nov 2018 15:49:12 -0600 Subject: [PATCH 3/4] MCOL-1558. The load side needs to handle abs paths. --- procmon/processmonitor.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/procmon/processmonitor.cpp b/procmon/processmonitor.cpp index c8170f384..b9ba25193 100644 --- a/procmon/processmonitor.cpp +++ b/procmon/processmonitor.cpp @@ -2582,7 +2582,11 @@ pid_t ProcessMonitor::startProcess(string processModuleType, string processName, oldFile->pread(line, 0, fileSize - 1); // skip the \n line[fileSize] = '\0'; // not necessary, but be sure. // MCOL-1558 - the _current file is now relative to DBRMRoot - string dbrmFile = DBRMroot + line; + string dbrmFile; + if (line[0] == '/') // handle absolute paths (saved by an old version) + dbrmFile = line; + else + dbrmFile = DBRMroot + line; // if ( !gOAMParentModuleFlag ) { From 55596742088d1156513ee52175d589f0bfd91096 Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Thu, 15 Nov 2018 16:50:45 -0600 Subject: [PATCH 4/4] MCOL-1558. Got it working. Fixed a couple off-by-one type errors constructing the new paths. --- procmon/processmonitor.cpp | 2 +- versioning/BRM/save_brm.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/procmon/processmonitor.cpp b/procmon/processmonitor.cpp index b9ba25193..9a8f4b8cd 100644 --- a/procmon/processmonitor.cpp +++ b/procmon/processmonitor.cpp @@ -2586,7 +2586,7 @@ pid_t ProcessMonitor::startProcess(string processModuleType, string processName, if (line[0] == '/') // handle absolute paths (saved by an old version) dbrmFile = line; else - dbrmFile = DBRMroot + line; + dbrmFile = DBRMroot.substr(0, DBRMroot.find_last_of('/') + 1) + line; // if ( !gOAMParentModuleFlag ) { diff --git a/versioning/BRM/save_brm.cpp b/versioning/BRM/save_brm.cpp index b3d33168c..d53507082 100644 --- a/versioning/BRM/save_brm.cpp +++ b/versioning/BRM/save_brm.cpp @@ -101,7 +101,7 @@ int main (int argc, char** argv) prefix += '\n'; #endif // for MCOL-1558. Make the _current file relative to DBRMRoot - string relative = prefix.substr(prefix.find_last_of('/')); + string relative = prefix.substr(prefix.find_last_of('/') + 1); currentFile->write(relative.c_str(), relative.length()); } catch (exception& e)