* version 1.1.0 released 2005-11-22 This is a new, development branch of mod_spin and is therefore experimental code. Code _may_ change significantly as we go toward 1.2.0 release, so don't count on things being there in the next development release. ** new development branch ** use multi-env libapreq2 (2.06 and above) ** replace req and jar with apreq handle in the context ** introduce rxv_spin_prepare() callback ** rename SpinAppEntry configuration parameter to SpinAppService ** add SpinAppPrepare configuration parameter ** do away with pre-connection hook ** rename spin directory to src ** don't fail install if mod_spin.m4 cannot be installed ** use flex-reentrant if available ** check for ap_regex headers ** use --include instead of --cflags for newer mysql_config ** use Bitstream fonts in doxygen.css ** make GCC 4.0 complain less ** fix incorrect AC_PATH_PROG calls ** introduce size and index references ** introduce regex, literal, numeric and modulo conditionals ** remove SpinClearCount configuration directive ** add SpinTemplateCache configuration directive ** link apr, apr-util, apreq2 and rxv_spin libs explicitly ** add SpinConnPool configuration directive ** add RXV_SPIN_CONFIG_NICE for making config.nice ** check for inode change on the template ** conditional use of flex and bison * version 1.0.9 released 2005-04-04 ** make it compile and run with Apache 2.1.x and APR 1.1.x ** fake ap_construct_url() in spin.c for testing ** split up M4 macros into separate, installable file ** extend rxv_spin-config with docdir ** process doxygen.conf and mod_spin.spec with configure * version 1.0.8 released 2005-01-29 ** use ap_discard_request_body() in handler * version 1.0.7 released 2005-01-24 ** fix crummy md5b64_validate() code ** get rid of the strcpy() calls ** improve RPM spec file * version 1.0.6 released 2005-01-13 ** fix SpinCookie/SpinSalt documentation ** add salt rotation functionality ** actually use salt in MD5 hashing ** mention SELinux installation * version 1.0.5 released 2004-12-23 This release has emphasis on security. It is also the first version to use mod_unique_id for session tracking, rather than mod_usertrack. Note that cookies are now served directly by mod_spin. A new configuration parameter, SpinSalt, is used to introduce an unknown into the creation of session id MD5 hashes, thus preventing theft of sessions and (some) denial of service attacks. Application and session tracking now requires a private directory and mod_spin refuses to use the files if the directory is not read/write by owner only or if it's a symlink. ** SECURITY: check session/application store path/permissions ** SECURITY: use mod_unique_id for session IDs ** SECURITY: add MD5 hashes of session IDs ** handle session cookies from within mod_spin ** introduce SpinSalt configuration parameter ** make clearcnt configuration parameter work ** drop SpinBasename configuration parameter ** introduce rxv_spin_ses_idget() function ** introduce rxv_spin_ses_valid() function ** make sessions optional * version 1.0.4 released 2004-10-12 ** provide FC version in the RPM release * version 1.0.3 released 2004-09-23 ** fix bogus installdox logic * version 1.0.2 released 2004-09-21 Note that in this version there has been a rework of connection pool functionality. The whole thing has been made more generic, so that other connection types can be registered with the pool, not just database ones. The rxv_spin_conn_t has one extra member, the cleanup function, so, you will HAVE TO RECOMPILE YOUR APPLICATIONS, because this version is obviously BINARY INCOMPATIBLE WITH PREVIOUS VERSIONS. Also, the symbol for rxv_spin_db_pool_create() function no longer exists in the library. It has been replaced with rxv_spin_cpool_create(). However, compatibility macros have been defined throughout, so recompilation should go smoothly. ** move connection pools into a separate module ** make rxv_spin_db_pool_* legacy ** make rxv_spin_db_conn and rxv_spin_db_conn_t legacy ** make connection keys case sensitive ** untie connection macros from database functionality ** use request pool where possible to reduce memory pressure ** fix redundant PQclear() call ** add cleanup function to rxv_spin_conn_t ** ship eatdoxygen.c ** avoid copying of context data to reduce memory pressure * version 1.0.1 released 2004-08-10 ** move rxv_spin_service_t back into rxv_spin.h for docs ** fix bogus tag file logic * version 1.0.0 released 2004-08-04 This is the first `stable' release of mod_spin. For the most part, I would prefer to describe it as `useful', since one can actually have applications that run mostly correct and perform reasonably well inside the mod_spin framework. As with any software, I'm sure there are bugs in this code too. How many, only the time and a lot of use will tell. So, please, if you do find them, let me know. Contrary to what many software projects do, I do not have plans for near future development releases of mod_spin. I'll be focusing more on two things: 1. That the code of mod_spin is stable, secure and performs well. 2. Some useful mod_spin applications. As I find time, I will experiment with mod_spin inside the current development version of Apache, 2.1. After all, that's where the future is :-) ** delay XML parser cleanup until the end of the request ** fix possible segfaults with apr_pool_cleanup_register() ** remove rxv_spin_db_clean() function ** remove rxv_spin_db_pool_destroy() function ** remove rxv_spin_db_finish_do() function ** use pool cleanups for database stuff ** remove bogus child cleanups ** rxv_spin_ctx_t: shorthand for rxv_spin_context_t ** improve logging of critical events ** generate Doxygen tag file ** reference external documentation ** change Doxyfile to doxygen.conf and make clearer ** add database type enquiry macros ** move rxv_spin_service_t into private.h ** fix missing tag files * version 0.9.13 released 2004-06-20 This version features major performance improvements, especially if the applications you're using are pulling in large or many shared libraries. However, in order to reliably reload applications when new versions are deployed, a graceful restart of Apache is now required. A configuration script, rxv_spin-config, has been introduced in this version, to allow easy collection of mod_spin installation directory locations. You can enquire about prefix, bindir, libdir, libexecdir and includedir. This is useful for configuration of mod_spin applications. IMPORTANT: This version (and all future versions) depend on apreq2-config script being properly installed. As of libapreq2-2.03_04, this is not the case (unless you installed one of my RPMs). So, you'll have to make sure apreq2-config is copied into the correct location for mod_spin to build from source (this is normally /usr/local/apache2/bin or /usr/bin, depending on how you installed libapreq2). ** fix library installation text ** cache dynamically loaded libraries ** fix linking against librxv_spin ** use apreq2-config ** make rxv_spin-config script * version 0.9.12 released 2004-06-10 ** split into mod_spin and librxv_spin ** fix static linking into Apache ** move RXV_SPIN_MAX_DEPTH into private.h * version 0.9.11 released 2004-05-28 ** size fix for rxv_spin_rows() ** use apr_pcalloc() instead of apr_palloc()/memset() * version 0.9.10 released 2004-05-27 ** reference processing fix * version 0.9.9 released 2004-05-24 ** macro name cleanup * version 0.9.8 released 2004-05-18 ** new function: rxv_spin_single_mem() ** new function: rxv_spin_single_memset() ** more paranoia about NULL pointers ** avoid corner case database connection leak ** delay cleanup until the end of the request * version 0.9.7 released 2004-05-14 IMPORTANT: As of this release, single data will always have a '\0' character appended to it. This is useful for passing this data to regular C APIs that handle strings that are terminated in such manner. If you have your own functions that create single data, you will have to adjust them to behave like this or you'll be EXPOSING YOU APPLICATIONS TO BUFFER OVERFLOWS. In this version a lot of the data manipulation function changed their names. To avoid incompatibilities, relevant macros have been defined in rxv_spin.h. However, those compatibility macros may be removed at any time. If you have code that uses old functions, it is best to rename. The rxv_spin_column_markeach() function has been replaced by a function that has an extra parameter, so when changing, take that into account. This new parameter is offset. The compatibility macro defines it as zero (0), which was the behaviour of the old function. ** fix wrong URL in spec file ** new function: rxv_spin_meta_parse() ** new function: rxv_spin_meta_hash() ** new function: rxv_spin_rows_select() ** new function: rxv_spin_rows_hash() ** new function: rxv_spin_rows_mark() ** new function: rxv_spin_rows_markeach() ** new function: rxv_spin_single_trim() ** renamed various data functions ** improve rxv_spin_*_markeach() functions ** make the test file real XHTML ** new function: rxv_spin_str_trim() ** change how singles are stored * version 0.9.6 released 2000-04-14 ** additional APXS check ** do with/without/enable/disable properly ** avoid copying of SQL results ** new function: rxv_spin_resize() ** refine non-pooled database connection cleanup ** new function: rxv_spin_db_clean() ** avoid destroying the brigade, cleanup will do it * version 0.9.5 released 2004-04-07 ** make SpinClearCount global only directive ** make sendfile and text cache flags template specific ** fix incorrect int return from child_init() ** add CFLAGS from apr-config ** improve important program tests ** remove application specific configuration from spin.conf ** expand dynamic linking licensing exception ** adjust RPM spec file * version 0.9.4 released 2004-04-01 For all the negative thinking folk out there :-), mod_spin now understands #unless, direct opposite of #if. Seriously, I thought there could be instances where one would want to check if something isn't there directly, rather than have the clumsy #if/#else construct. Internally, #unless is implemented using the #if infrastructure. Other, rather painful changes, were the name changes to some data manipulation functions. It is a bit late in the game, but this was simply begging for a cleanup. Sorry :-(. You can always do a few macro definitions if you want to stick with the old names for a while in your applications. The argument order and type did not change at all, which should make things relatively easy to switch around. There was also a number of useful functions added to data manipulation section. There could be more in the future, depending on what I bump into solving real world problems. The support for sendfile() is now in by default and should work correctly, but you'll have to patch you Apache for it to take effect. There is a bug in server/core.c file of Apache up to 2.0.49, function emulate_sendfile(), that affects the output when a brigade contains more than one FILE bucket. That was the reason for FLUSH buckets after each FILE bucket in the previous mod_spin code. Here is that patch for Apache: =============================================== diff -ruN httpd-2.0.49-vanilla/server/core.c httpd-2.0.49/server/core.c --- httpd-2.0.49-vanilla/server/core.c 2004-03-09 09:54:20.000000000 +1100 +++ httpd-2.0.49/server/core.c 2004-03-22 18:56:29.000000000 +1100 @@ -2975,7 +2975,7 @@ } /* Seek the file to 'offset' */ - if (offset != 0 && rv == APR_SUCCESS) { + if (offset >= 0 && rv == APR_SUCCESS) { rv = apr_file_seek(fd, APR_SET, &offset); } =============================================== Another important fix is related to keep-alive and pipelined requests. In order for that to be handled properly, all memory allocation related to the output brigade is now done from the connection pool. New configuration parameter SpinCacheAll will turn on template file chunks caching even when they are 256 bytes in size and over. This will consume more memory, but might improve performance. A lot of effort in this version has been put into parsed template cache and the "poolology" of the beast. My tests indicate that mod_spin now behaves pretty good when it comes to performance (I have observed up to 25% better performance using the skeleton application, when compared to previous version of mod_spin), memory leaks and segfaults in that area. As always, non-trivial software has bugs, so if you find some (and you will), let me know. Unfortunately (or furtunately, depending on your point of view), during mod_spin stress tests, I was able to crash Linux kernel 2.4.22-1.2174.nptl, as provided by Fedora Core 1. A bug report is in (119519). I'm not sure if this is Red Hat specific, my system specific or generic, but it did crash my notebook several times. We'll have to wait for kernel folk to address this one. ** implement #unless, opposite of #if ** new data manipulation API calls ** make exisiting data manipulation function names sane ** better flex and bison build rules ** make the test file XHTML ** new configuration parameter: SpinSendfile ** enable merging of server and directory configurations ** use connection pool for all brigade stuff ** new configuration parameter: SpinCacheAll ** new configuration parameter: SpinClearCount ** make template caching safe ** fix template cache pool usage ** be more portable in configure.ac * version 0.9.3 released 2004-03-15 Two reasonably big things in this release. The first one related to easy installation - building mod_spin RPMs is now a no-brainer. The second one is a parsed template cache. This has been a long outstanding issue of mod_spin (i.e. all templates were always parsed on every request). Now, parsed templates are remembered per thread and if the modification time and size of the template is identical, no parsing will be done. This can speed up mod_spin up to 30%, as I have observed in my tests. Normally, if you're using database access, the difference in speed will be somewhere in the range of a few percent, but it's nevertheless welcome. With caching of parsed templates memory usage will go up, but given today's memory sizes, I don't see it as a big issue. Unfortunatly (or fortunately), a small API change occured in this release. It is the order of arguments passed to rxv_spin_db_connect() function (which now makes more sense anyway). But more importantly, the change was warranted due to a semantical change of the function itself, related to the memory leak. It is now required to pass a valid memory pool pointer as the first argument, for all temporary memory allocations. ** RPM build support (not heavily tested) ** create a memory pool per thread to avoid locking ** parsed templates are now cached per thread ** closed serious memory leaks in rxv_spin_db_connect() ** changed the order of arguments for rxv_spin_db_connect() ** improved build system * version 0.9.2 released 2004-03-08 The API should now be considered relatively stable. All unnecessary variables have been removed from the context and placed into a separate member `guts', which is used internally by mod_spin and shouldn't be relied upon. This will enable future enhancements to the context, while preserving current structure layout. There is also a new member `extra' that can be used for any user data that needs to be placed into the context. ** add more checks to various functions ** split context stuff into context.c ** split data stuff into data.c ** split application/session stuff into store.c ** fix potential memory leak in XML parsing ** drop session base filename ** fix configuration file reload for missing page file ** split data and context functions in the documentation ** provide context guts to stablise the API ** allow extra data to be placed into the context ** eatdoxygen utility for removing Doxygen comments ** hose Doxygen comments from installed rxv_spin.h file ** build and install manual pages ** remove LaTeX documentation and put mod_spin.pdf in docs ** install HTML documentation * version 0.9.1 released 2004-03-04 ** rxv_spin_app_del(), rxv_spin_ses_del() ** even more clear licensing exceptions ** rxv_spin_ctx_del macro ** build system enhanced (auto find MySQL stuff) ** depend on libxml2 ** XML configuration files ** add SpinAppConfig, application configuration file ** fixed incorrect application store linkage to cookies * version 0.9.0 released 2004-02-27 ** first beta version ** more clear licensing exceptions ** rxv_spin_db_escape() function ** rxv_spin_ctx_str_set macro ** don't escape query strings in rxv_sin_db_exec() ** switch to apr_hash_t in rxv_spin_data_t for case sensitivity ** fix ordering of rxv_spin_data structure * version 0.0.4 released 2004-02-20 ** LAST ALPHA RELEASE - FEATURE SET NOW COMPLETE ** MySQL support ** module signature to ServerSignature ** workaround for PACKAGE_* conflicts ** SpinAppEntry parameter ** REDIRECT, DONE and DECLINED handling ** create-spintest.sql ** database connections stored per type in the pool ** avoid use of apr_psprintf() for session filenames * version 0.0.3 released 2004-01-13 ** threading behaviour changed ** changed API * version 0.0.2 released 2003-10-17 ** added tests directory ** changed API * version 0.0.1 released 2003-10-15 ** Alpha quality code ** Most likely builds and works in certain circumstances * version 0.0.1 in development 2003-05-26 ** Successfuly switched to autoconf/automake/libtool build system ** Needs flex 2.5.31 to build (recursive C scanner feature)