Removed some obsolete items.
[rsync.git] / TODO
blobe876ee571b7103f9745a9e26e80036995c3a89d8
1 -*- indented-text -*-
3 BUGS ---------------------------------------------------------------
5 There seems to be a bug with hardlinks
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
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
76 Progress indicator can produce corrupt output when transferring directories:
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/
96 lchmod
97   I don't think we handle this properly on systems that don't have the
98   call.  Are there any such?
101 Cross-test versions
102   Part of the regression suite should be making sure that we don't
103   break backwards compatibility: old clients vs new servers and so
104   on.  Ideally we would test the cross product of versions.  
106   It might be sufficient to test downloads from well-known public
107   rsync servers running different versions of rsync.  This will give
108   some testing and also be the most common case for having different
109   versions and not being able to upgrade.
111 Do not rely on having a group called "nobody"
113   http://www.linuxbase.org/spec/refspecs/LSB_1.1.0/gLSB/usernames.html
115   On Debian it's "nogroup"
117 DAEMON --------------------------------------------------------------
119 server-imposed bandwidth limits
121 rsyncd over ssh
123   There are already some patches to do this.
125   BitKeeper uses a server whose login shell is set to bkd.  That's
126   probably a reasonable approach.
129 FEATURES ------------------------------------------------------------
132 --dry-run is too dry
134   Mark Santcroos points out that -n fails to list files which have
135   only metadata changes, though it probably should.
137   There may be a Debian bug about this as well.
140 use chroot
142   If the platform doesn't support it, then don't even try.
144   If running as non-root, then don't fail, just give a warning.
145   (There was a thread about this a while ago?)
147     http://lists.samba.org/pipermail/rsync/2001-August/thread.html
148     http://lists.samba.org/pipermail/rsync/2001-September/thread.html
151 supplementary groups
153   Perhaps allow supplementary groups to be specified in rsyncd.conf;
154   then make the first one the primary gid and all the rest be
155   supplementary gids.
158 File list structure in memory
160   Rather than one big array, perhaps have a tree in memory mirroring
161   the directory tree.
163   This might make sorting much faster!  (I'm not sure it's a big CPU
164   problem, mind you.)
166   It might also reduce memory use in storing repeated directory names
167 -- again I'm not sure this is a problem.
169 Performance
171   Traverse just one directory at a time.  Tridge says it's possible.
173   At the moment rsync reads the whole file list into memory at the
174   start, which makes us use a lot of memory and also not pipeline
175   network access as much as we could.
178 Handling duplicate names
180   We need to be careful of duplicate names getting into the file list.
181   See clean_flist().  This could happen if multiple arguments include
182   the same file.  Bad.
184   I think duplicates are only a problem if they're both flowing
185   through the pipeline at the same time.  For example we might have
186   updated the first occurrence after reading the checksums for the
187   second.  So possibly we just need to make sure that we don't have
188   both in the pipeline at the same time.
190   Possibly if we did one directory at a time that would be sufficient.
192   Alternatively we could pre-process the arguments to make sure no
193   duplicates will ever be inserted.  There could be some bad cases
194   when we're collapsing symlinks.
196   We could have a hash table.
198   The root of the problem is that we do not want more than one file
199   list entry referring to the same file.  At first glance there are
200   several ways this could happen: symlinks, hardlinks, and repeated
201   names on the command line.
203   If names are repeated on the command line, they may be present in
204   different forms, perhaps by traversing directory paths in different
205   ways, traversing paths including symlinks.  Also we need to allow
206   for expansion of globs by rsync.
208   At the moment, clean_flist() requires having the entire file list in
209   memory.  Duplicate names are detected just by a string comparison.
211   We don't need to worry about hard links causing duplicates because
212   files are never updated in place.  Similarly for symlinks.
214   I think even if we're using a different symlink mode we don't need
215   to worry.
217   Unless we're really clever this will introduce a protocol
218   incompatibility, so we need to be able to accept the old format as
219   well.
222 Memory accounting
224   At exit, show how much memory was used for the file list, etc.
226   Also we do a wierd exponential-growth allocation in flist.c.  I'm
227   not sure this makes sense with modern mallocs.  At any rate it will
228   make us allocate a huge amount of memory for large file lists.
231 Hard-link handling
233   At the moment hardlink handling is very expensive, so it's off by
234   default.  It does not need to be so.
236   Since most of the solutions are rather intertwined with the file
237   list it is probably better to fix that first, although fixing
238   hardlinks is possibly simpler.
240   We can rule out hardlinked directories since they will probably
241   screw us up in all kinds of ways.  They simply should not be used.
243   At the moment rsync only cares about hardlinks to regular files.  I
244   guess you could also use them for sockets, devices and other beasts,
245   but I have not seen them.
247   When trying to reproduce hard links, we only need to worry about
248   files that have more than one name (nlinks>1 && !S_ISDIR).
250   The basic point of this is to discover alternate names that refer to
251   the same file.  All operations, including creating the file and
252   writing modifications to it need only to be done for the first name.
253   For all later names, we just create the link and then leave it
254   alone.
256   If hard links are to be preserved:
258     Before the generator/receiver fork, the list of files is received
259     from the sender (recv_file_list), and a table for detecting hard
260     links is built.
262     The generator looks for hard links within the file list and does
263     not send checksums for them, though it does send other metadata.
265     The sender sends the device number and inode with file entries, so
266     that files are uniquely identified.
268     The receiver goes through and creates hard links (do_hard_links)
269     after all data has been written, but before directory permissions
270     are set.
272   At the moment device and inum are sent as 4-byte integers, which
273   will probably cause problems on large filesystems.  On Linux the
274   kernel uses 64-bit ino_t's internally, and people will soon have
275   filesystems big enough to use them.  We ought to follow NFS4 in
276   using 64-bit device and inode identification, perhaps with a
277   protocol version bump.
279   Once we've seen all the names for a particular file, we no longer
280   need to think about it and we can deallocate the memory.
282   We can also have the case where there are links to a file that are
283   not in the tree being transferred.  There's nothing we can do about
284   that.  Because we rename the destination into place after writing,
285   any hardlinks to the old file are always going to be orphaned.  In
286   fact that is almost necessary because otherwise we'd get really
287   confused if we were generating checksums for one name of a file and
288   modifying another.
290   At the moment the code seems to make a whole second copy of the file
291   list, which seems unnecessary.
293   We should have a test case that exercises hard links.  Since it
294   might be hard to compare ./tls output where the inodes change we
295   might need a little program to check whether several names refer to
296   the same file.
300 Handling IPv6 on old machines
302   The KAME IPv6 patch is nice in theory but has proved a bit of a
303   nightmare in practice.  The basic idea of their patch is that rsync
304   is rewritten to use the new getaddrinfo()/getnameinfo() interface,
305   rather than gethostbyname()/gethostbyaddr() as in rsync 2.4.6.
306   Systems that don't have the new interface are handled by providing
307   our own implementation in lib/, which is selectively linked in.
309   The problem with this is that it is really hard to get right on
310   platforms that have a half-working implementation, so redefining
311   these functions clashes with system headers, and leaving them out
312   breaks.  This affects at least OSF/1, RedHat 5, and Cobalt, which
313   are moderately improtant.
315   Perhaps the simplest solution would be to have two different files
316   implementing the same interface, and choose either the new or the
317   old API.  This is probably necessary for systems that e.g. have
318   IPv6, but gethostbyaddr() can't handle it.  The Linux manpage claims
319   this is currently the case.
321   In fact, our internal sockets interface (things like
322   open_socket_out(), etc) is much narrower than the getaddrinfo()
323   interface, and so probably simpler to get right.  In addition, the
324   old code is known to work well on old machines.
326   We could drop the rather large lib/getaddrinfo files.
329 Other IPv6 stuff:
330   
331   Implement suggestions from http://www.kame.net/newsletter/19980604/
332   and ftp://ftp.iij.ad.jp/pub/RFC/rfc2553.txt
334   If a host has multiple addresses, then listen try to connect to all
335   in order until we get through.  (getaddrinfo may return multiple
336   addresses.)  This is kind of implemented already.
338   Possibly also when starting as a server we may need to listen on
339   multiple passive addresses.  This might be a bit harder, because we
340   may need to select on all of them.  Hm.
342   Define a syntax for IPv6 literal addresses.  Since they include
343   colons, they tend to break most naming systems, including ours.
344   Based on the HTTP IPv6 syntax, I think we should use
346      rsync://[::1]/foo/bar [::1]::bar
348   which should just take a small change to the parser code.
351 Errors
353   If we hang or get SIGINT, then explain where we were up to.  Perhaps
354   have a static buffer that contains the current function name, or
355   some kind of description of what we were trying to do.  This is a
356   little easier on people than needing to run strace/truss.
358   "The dungeon collapses!  You are killed."  Rather than "unexpected
359   eof" give a message that is more detailed if possible and also more
360   helpful.
362   If we get an error writing to a socket, then we should perhaps
363   continue trying to read to see if an error message comes across
364   explaining why the socket is closed.  I'm not sure if this would
365   work, but it would certainly make our messages more helpful.
367   What happens if a directory is missing -x attributes.  Do we lose
368   our load?  (Debian #28416) Probably fixed now, but a test case would
369   be good.
372 File attributes
374   Transfer ACLs.  Need to think of a standard representation.
375   Probably better not to even try to convert between NT and POSIX.
376   Possibly can share some code with Samba.
378 Empty directories
380   With the current common --include '*/' --exclude '*' pattern, people
381   can end up with many empty directories.  We might avoid this by
382   lazily creating such directories.
385 zlib
387   Perhaps don't use our own zlib.
389   Advantages:
390    
391     - will automatically be up to date with bugfixes in zlib
393     - can leave it out for small rsync on e.g. recovery disks
395     - can use a shared library
397     - avoids people breaking rsync by trying to do this themselves and
398       messing up
400   Should we ship zlib for systems that don't have it, or require
401   people to install it separately?
403   Apparently this will make us incompatible with versions of rsync
404   that use the patched version of rsync.  Probably the simplest way to
405   do this is to just disable gzip (with a warning) when talking to old
406   versions.
409 logging
411   Perhaps flush stdout after each filename, so that people trying to
412   monitor progress in a log file can do so more easily.  See
413   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108
415   At the connections that just get a list of modules are not logged,
416   but they should be.
418   If a child of the rsync daemon dies with a signal, we should notice
419   that when we reap it and log a message.
421   Keep stderr and stdout properly separated (Debian #23626)
423   After we get the @RSYNCD greeting from the server, we know it's
424   version but we have not yet sent the command line, so we could just
425   remove the -z option if the server is too old.
427   For ssh invocation it's not so simple, because we actually use the
428   command line to start the remote process.  However, we only actually
429   do compression in token.c, and we could therefore once we discover
430   the remote version emit an error if it's too old.  I'm not sure if
431   that's a good tradeoff or not.
434 proxy authentication
436   Allow RSYNC_PROXY to be http://user:pass@proxy.foo:3128/, and do
437   HTTP Basic Proxy-Authentication.
439   Multiple schemes are possible, up to and including the insanity that
440   is NTLM, but Basic probably covers most cases.
442 SOCKS
444   Add --with-socks, and then perhaps a command-line option to put them
445   on or off.  This might be more reliable than LD_PRELOAD hacks.
447 FAT support
449   rsync to a FAT partition on a Unix machine doesn't work very well at
450   the moment.  I think we get errors about invalid filenames and
451   perhaps also trying to do atomic renames.
453   I guess the code to do this is currently #ifdef'd on Windows;
454   perhaps we ought to intelligently fall back to it on Unix too.
457 Better statistics:
459   <Rasmus> mbp: hey, how about an rsync option that just gives you the
460   summary without the list of files?  And perhaps gives more
461   information like the number of new files, number of changed,
462   deleted, etc. ?  <mbp> Rasmus: nice idea <mbp> there is --stats
463   <mbp> but at the moment it's very tridge-oriented <mbp> rather than
464   user-friendly <mbp> it would be nice to improve it <mbp> that would
465   also work well with --dryrun
467 TDB:
469   Rather than storing the file list in memory, store it in a TDB.
471   This *might* make memory usage lower while building the file list.
473   Hashtable lookup will mean files are not transmitted in order,
474   though... hm.
476   This would neatly eliminate one of the major post-fork shared data
477   structures.
480 chmod:
482   On 12 Mar 2002, Dave Dykstra <dwd@bell-labs.com> wrote: > If we
483 would add an option to do that functionality, I would vote for one >
484 that was more general which could mask off any set of permission bits
485 and > possibly add any set of bits.  Perhaps a chmod-like syntax if it
486 could be > implemented simply.
488   I think that would be good too.  For example, people uploading files
489   to a web server might like to say
491   rsync -avzP --chmod a+rX ./ sourcefrog.net:/home/www/sourcefrog/
493   Ideally the patch would implement as many of the gnu chmod semantics
494   as possible.  I think the mode parser should be a separate function
495   that passes back something like (mask,set) description to the rest
496   of the program.  For bonus points there would be a test case for the
497   parser.
499   Possibly also --chown
501   (Debian #23628)
504 --diff
506   Allow people to specify the diff command.  (Might want to use wdiff,
507   gnudiff, etc.)
509   Just diff the temporary file with the destination file, and delete
510   the tmp file rather than moving it into place.
512   Interaction with --partial.
514   Security interactions with daemon mode?
516   (Suggestion from david.e.sewell)
519 Incorrect timestamps (Debian #100295)
521   A bit hard to believe, but apparently it happens.
524 Check "refuse options works"
526   We need a test case for this...
528   Was this broken when we changed to popt?
531 PERFORMANCE ----------------------------------------------------------
533 MD4 file_sum
535   If we're doing a local transfer, or using -W, then perhaps don't
536   send the file checksum.  If we're doing a local transfer, then
537   calculating MD4 checksums uses 90% of CPU and is unlikely to be
538   useful.
540   Indeed for transfers over zlib or ssh we can also rely on the
541   transport to have quite strong protection against corruption.
543   Perhaps we should have an option to disable this, analogous to
544 --whole-file, although it would default to disabled.  The file
545 checksum takes up a definite space in the protocol -- we can either
546 set it to 0, or perhaps just leave it out.
550   Perhaps borrow an assembler MD4 from someone?
552   Make sure we call MD4 with properly-sized blocks whenever possible
553   to avoid copying into the residue region?
555 String area code
557   Test whether this is actually faster than just using malloc().  If
558   it's not (anymore), throw it out.
559           
561 PLATFORMS ------------------------------------------------------------
563 Win32
565   Don't detach, because this messes up --srvany.
567   http://sources.redhat.com/ml/cygwin/2001-08/msg00234.html
570 DEVELOPMENT ----------------------------------------------------------
572 Splint
574   Build rsync with SPLINT to try to find security holes.  Add
575   annotations as necessary.  Keep track of the number of warnings
576   found initially, and see how many of them are real bugs, or real
577   security bugs.  Knowing the percentage of likely hits would be
578   really interesting for other projects.
580 Torture test
582   Something that just keeps running rsync continuously over a data set
583   likely to generate problems.
585 Cross-testing
587   Run current rsync versions against significant past releases.
589 Memory debugger
591   jra recommends Valgrind:
593     http://devel-home.kde.org/~sewardj/
595 Release script
596   
597   Update spec files
599   Build tar file; upload
601   Send announcement to mailing list and c.o.l.a.
602   
603   Make freshmeat announcement
605   Update web site
609 TESTING --------------------------------------------------------------
611 Cross-test versions
613   Part of the regression suite should be making sure that we don't
614   break backwards compatibility: old clients vs new servers and so on.
615   Ideally we would test both up and down from the current release to
616   all old versions.
618   We might need to omit broken old versions, or versions in which
619   particular functionality is broken
621   It might be sufficient to test downloads from well-known public
622   rsync servers running different versions of rsync.  This will give
623   some testing and also be the most common case for having different
624   versions and not being able to upgrade.
627 Test on kernel source
629   Download all versions of kernel; unpack, sync between them.  Also
630   sync between uncompressed tarballs.  Compare directories after
631   transfer.
633   Use local mode; ssh; daemon; --whole-file and --no-whole-file.
635   Use awk to pull out the 'speedup' number for each transfer.  Make
636   sure it is >= x.
639 Test large files
641   Sparse and non-sparse
643 Mutator program
645   Insert bytes, delete bytes, swap blocks, ...
647 configure option to enable dangerous tests
649 If tests are skipped, say why.
651 Test daemon feature to disallow particular options.
653 Pipe program that makes slow/jerky connections.
655 Versions of read() and write() that corrupt the stream, or abruptly
656 fail
658 Separate makefile target to run rough tests -- or perhaps just run
659 them every time?
661 Test "refuse options" works
663   What about for --recursive?
665   If you specify an unrecognized option here, you should get an error.
668 DOCUMENTATION --------------------------------------------------------
670 Update README
672 Keep list of open issues and todos on the web site
674 Update web site from CVS
677 Perhaps redo manual as SGML
679   The man page is getting rather large, and there is more information
680   that ought to be added.
682   TexInfo source is probably a dying format.
684   Linuxdoc looks like the most likely contender.  I know DocBook is
685   favoured by some people, but it's so bloody verbose, even with emacs
686   support.
689 BUILD FARM -----------------------------------------------------------
691 Add machines
693   Cygwin (on different versions of Win32?)
695   HP-UX variants (via HP?)
697   SCO
700 LOGGING --------------------------------------------------------------
702   Perhaps flush stdout after each filename, so that people trying to
703   monitor progress in a log file can do so more easily.  See
704   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108
706   At the connections that just get a list of modules are not logged,
707   but they should be.
709   If a child of the rsync daemon dies with a signal, we should notice
710   that when we reap it and log a message.
712   Keep stderr and stdout properly separated (Debian #23626)
714   Use a separate function for reporting errors; prefix it with
715   "rsync:" or "rsync(remote)", or perhaps even "rsync(local
716   generator): ".
718 verbose output
719   
720   Indicate whether files are new, updated, or deleted
722   At end of transfer, show how many files were or were not transferred
723   correctly.
727   Explain *why* every file is transferred or not (e.g. "local mtime
728   123123 newer than 1283198")
731 debugging of daemon
733   Add an rsyncd.conf parameter to turn on debugging on the server.
737 NICE -----------------------------------------------------------------
739 --no-detach and --no-fork options
741   Very useful for debugging.  Also good when running under a
742   daemon-monitoring process that tries to restart the service when the
743   parent exits.
745 hang/timeout friendliness
747 internationalization
749   Change to using gettext().  Probably need to ship this for platforms
750   that don't have it.
752   Solicit translations.
754   Does anyone care?  Before we bother modifying the code, we ought to
755   get the manual translated first, because that's possibly more useful
756   and at any rate demonstrates desire.
758 rsyncsh
760    Write a small emulation of interactive ftp as a Pythonn program
761    that calls rsync.  Commands such as "cd", "ls", "ls *.c" etc map
762    fairly directly into rsync commands: it just needs to remember the
763    current host, directory and so on.  We can probably even do
764    completion of remote filenames.
767 RELATED PROJECTS -----------------------------------------------------
769 http://rsync.samba.org/rsync-and-debian/
771 rsyncable gzip patch
773   Exhaustive, tortuous testing
775   Cleanups?
777 rsyncsplit as alternative to real integration with gzip?
779 reverse rsync over HTTP Range
781   Goswin Brederlow suggested this on Debian; I think tridge and I
782   talked about it previous in relation to rproxy.