* [sup-devel] [PATCH 1/2] ensure sources.yaml gets flushed to disk
@ 2011-01-18 18:28 Sascha Silbe
2011-01-18 18:28 ` [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions Sascha Silbe
0 siblings, 1 reply; 10+ messages in thread
From: Sascha Silbe @ 2011-01-18 18:28 UTC (permalink / raw)
To: sup-devel
Before renaming sources.yaml we need to fsync() it, otherwise we could end up
with an empty file in case of a crash [1].
[1] http://thunk.org/tytso/blog/2009/03/12/delayed-allocation-and-the-zero-length-file-problem/
Signed-off-by: Sascha Silbe <sascha-pgp@silbe.org>
---
lib/sup.rb | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/lib/sup.rb b/lib/sup.rb
index edd23c8..09744b4 100644
--- a/lib/sup.rb
+++ b/lib/sup.rb
@@ -98,10 +98,16 @@ module Redwood
if safe
safe_fn = "#{File.dirname fn}/safe_#{File.basename fn}"
mode = File.stat(fn).mode if File.exists? fn
- File.open(safe_fn, "w", mode) { |f| f.puts o.to_yaml }
+ File.open(safe_fn, "w", mode) do |f|
+ f.puts o.to_yaml
+ f.fsync
+ end
FileUtils.mv safe_fn, fn
else
- File.open(fn, "w") { |f| f.puts o.to_yaml }
+ File.open(fn, "w") do |f|
+ f.puts o.to_yaml
+ f.fsync
+ end
end
end
--
1.7.2.3
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-18 18:28 [sup-devel] [PATCH 1/2] ensure sources.yaml gets flushed to disk Sascha Silbe
@ 2011-01-18 18:28 ` Sascha Silbe
2011-01-19 3:41 ` Rich Lane
2011-01-19 15:38 ` William Morgan
0 siblings, 2 replies; 10+ messages in thread
From: Sascha Silbe @ 2011-01-18 18:28 UTC (permalink / raw)
To: sup-devel
If config.yaml resp. sources.yaml already exists, preserve the permissions.
Also alter the save algorithm to overwrite the file in-place, thus leaving
symlinks intact.
Signed-off-by: Sascha Silbe <sascha-pgp@silbe.org>
---
All invocations of save_yaml_obj now use the "backup" mode, so maybe we
should just hardcode it in save_yaml_obj, getting rid of the (existing)
safe and (new) backup parameters.
bin/sup-config | 2 +-
lib/sup.rb | 27 ++++++++++++++++++++++-----
lib/sup/source.rb | 8 +-------
3 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/bin/sup-config b/bin/sup-config
index 132fd77..c4a64a3 100755
--- a/bin/sup-config
+++ b/bin/sup-config
@@ -191,7 +191,7 @@ else
end
end
-Redwood::save_yaml_obj $config, Redwood::CONFIG_FN
+Redwood::save_yaml_obj $config, Redwood::CONFIG_FN, false, true
say "Ok, I've saved you up a nice lil' #{Redwood::CONFIG_FN}."
diff --git a/lib/sup.rb b/lib/sup.rb
index 09744b4..21bddb2 100644
--- a/lib/sup.rb
+++ b/lib/sup.rb
@@ -86,7 +86,7 @@ module Redwood
module_function :reporting_thread, :record_exception, :exceptions
## one-stop shop for yamliciousness
- def save_yaml_obj o, fn, safe=false
+ def save_yaml_obj o, fn, safe=false, backup=false
o = if o.is_a?(Array)
o.map { |x| (x.respond_to?(:before_marshal) && x.before_marshal) || x }
elsif o.respond_to? :before_marshal
@@ -95,16 +95,33 @@ module Redwood
o
end
- if safe
+ mode = if File.exists? fn
+ File.stat(fn).mode
+ else
+ 0600
+ end
+
+ if backup
+ backup_fn = fn + '.bak'
+ unless File.exists?(backup_fn) && File.size(fn) == 0
+ File.open(backup_fn, "w", mode) do |f|
+ File.open(fn, "r") { |old_f| FileUtils.copy_stream old_f, f }
+ f.fsync
+ end
+ end
+ File.open(fn, "w") do |f|
+ f.puts o.to_yaml
+ f.fsync
+ end
+ elsif safe
safe_fn = "#{File.dirname fn}/safe_#{File.basename fn}"
- mode = File.stat(fn).mode if File.exists? fn
File.open(safe_fn, "w", mode) do |f|
f.puts o.to_yaml
f.fsync
end
FileUtils.mv safe_fn, fn
else
- File.open(fn, "w") do |f|
+ File.open(fn, "w", mode) do |f|
f.puts o.to_yaml
f.fsync
end
@@ -292,7 +309,7 @@ EOS
:col_jump => 2
}
begin
- Redwood::save_yaml_obj config, filename
+ Redwood::save_yaml_obj config, filename, false, true
rescue StandardError => e
$stderr.puts "warning: #{e.message}"
end
diff --git a/lib/sup/source.rb b/lib/sup/source.rb
index 9c398f7..f2379fb 100644
--- a/lib/sup/source.rb
+++ b/lib/sup/source.rb
@@ -212,13 +212,7 @@ class SourceManager
def save_sources fn=Redwood::SOURCE_FN
@source_mutex.synchronize do
if @sources_dirty
- bakfn = fn + ".bak"
- if File.exists? fn
- File.chmod 0600, fn
- FileUtils.mv fn, bakfn, :force => true unless File.exists?(bakfn) && File.size(fn) == 0
- end
- Redwood::save_yaml_obj sources, fn, true
- File.chmod 0600, fn
+ Redwood::save_yaml_obj sources, fn, false, true
end
@sources_dirty = false
end
--
1.7.2.3
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-18 18:28 ` [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions Sascha Silbe
@ 2011-01-19 3:41 ` Rich Lane
2011-01-19 10:05 ` Sascha Silbe
2011-01-19 15:38 ` William Morgan
1 sibling, 1 reply; 10+ messages in thread
From: Rich Lane @ 2011-01-19 3:41 UTC (permalink / raw)
To: Sascha Silbe; +Cc: sup-devel
Both patches applied to master.
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 3:41 ` Rich Lane
@ 2011-01-19 10:05 ` Sascha Silbe
0 siblings, 0 replies; 10+ messages in thread
From: Sascha Silbe @ 2011-01-19 10:05 UTC (permalink / raw)
To: Rich Lane; +Cc: sup-devel
[-- Attachment #1.1: Type: text/plain, Size: 242 bytes --]
Excerpts from Rich Lane's message of Wed Jan 19 04:41:53 +0100 2011:
> Both patches applied to master.
[as well as a whole bunch of other patches from me]
Thanks!
Sascha
--
http://sascha.silbe.org/
http://www.infra-silbe.de/
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 494 bytes --]
[-- Attachment #2: Type: text/plain, Size: 143 bytes --]
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-18 18:28 ` [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions Sascha Silbe
2011-01-19 3:41 ` Rich Lane
@ 2011-01-19 15:38 ` William Morgan
2011-01-19 16:42 ` Sascha Silbe
2011-01-19 17:19 ` William Morgan
1 sibling, 2 replies; 10+ messages in thread
From: William Morgan @ 2011-01-19 15:38 UTC (permalink / raw)
To: sup-devel
Reformatted excerpts from Sascha Silbe's message of 2011-01-18:
> + unless File.exists?(backup_fn) && File.size(fn) == 0
This line is giving me some problems when fn doesn't exist (e.g. when
running sup-sync the first time without a config.yaml). Should it be
File.exists?(backup_fn) && File.exists?(fn) && File.size(fn) == 0
instead?
--
William <wmorgan-sup@masanjin.net>
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 15:38 ` William Morgan
@ 2011-01-19 16:42 ` Sascha Silbe
2011-01-19 17:17 ` William Morgan
2011-01-19 17:19 ` William Morgan
1 sibling, 1 reply; 10+ messages in thread
From: Sascha Silbe @ 2011-01-19 16:42 UTC (permalink / raw)
To: William Morgan; +Cc: sup-devel
[-- Attachment #1.1: Type: text/plain, Size: 667 bytes --]
Excerpts from William Morgan's message of Wed Jan 19 16:38:11 +0100 2011:
> Reformatted excerpts from Sascha Silbe's message of 2011-01-18:
> > + unless File.exists?(backup_fn) && File.size(fn) == 0
>
> This line is giving me some problems when fn doesn't exist (e.g. when
> running sup-sync the first time without a config.yaml). Should it be
>
> File.exists?(backup_fn) && File.exists?(fn) && File.size(fn) == 0
>
> instead?
Yes, you're right. We shouldn't try to do a copy if the original doesn't
exist. Sorry for not testing that case.
Shall I send a fix-up patch?
Sascha
--
http://sascha.silbe.org/
http://www.infra-silbe.de/
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 500 bytes --]
[-- Attachment #2: Type: text/plain, Size: 143 bytes --]
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 16:42 ` Sascha Silbe
@ 2011-01-19 17:17 ` William Morgan
2011-01-19 18:44 ` Rich Lane
0 siblings, 1 reply; 10+ messages in thread
From: William Morgan @ 2011-01-19 17:17 UTC (permalink / raw)
To: sup-devel
Reformatted excerpts from Sascha Silbe's message of 2011-01-19:
> Shall I send a fix-up patch?
I can descend from the heavens and apply my fix to master directly,
unless Rich objects.
--
William <wmorgan-sup@masanjin.net>
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 15:38 ` William Morgan
2011-01-19 16:42 ` Sascha Silbe
@ 2011-01-19 17:19 ` William Morgan
2011-01-19 18:41 ` Ben Walton
1 sibling, 1 reply; 10+ messages in thread
From: William Morgan @ 2011-01-19 17:19 UTC (permalink / raw)
To: sup-devel
Reformatted excerpts from William Morgan's message of 2011-01-19:
> Reformatted excerpts from Sascha Silbe's message of 2011-01-18:
> > + unless File.exists?(backup_fn) && File.size(fn) == 0
>
> This line is giving me some problems when fn doesn't exist (e.g. when
> running sup-sync the first time without a config.yaml). Should it be
>
> File.exists?(backup_fn) && File.exists?(fn) && File.size(fn) == 0
>
> instead?
Actually, I think it should be:
if File.exists?(fn) && File.size(fn) > 0
Which has the advantage of actually working...
--
William <wmorgan-sup@masanjin.net>
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 17:19 ` William Morgan
@ 2011-01-19 18:41 ` Ben Walton
0 siblings, 0 replies; 10+ messages in thread
From: Ben Walton @ 2011-01-19 18:41 UTC (permalink / raw)
To: sup-devel
Excerpts from William Morgan's message of Wed Jan 19 12:19:11 -0500 2011:
> Actually, I think it should be:
>
> if File.exists?(fn) && File.size(fn) > 0
How about:
begin
fninf = File.stat(fn)
if fninf.size? ...
rescue Errno::ENOENT => e
...
end
I didn't look at the surrounding code so I'm not sure how to best
integrate this. The advantage is that you save one user->kernel space
traversal. Calling .exists? and .size via File results in two stat()
calls. Grabbing and saving the actual stat result on the first call
and then using them for further tests saves this. Not a huge
overhead, I admit...
HTH.
-Ben
--
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions
2011-01-19 17:17 ` William Morgan
@ 2011-01-19 18:44 ` Rich Lane
0 siblings, 0 replies; 10+ messages in thread
From: Rich Lane @ 2011-01-19 18:44 UTC (permalink / raw)
To: William Morgan; +Cc: sup-devel
Excerpts from William Morgan's message of Wed Jan 19 12:17:23 -0500 2011:
> Reformatted excerpts from Sascha Silbe's message of 2011-01-19:
> > Shall I send a fix-up patch?
>
> I can descend from the heavens and apply my fix to master directly,
> unless Rich objects.
Please do.
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-01-19 18:53 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-18 18:28 [sup-devel] [PATCH 1/2] ensure sources.yaml gets flushed to disk Sascha Silbe
2011-01-18 18:28 ` [sup-devel] [PATCH 2/2] {config, sources}.yaml: preserve symlinks and permissions Sascha Silbe
2011-01-19 3:41 ` Rich Lane
2011-01-19 10:05 ` Sascha Silbe
2011-01-19 15:38 ` William Morgan
2011-01-19 16:42 ` Sascha Silbe
2011-01-19 17:17 ` William Morgan
2011-01-19 18:44 ` Rich Lane
2011-01-19 17:19 ` William Morgan
2011-01-19 18:41 ` Ben Walton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox