feat(bkgpslog):Force ordered write operations with wait
authorSteven Baltakatei Sandoval <baltakatei@gmail.com>
Thu, 2 Jul 2020 16:05:04 +0000 (16:05 +0000)
committerSteven Baltakatei Sandoval <baltakatei@gmail.com>
Thu, 2 Jul 2020 16:05:04 +0000 (16:05 +0000)
Use `wait` built-in to force each detached process that appends
location data to the output tar to wait until all other detached
processes complete. This will prevent the magicWriteBuffer() and
appendArgTar() functions from attempting to append to the same tar at
the same time, causing script failure.

exec/bkgpslog
exec/bkgpslog-plan.org

index 6308e09d401e4c81c8a1cc76ef6655166c711dae..c7cae3658a928b3415c94899c941e7cb7b498e57 100755 (executable)
@@ -664,6 +664,7 @@ appendArgTar(){
 magicWriteBuffer() {
     # Desc: bkgpslog-specific meta function for writing data to DIR_TMP then appending each file to PATHOUT_TAR
     local FN="${FUNCNAME[0]}";
+    wait; # Wait to avoid collision with older magicWriteBuffer() instances (see https://www.tldp.org/LDP/abs/html/x9644.html )
     yell "DEBUG:STATUS:$FN:Started magicWriteBuffer().";
     appendArgTar "$bufferBash" "$FILEOUT_NMEA" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write NMEA data
     appendArgTar "$bufferBash" "$FILEOUT_GPX" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_GPX" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write GPX file
index bc98f9ae67d56901c1c41d5a8429d0bfd5805ec1..7eb5514b65bff95a140749317af2638c65313261 100644 (file)
@@ -1,3 +1,21 @@
+* bkgpslog task list
+** DONE Add job control for short buffer length
+   CLOSED: [2020-07-02 Thu 16:04]
+2020-07-02T14:56Z; bktei> File write operations were bundled into a
+magicWriteBuffer function that is called then detached from the script
+shell (job control), but the detached job is not tracked by the main
+script. A problem may arise if two instances of magicWriteBuffer
+attempt to write to the same tar simultaneously. Two instances of
+magicWriteBuffer may exist if the buffer length is low (ex: 1 second);
+the default buffer length of 60 seconds should reduce the probability
+of a collision but it should be possible for the main script to track
+the process ID of a magicWriteBuffer() as soon as it detaches and then
+checking (via ~$!~ as described [[https://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html][here]]) that the process is still alive.
+2020-07-02T15:23Z; bktei> I found that the Bash ~wait~ built-in can be
+used to delay processing until a specified job completes. The ~wait~
+command will pause script execution until all backgrounded processes
+complete.
+2020-07-02T16:03Z; bktei> Added ~wait~.
 * bkgpslog narrative
 ** Initialize environment
 *** Init variables