Notes about supplementary groups and -z.
[rsync/rsync.git] / TODO
1 -*- indented-text -*-
2
3 BUGS ---------------------------------------------------------------
4
5 There seems to be a bug with hardlinks
6
7   mbp/2 build$ ls -l /tmp/a /tmp/b -i
8   /tmp/a:
9   total 32
10   2568307 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a1
11   2568307 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a2
12   2568307 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a3
13   2568310 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a4
14   2568310 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a5
15   2568310 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b1
16   2568310 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b2
17   2568310 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b3
18
19   /tmp/b:
20   total 32
21   2568309 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a1
22   2568309 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a2
23   2568309 -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a3
24   2568311 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a4
25   2568311 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a5
26   2568311 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b1
27   2568311 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b2
28   2568311 -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b3
29   mbp/2 build$ rm -r /tmp/b && ./rsync -avH /tmp/a/ /tmp/b
30   building file list ... done
31   created directory /tmp/b
32   ./
33   a1
34   a4
35   a2 => a1
36   a3 => a2
37   wrote 350 bytes  read 52 bytes  804.00 bytes/sec
38   total size is 232  speedup is 0.58
39   mbp/2 build$ rm -r /tmp/b
40   mbp/2 build$ ls -l /tmp/b
41   ls: /tmp/b: No such file or directory
42   mbp/2 build$ rm -r /tmp/b && ./rsync -avH /tmp/a/ /tmp/b
43   rm: cannot remove `/tmp/b': No such file or directory
44   mbp/2 build$ rm -f -r /tmp/b && ./rsync -avH /tmp/a/ /tmp/b
45   building file list ... done
46   created directory /tmp/b
47   ./
48   a1
49   a4
50   a2 => a1
51   a3 => a2
52   wrote 350 bytes  read 52 bytes  804.00 bytes/sec
53   total size is 232  speedup is 0.58
54   mbp/2 build$ ls -l /tmp/b
55   total 32
56   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a1
57   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a2
58   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a3
59   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a4
60   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a5
61   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b1
62   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b2
63   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b3
64   mbp/2 build$ ls -l /tmp/a
65   total 32
66   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a1
67   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a2
68   -rw-rw-r--    3 mbp      mbp            29 Mar 25 17:30 a3
69   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a4
70   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 a5
71   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b1
72   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b2
73   -rw-rw-r--    5 mbp      mbp            29 Mar 25 17:30 b3
74
75
76 Progress indicator can produce corrupt output when transferring directories:
77
78   main/binary-arm/
79   main/binary-arm/admin/
80   main/binary-arm/base/
81   main/binary-arm/comm/8.56kB/s    0:00:52
82   main/binary-arm/devel/
83   main/binary-arm/doc/
84   main/binary-arm/editors/
85   main/binary-arm/electronics/s    0:00:53
86   main/binary-arm/games/
87   main/binary-arm/graphics/
88   main/binary-arm/hamradio/
89   main/binary-arm/interpreters/
90   main/binary-arm/libs/6.61kB/s    0:00:54
91   main/binary-arm/mail/
92   main/binary-arm/math/
93   main/binary-arm/misc/
94
95 lchmod
96
97   I don't think we handle this properly on systems that don't have the
98   call.
99
100
101 DAEMON --------------------------------------------------------------
102
103 server-imposed bandwidth limits
104
105 rsyncd over ssh
106
107   There are already some patches to do this.
108
109   BitKeeper uses a server whose login shell is set to bkd.  That's
110   probably a reasonable approach.
111
112
113 FEATURES ------------------------------------------------------------
114
115
116 --dry-run is insufficiently dry
117
118   Mark Santcroos points out that -n fails to list files which have
119   only metadata changes, though it probably should.  
120
121   There may be a Debian bug about this as well.
122
123
124 use chroot
125
126   If the platform doesn't support it, then don't even try.
127
128   If running as non-root, then don't fail, just give a warning.
129   (There was a thread about this a while ago?)
130
131     http://lists.samba.org/pipermail/rsync/2001-August/thread.html
132     http://lists.samba.org/pipermail/rsync/2001-September/thread.html
133
134
135 --files-from
136
137   Avoids traversal.  Better option than a pile of --include statements
138   for people who want to generate the file list using a find(1)
139   command or a script.
140
141
142 supplementary groups
143
144   Perhaps allow supplementary groups to be specified in rsyncd.conf;
145   then make the first one the primary gid and all the rest be
146   supplementary gids.
147
148
149 File list structure in memory
150
151   Rather than one big array, perhaps have a tree in memory mirroring
152   the directory tree.  
153
154   This might make sorting much faster!  (I'm not sure it's a big CPU
155   problem, mind you.)  
156
157   It might also reduce memory use in storing repeated directory names
158   -- again I'm not sure this is a problem.
159
160 Performance
161
162   Traverse just one directory at a time.  Tridge says it's possible.
163
164   At the moment rsync reads the whole file list into memory at the
165   start, which makes us use a lot of memory and also not pipeline
166   network access as much as we could.
167
168
169 Handling duplicate names
170
171   We need to be careful of duplicate names getting into the file list.
172   See clean_flist().  This could happen if multiple arguments include
173   the same file.  Bad.
174
175   I think duplicates are only a problem if they're both flowing
176   through the pipeline at the same time.  For example we might have
177   updated the first occurrence after reading the checksums for the
178   second.  So possibly we just need to make sure that we don't have
179   both in the pipeline at the same time.  
180
181   Possibly if we did one directory at a time that would be sufficient.
182
183   Alternatively we could pre-process the arguments to make sure no
184   duplicates will ever be inserted.  There could be some bad cases
185   when we're collapsing symlinks.
186
187   We could have a hash table.
188
189   The root of the problem is that we do not want more than one file
190   list entry referring to the same file.  At first glance there are
191   several ways this could happen: symlinks, hardlinks, and repeated
192   names on the command line.
193
194   If names are repeated on the command line, they may be present in
195   different forms, perhaps by traversing directory paths in different
196   ways, traversing paths including symlinks.  Also we need to allow
197   for expansion of globs by rsync.
198
199   At the moment, clean_flist() requires having the entire file list in
200   memory.  Duplicate names are detected just by a string comparison.
201
202   We don't need to worry about hard links causing duplicates because
203   files are never updated in place.  Similarly for symlinks.
204
205   I think even if we're using a different symlink mode we don't need
206   to worry.
207
208   Unless we're really clever this will introduce a protocol
209   incompatibility, so we need to be able to accept the old format as
210   well.
211
212
213 Memory accounting
214
215   At exit, show how much memory was used for the file list, etc.
216
217   Also we do a wierd exponential-growth allocation in flist.c.  I'm
218   not sure this makes sense with modern mallocs.  At any rate it will
219   make us allocate a huge amount of memory for large file lists.
220
221
222 Hard-link handling
223
224   At the moment hardlink handling is very expensive, so it's off by
225   default.  It does not need to be so.  
226
227   Since most of the solutions are rather intertwined with the file
228   list it is probably better to fix that first, although fixing
229   hardlinks is possibly simpler.
230
231   We can rule out hardlinked directories since they will probably
232   screw us up in all kinds of ways.  They simply should not be used.
233
234   At the moment rsync only cares about hardlinks to regular files.  I
235   guess you could also use them for sockets, devices and other beasts,
236   but I have not seen them.
237
238   When trying to reproduce hard links, we only need to worry about
239   files that have more than one name (nlinks>1 && !S_ISDIR). 
240
241   The basic point of this is to discover alternate names that refer to
242   the same file.  All operations, including creating the file and
243   writing modifications to it need only to be done for the first name.
244   For all later names, we just create the link and then leave it
245   alone.
246
247   If hard links are to be preserved:
248
249     Before the generator/receiver fork, the list of files is received
250     from the sender (recv_file_list), and a table for detecting hard
251     links is built.
252
253     The generator looks for hard links within the file list and does
254     not send checksums for them, though it does send other metadata.
255
256     The sender sends the device number and inode with file entries, so
257     that files are uniquely identified.
258
259     The receiver goes through and creates hard links (do_hard_links)
260     after all data has been written, but before directory permissions
261     are set.
262
263   At the moment device and inum are sent as 4-byte integers, which
264   will probably cause problems on large filesystems.  On Linux the
265   kernel uses 64-bit ino_t's internally, and people will soon have
266   filesystems big enough to use them.  We ought to follow NFS4 in
267   using 64-bit device and inode identification, perhaps with a
268   protocol version bump.
269
270   Once we've seen all the names for a particular file, we no longer
271   need to think about it and we can deallocate the memory.
272
273   We can also have the case where there are links to a file that are
274   not in the tree being transferred.  There's nothing we can do about
275   that.  Because we rename the destination into place after writing,
276   any hardlinks to the old file are always going to be orphaned.  In
277   fact that is almost necessary because otherwise we'd get really
278   confused if we were generating checksums for one name of a file and
279   modifying another.
280
281   At the moment the code seems to make a whole second copy of the file
282   list, which seems unnecessary.
283
284   We should have a test case that exercises hard links.  Since it
285   might be hard to compare ./tls output where the inodes change we
286   might need a little program to check whether several names refer to
287   the same file.
288
289 IPv6
290
291   Implement suggestions from http://www.kame.net/newsletter/19980604/
292   and ftp://ftp.iij.ad.jp/pub/RFC/rfc2553.txt
293
294   If a host has multiple addresses, then listen try to connect to all
295   in order until we get through.  (getaddrinfo may return multiple
296   addresses.)  This is kind of implemented already.
297
298   Possibly also when starting as a server we may need to listen on
299   multiple passive addresses.  This might be a bit harder, because we
300   may need to select on all of them.  Hm.
301
302   Define a syntax for IPv6 literal addresses.  Since they include
303   colons, they tend to break most naming systems, including ours.
304   Based on the HTTP IPv6 syntax, I think we should use
305  
306      rsync://[::1]/foo/bar
307      [::1]::bar
308
309   which should just take a small change to the parser code.
310
311
312 Errors
313
314   If we hang or get SIGINT, then explain where we were up to.  Perhaps
315   have a static buffer that contains the current function name, or
316   some kind of description of what we were trying to do.  This is a
317   little easier on people than needing to run strace/truss.
318
319   "The dungeon collapses!  You are killed."  Rather than "unexpected
320   eof" give a message that is more detailed if possible and also more
321   helpful.  
322
323   If we get an error writing to a socket, then we should perhaps
324   continue trying to read to see if an error message comes across
325   explaining why the socket is closed.  I'm not sure if this would
326   work, but it would certainly make our messages more helpful.
327
328   What happens if a directory is missing -x attributes.  Do we lose
329   our load?  (Debian #28416)  Probably fixed now, but a test case
330   would be good.
331
332
333 File attributes
334
335   Device major/minor numbers should be at least 32 bits each.  See
336   http://lists.samba.org/pipermail/rsync/2001-November/005357.html
337
338   Transfer ACLs.  Need to think of a standard representation.
339   Probably better not to even try to convert between NT and POSIX.
340   Possibly can share some code with Samba.
341
342 Empty directories
343
344   With the current common --include '*/' --exclude '*' pattern, people
345   can end up with many empty directories.  We might avoid this by
346   lazily creating such directories.
347
348
349 zlib
350
351   Perhaps don't use our own zlib.  
352
353   Advantages:
354    
355     - will automatically be up to date with bugfixes in zlib
356
357     - can leave it out for small rsync on e.g. recovery disks
358
359     - can use a shared library
360
361     - avoids people breaking rsync by trying to do this themselves and
362       messing up
363
364   Should we ship zlib for systems that don't have it, or require
365   people to install it separately?
366
367   Apparently this will make us incompatible with versions of rsync
368   that use the patched version of rsync.  Probably the simplest way to
369   do this is to just disable gzip (with a warning) when talking to old
370   versions.
371
372   After we get the @RSYNCD greeting from the server, we know it's
373   version but we have not yet sent the command line, so we could just
374   remove the -z option if the server is too old.  
375
376   For ssh invocation it's not so simple, because we actually use the
377   command line to start the remote process.  However, we only actually
378   do compression in token.c, and we could therefore once we discover
379   the remote version emit an error if it's too old.  I'm not sure if
380   that's a good tradeoff or not.
381
382
383 proxy authentication
384
385   Allow RSYNC_PROXY to be http://user:pass@proxy.foo:3128/, and do
386   HTTP Basic Proxy-Authentication.  
387
388   Multiple schemes are possible, up to and including the insanity that
389   is NTLM, but Basic probably covers most cases.
390
391 SOCKS
392
393   Add --with-socks, and then perhaps a command-line option to put them
394   on or off.  This might be more reliable than LD_PRELOAD hacks.
395
396 Better statistics:
397
398   <Rasmus> mbp: hey, how about an rsync option that just gives you the
399   summary without the list of files?  And perhaps gives more
400   information like the number of new files, number of changed,
401   deleted, etc. ?
402   <mbp> Rasmus: nice idea
403   <mbp> there is --stats
404   <mbp> but at the moment it's very tridge-oriented
405   <mbp> rather than user-friendly
406   <mbp> it would be nice to improve it
407   <mbp> that would also work well with --dryrun
408
409 TDB:
410
411   Rather than storing the file list in memory, store it in a TDB.
412
413   This *might* make memory usage lower while building the file list.
414
415   Hashtable lookup will mean files are not transmitted in order,
416   though... hm.
417
418   This would neatly eliminate one of the major post-fork shared data
419   structures.
420
421
422 chmod:
423
424   On 12 Mar 2002, Dave Dykstra <dwd@bell-labs.com> wrote:
425   > If we would add an option to do that functionality, I would vote for one
426   > that was more general which could mask off any set of permission bits and
427   > possibly add any set of bits.  Perhaps a chmod-like syntax if it could be
428   > implemented simply.
429
430   I think that would be good too.  For example, people uploading files   
431   to a web server might like to say
432
433   rsync -avzP --chmod a+rX ./ sourcefrog.net:/home/www/sourcefrog/
434
435   Ideally the patch would implement as many of the gnu chmod semantics
436   as possible.  I think the mode parser should be a separate function
437   that passes back something like (mask,set) description to the rest of
438   the program.  For bonus points there would be a test case for the  
439   parser.
440
441   (Debian #23628)
442
443
444 --diff
445
446   Allow people to specify the diff command.  (Might want to use wdiff,
447   gnudiff, etc.)
448
449   Just diff the temporary file with the destination file, and delete
450   the tmp file rather than moving it into place.
451
452   Interaction with --partial.
453
454   Security interactions with daemon mode?
455
456   (Suggestion from david.e.sewell)
457
458
459 Incorrect timestamps (Debian #100295)
460
461   A bit hard to believe, but apparently it happens.
462
463
464 Check "refuse options works"
465
466   We need a test case for this...
467
468   Was this broken when we changed to popt?
469
470
471 PERFORMANCE ----------------------------------------------------------
472
473 MD4 file_sum
474
475   If we're doing a local transfer, or using -W, then perhaps don't
476   send the file checksum.  If we're doing a local transfer, then
477   calculating MD4 checksums uses 90% of CPU and is unlikely to be
478   useful.
479
480   Indeed for transfers over zlib or ssh we can also rely on the
481   transport to have quite strong protection against corruption.
482
483   Perhaps we should have an option to disable this, analogous to
484   --whole-file, although it would default to disabled.  The file
485   checksum takes up a definite space in the protocol -- we can either
486   set it to 0, or perhaps just leave it out.
487
488 MD4
489
490   Perhaps borrow an assembler MD4 from someone?
491
492   Make sure we call MD4 with properly-sized blocks whenever possible
493   to avoid copying into the residue region?
494
495 String area code
496
497   Test whether this is actually faster than just using malloc().  If
498   it's not (anymore), throw it out.
499           
500
501
502 PLATFORMS ------------------------------------------------------------
503
504 Win32
505
506   Don't detach, because this messes up --srvany.
507
508   http://sources.redhat.com/ml/cygwin/2001-08/msg00234.html
509
510   According to "Effective TCP/IP Programming" (??) close() on a socket
511   has incorrect behaviour on Windows -- it sends a RST packet to the
512   other side, which gives a "connection reset by peer" error.  On that
513   platform we should probably do shutdown() instead.  However, on Unix
514   we are correct to call close(), because shutdown() discards
515   untransmitted data.
516
517 DEVELOPMENT ----------------------------------------------------------
518
519 Splint
520
521   Build rsync with SPLINT to try to find security holes.  Add
522   annotations as necessary.  Keep track of the number of warnings
523   found initially, and see how many of them are real bugs, or real
524   security bugs.  Knowing the percentage of likely hits would be
525   really interesting for other projects.
526
527 Torture test
528
529   Something that just keeps running rsync continuously over a data set
530   likely to generate problems.
531
532 Cross-testing
533
534   Run current rsync versions against significant past releases.
535
536 Memory debugger
537
538   jra recommends Valgrind:
539
540     http://devel-home.kde.org/~sewardj/
541
542 TESTING --------------------------------------------------------------
543
544 Cross-test versions
545
546   Part of the regression suite should be making sure that we don't
547   break backwards compatibility: old clients vs new servers and so
548   on.  Ideally we would test the cross product of versions.  
549
550   It might be sufficient to test downloads from well-known public
551   rsync servers running different versions of rsync.  This will give
552   some testing and also be the most common case for having different
553   versions and not being able to upgrade.
554
555 Test large files
556
557   Sparse and non-sparse
558
559 Mutator program
560
561   Insert bytes, delete bytes, swap blocks, ...
562
563 configure option to enable dangerous tests
564
565 If tests are skipped, say why.
566
567 Test daemon feature to disallow particular options.
568
569 Pipe program that makes slow/jerky connections.
570
571 Versions of read() and write() that corrupt the stream, or abruptly fail
572
573 Separate makefile target to run rough tests -- or perhaps just run
574 them every time?
575
576
577 DOCUMENTATION --------------------------------------------------------
578
579 Update README
580
581 Keep list of open issues and todos on the web site
582
583 Update web site from CVS
584
585 BUILD FARM -----------------------------------------------------------
586
587 Add machines
588
589   AMDAHL UTS (Dave Dykstra)
590
591   Cygwin (on different versions of Win32?)
592
593   HP-UX variants (via HP?)
594
595   SCO
596
597
598 LOGGING --------------------------------------------------------------
599
600   Perhaps flush stdout after each filename, so that people trying to
601   monitor progress in a log file can do so more easily.  See
602   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108
603
604   At the connections that just get a list of modules are not logged,
605   but they should be.
606
607   If a child of the rsync daemon dies with a signal, we should notice
608   that when we reap it and log a message.
609
610   Keep stderr and stdout properly separated (Debian #23626)
611
612   Use a separate function for reporting errors; prefix it with
613   "rsync:" or "rsync(remote)", or perhaps even "rsync(local
614   generator): ".
615
616 verbose output
617   
618   Indicate whether files are new, updated, or deleted
619
620   At end of transfer, show how many files were or were not transferred
621   correctly.
622
623 -vv
624
625   Explain *why* every file is transferred or not (e.g. "local mtime
626   123123 newer than 1283198")
627
628
629 debugging of daemon
630
631   Add an rsyncd.conf parameter to turn on debugging on the server.
632
633
634
635 NICE -----------------------------------------------------------------
636
637 --no-detach and --no-fork options
638
639   Very useful for debugging.  Also good when running under a
640   daemon-monitoring process that tries to restart the service when the
641   parent exits.
642
643 hang/timeout friendliness
644
645 internationalization
646
647   Change to using gettext().  Probably need to ship this for platforms
648   that don't have it.  
649
650   Solicit translations.
651
652   Does anyone care?  Before we bother modifying the code, we ought to
653   get the manual translated first, because that's possibly more useful
654   and at any rate demonstrates desire.
655
656
657 rsyncsh 
658
659    Write a small emulation of interactive ftp as a Pythonn program
660    that calls rsync.  Commands such as "cd", "ls", "ls *.c" etc map
661    fairly directly into rsync commands: it just needs to remember the
662    current host, directory and so on.  We can probably even do
663    completion of remote filenames.