
Version 6.9.4  2023-02-15
 * use epoll edge trigger to resolve github issues #608
 * bugfixed: report connections' current_count and max_count correctly

Version 6.9.3  2022-12-24
 * use prctl to set pthread name under Linux

Version 6.9.2  2022-11-28
 * space size such as total_mb and free_mb use int64_t instead of int
 * bugfixed: log connection ip_addr and port correctly
 * output port with format %u instead %d

Version 6.9.1  2022-11-25
 * bugfixed: clear task extra data correctly when the connection broken

Version 6.09  2022-09-14
 * use libfastcommon V1.60 and libserverframe 1.1.19
 * use atomic counter instead of mutex lock

Version 6.08  2022-06-21
 * use libfastcommon V1.56
   NOTE: you MUST upgrade libfastcommon to V1.56 or later

Version 6.07  2020-12-31
 * use libfastcommon V1.44
   NOTE: you MUST upgrade libfastcommon to V1.44 or later
 * correct spell iovent to ioevent follows libfastcommon

Version 6.06  2019-12-30
 * bugfixed: fdfs_storaged can't quit normally
 * bugfixed: init/memset return ip address to ascii 0 for Java SDK

Version 6.05  2019-12-25
 * fdfs_trackerd and fdfs_storaged print the server version in usage.
   you can execute fdfs_trackerd or fdfs_storaged without parameters
   to show the server version

 * trunk server support compress the trunk binlog periodically,
   the config items in tracker.conf: trunk_compress_binlog_interval
   and trunk_compress_binlog_time_base

 * trunk binlog compression support transaction

 * support backup binlog file when truncate trunk binlog,
   the config item in tracker.conf: trunk_binlog_max_backups

 * support alignment size for trunk space allocation
   the config item in tracker.conf: trunk_alloc_alignment_size 

 * support merge free trunk spaces
   the config item in tracker.conf: trunk_free_space_merge

 * support delete unused trunk files
   the config item in tracker.conf: delete_unused_trunk_files

 * fdfs_monitor.c: do NOT call getHostnameByIp

  NOTE: you MUST upgrade libfastcommon to V1.43 or later


Version 6.04  2019-12-05
 * storage_report_ip_changed ignore result EEXIST
 * use get_gzip_command_filename from libfastcommon v1.42
 * support compress error log and access log
 * disk recovery support multi-threads to speed up
 * bugfix: should use memset to init pReader in function
   storage_reader_init, this bug is caused by v6.01

  NOTE: you MUST upgrade libfastcommon to V1.42 or later


Version 6.03  2019-11-20
 * dual IPs support two different types of inner (intranet) IPs
 * storage server request tracker server to change it's status
   to that of tracker leader when the storage server found 
   it's status inconsistence
 * bugfix: fdfs_monitor fix get index of the specified tracker server
 * storage server write to data_init_flag and mark file safely
   (write to temp file then rename)
 * code refine: combine g_fdfs_store_paths and g_path_space_list,
   and extent struct FDFSStorePathInfo
 * check store path's mark file to prevent confusion
 * new selected tracker leader do NOT notify self by network
 * larger network_timeout for fetching one-store-path binlog
   when disk recovery
 
  NOTE: the tracker and storage server must upgrade together


Version 6.02  2019-11-12
 * get_file_info calculate CRC32 for appender file type
 * disk recovery download file to local temp file then rename it
   when the local file exists
 * support regenerate filename for appender file
   NOTE: the regenerated file will be a normal file!


Version 6.01  2019-10-25
 * compress and uncompress binlog file by gzip when need,
   config items in storage.conf: compress_binlog and compress_binlog_time
 * bugfix: must check and create data path before write_to_pid_file
   in fdfs_storaged.c


Version 6.00  2019-10-16
 * tracker and storage server support dual IPs
   1. you can config dual tracker IPs in storage.conf and client.conf,
      the configuration item name is "tracker_server"
   2. you can config dual storage IPs in storage_ids.conf
  more detail please see the config files.

  NOTE: you MUST upgrade libfastcommon to V1.41 or later
        the tracker and storage server must upgrade together

 * storage server get IP from tracker server
 * storage server report current tracker IP to the tracker server when join
 * tracker server check tracker list when storage server join
 * use socketCreateExAuto and socketClientExAuto exported by libfastcommon


Version 5.12  2018-06-07
 * code refine for rare case
 * replace print format OFF_PRINTF_FORMAT to PRId64
 * php_ext fix zend_object_store_get_object call in php5.5
 * make.sh uses macros define in /usr/include/fastcommon/_os_define.h
 * correct CRC32, you must upgrade libfastcommon to V1.38 or later

Version 5.11  2017-05-26
 * bug fixed: file_offset has no effect when use trunk file
 * add storage access log header
 * http.conf add parameter http.multi_range.enabed

Version 5.10  2017-03-29
 * use fc_safe_read instead of read, and fc_safe_write instead of write
   you must upgrade libfastcommon to V1.35 or later
 * fix getFileContentEx read bytes,
   you must upgrade libfastcommon to V1.36 or later
 * do NOT sync storage server info to tracker leader
 * adjust parameter store_server when use_trunk_file is true
 * clear sync src id when tracker response ENOENT
 * log more info when fdfs_recv_header / fdfs_recv_response fail

Version 5.09  2016-12-29
 * bug fixed: list_all_groups expand buffer auto for so many groups
 * tracker.conf add parameters: min_buff_size and max_buff_size
 * php extension fix free object bug in PHP 7

Version 5.08  2016-04-08
 * install library to $(TARGET_PREFIX)/lib anyway
 * php extension compiled in PHP 7
 * dio thread use blocked_queue and php extension use php7_ext_wrapper.h,
   you must upgrade libfastcommon to V1.25 or later
 * remove common/linux_stack_trace.[hc]

Version 5.07  2015-09-13
 * schedule task add the "second" field
 * make.sh changed, you must upgrade libfastcommon to V1.21 or later
 * bug fixed: storage_disk_recovery.c skip the first file (binlog first line)
 * bug fixed: should close connection after fetch binlog
 * fdfs_storaged.c: advance the position of daemon_init
 * set log rotate time format
 * bug fixed: must check store_path_index

Version 5.06  2015-05-12
 * compile passed in mac OS Darwin
 * correct scripts in subdir init.d
 * check item thread_stack_size in storage.conf, you must
   upgrade libfastcommon to V1.14 or later

Version 5.05  2014-11-22
 * tracker_mem.c log more info
 * remove useless global variable: g_network_tv
 * storage can fetch it's group_name from tracker server

Version 5.04  2014-09-16
 * add fastdfs.spec for build RPM on Linux
 * depend on libfastcommon
 * in multi tracker servers case, when receive higher status like
   online / active and the storage status is wait_sync or syncing,
   the tracker adjust storage status to newer, and the storage rejoin
   to the tracker server
 * fdfs_monitor support delete empty group
 * bug fixed: two tracker leaders occur in rare case
 * add connection stats
 * delete old log files, add parameter: log_file_keep_days

Version 5.03  2014-08-10
 * network send and recv retry when error EINTR happen
 * support mac OS Darwin
 * use newest logger from libfastcommon
 * patches by liangry@ucweb.com
 * bug fixed: can't sync large files cause by v5.02
 * use newest files from libfastcommon
 * change TRACKER_SYNC_STATUS_FILE_INTERVAL from 3600 to 300
 * socket send and recv ignore erno EINTR

Version 5.02  2014-07-20
 * corect README spell mistake
 * bug fixed: can't deal sync truncate file exception
 * remove tracker_global.c extern keyword to tracker_global.h
 * change log level from ERROR to DEBUG when IOEVENT_ERROR
 * php callback should use INIT_ZVAL to init zval variable
 * add function short2buff and buff2short
 * add get_url_content_ex to support buffer passed by caller
 * logger can set rotate time format
 * logger can log header line
 * #include <stdbool.h> to use C99 bool
 * logger can delete old rotated files
 * bug fixed: connection pool should NOT increase counter when connect fail
 * logger.c do NOT call fsync after write

Version 5.01  2014-02-02
 * trunk binlog be compressed when trunk init
 * bug fixed: sync trunk binlog file to other storage servers immediately when
   the trunk server init done
 * move ioevent_loop.[hc] and fast_task_queue.[hc] from tracker/ to common/
 * hash table support locks
 * hash talbe support new functions: hash_inc and hash_inc_ex

Version 5.00  2013-12-23
 * discard libevent, use epoll in Linux, kqueue in FreeBSD, port in SunOS directly
 * do_notify_leader_changed force close connection when target is myself
 * modify the INSTALL file and tracker/Makefile.in

Version 4.08  2013-11-30
 * bug fixed: FDFS_DOWNLOAD_SERVER_ROUND_ROBIN change to FDFS_STORE_SERVER_ROUND_ROBIN
 * dio_init use memset to init buffer
 * disable linger setting (setsockopt with option SO_LINGER)
 * change log level from error to warning when file not exist on storage server

Version 4.07  2013-06-02
 * make.sh add -lpthread by ldconfig check
 * support multi accept threads
 * tracker and storage server close client connection when recv invalid package
 * client/storage_client.c: file_exist with silence flag
 * tracker and storage process support start, stop and restart command
 * tracker/tracker_proto.c fdfs_recv_header: logDebug change to logError

Version 4.06  2013-01-24
 * fdfs_upload_file tool enhancement
 * fdfs_download_file tool support offset and download size
 * trunk file upload support sub paths rotating correctly
 * add function: fdfs_http_get_file_extension
 * sync truncate file operation anyway

Version 4.05  2012-12-30
 * client/fdfs_upload_file.c can specify storage ip port and store path index
 * add connection pool
 * client load storage ids config
 * common/ini_file_reader.c does NOT call chdir
 * keep the mtime of file same
 * use g_current_time instead of call time function
 * remove embed HTTP support

Version 4.04  2012-12-02
 * bug fixed: get storage server id when storage daemon init
 * storage id in filename use global variable
 * dynamic alloc memory 8 bytes alignment
 * fast_task_queue support memory pool chain

Version 4.03  2012-11-18
 * trunk_mgr/trunk_mem.c: log error and add more debug info
 * file id generated by storage server can include storage server ID

Version 4.02  2012-10-30
 * validate file_ext_name and prefix_name when upload file
 * storage.conf add parameter: file_sync_skip_invalid_record
 * add offset debug info when sync file fail
 * bug fixed: log to binlog also if the file exists when sync file
 * tracker and storage error log support rotate
 * support rotate log by file size
 * rotate log when receive HUP signal
 * fdfs_monitor support set trunk server
 * bug fixed: tracker_mem.c correct double mutex lock

Version 4.01  2012-10-21
 * trunk_mgr/trunk_mem.c: trunk init flag check more strictly
 * file signature for checking file duplicate support MD5
 * slave file support both symbol link and direct file
 * tracker server log trunk server change logs

Version 4.00  2012-10-06
 * identify storage server by ID instead of IP address
 * tracker.conf: storage reserved space can use ratio such as 10%
 * storage server support access log
 * appender file and trunk file also use rand number in file id
 * bug fixed: test_upload.c: char file_id[64] change to: char file_id[128]
 * set pipe reading fd with attribute O_NOATIME
 * bug fixed: correct php extension call_user_function TSRMLS_DC with TSRMLS_CC

Version 3.11  2012-08-04
 * setsockopt set linger.l_linger to micro-seconds in FreeBSD and seconds 
   in others
 * trunk binlog reader skip incorrect records
 * bug fixed: single disk recovery support symbol link and trunk file
 * storage generate filename enhancement
 * ETIME change to ETIMEDOUT for FreeBSD
 * tracker_mem.c: load storage server ignore empty ip address

Version 3.10  2012-07-22
 * check and init trunk file more gracefully
 * remove unused-but-set-variable
 * bug fixed: return correct group name when g_check_file_duplicate is true
 * bug fixed: php extension call_user_function replace TSRMLS_CC with TSRMLS_DC
 * large the interval of tracker re-select trunk server
 * trunk free block check duplicate using avl tree
 * trunk file sync overwrite the dest file anyway
 * common/avl_tree.c: free data when delete
 * tracker.conf add parameter: trunk_init_reload_from_binlog, when this flag 
   is set to true, load all free trunk blocks from the trunk binlog
 * trunk status control only by trunk_mem.c and memcmp struct FDFSTrunkFullInfo
   avoid memory alignment problem
 * auto remove the too old temp file

Version 3.09  2012-07-08
 * make.sh avoid override config files of /etc/fdfs/
 * common/logger.c: function log_init can be called more than once
 * php extension logInfo change to logDebug
 * c client logInfo change to logDebug
 * storage_dio.c log info more properly
 * delete the trunk space which be occupied
 * tracker.conf add parameter: trunk_init_check_occupying, when this flag 
   is set to true, do not add the trunk nodes which be occupied
 * another method to get local ip addresses

Version 3.08  2012-05-27
 * FAST_MAX_LOCAL_IP_ADDRS change from 4 to 16
 * appender file support modify
 * appender file support truncate

Version 3.07  2012-05-13
 * tracker/tracker_mem.c: check storage ip address is not empty
 * remove direct IO support
 * trunk binlog sync optimization
 * php extension compile passed in PHP 5.4.0
 * get local ip addresses enhancement
 * trunk server select the storage server whose binglog file size is max
 * sync trunk binlog file correctly when trunk server changed

Version 3.06  2012-01-22
 * add common/avl_tree.h and common/avl_tree.c
 * organize trunk free blocks using AVL tree
 * find the trunk server for each group when current tracker be a leader
 * common/sched_thread.c can add schedule entry dynamicly
 * support creating trunk file advancely

Version 3.05  2011-12-20
 * remove compile warnings
 * storage server's store_path_count can be more than that of group
 * bug fixed: common/fast_mblock.c malloc bytes are not enough
 * make.sh support OS: HP-UX

Version 3.04  2011-11-25
 * bug fixed: duplicate files only save one entry ok with trunk file mode
 * bug fixed: sync correctly with more binlog files
 * fdfs_file_info query file info from storage server
 * bug fixed: php extension compile error using gcc 4.6.1 as:
   variable 'store_path_index' set but not used
 * bug fixed: delete the metadata of trunked file correctly
 * bug fixed: append file ok when check duplicate is on
 * storage/trunk_mgr/trunk_shared.[hc]: trunk_file_stat_func do not 
   use function pointer
 * bug fixed: storage/trunk_mgr/trunk_shared.c base64_decode_auto 
   overflow 1 byte
 * bug fixed: delete slave file correctly
 * bug fixed: remove debug info
 * md5 function name changed to avoid conflict

Version 3.03  2011-10-16
 * ignore existed link when sync link file
 * http token checking support persistent token
 * add functions: storage_file_exist and storage_file_exist1
 * php minfo add fastdfs version info
 * make.sh changed
 * client move libevent dependency

Version 3.02  2011-09-18
 * bug fixed: tracker_mem_check_add_tracker_servers add tracker server 
   correctly
 * php client compile ok with php 5.2.17
 * re-select trunk server ok

Version 3.01  2011-07-31
 * bug fixed: tracker_get_connection_ex and tracker_get_connection_r_ex 
   connect two times with multi tracker servers
 * bug fixed: tracker_mem_check_add_tracker_servers condition not correct
 * all logError add source filename and line
 * php extension support upload file callback
 * php extension support download file callback

Version 3.00  2011-06-19
 * mass small files optimization
 * add fixed block memory pool: common/fast_mblock.c
 * bug fixed: tracker_mem.c do NOT clear g_groups fields
 * bug fixed: slave file and appender file download ok
 * bug fixed: tracker / storage run by group / user, set file owner
 * tracker server support leader
 * client support static library
 * client_func.h add functions fdfs_tracker_group_equals and 
   fdfs_get_file_ext_name
 * bug fixed: test/dfs_func_pc.c compile ok
 * storage server check free space enough when upload a file

Version 2.09  2011-02-19
 * bug fixed: write_to_binlog_index then increase g_binlog_index (feedback 
   by koolcoy)
 * disk read / write supports direct mode (avoid caching by the file system)

Version 2.08  2011-01-30
 * bug fixed: fdfs_trackerd.c set g_tracker_thread_count to 0
 * add cmd TRACKER_PROTO_CMD_SERVER_LIST_ONE_GROUP to support list one group
 * support disk recovery automatically
 * support total_upload_bytes, success_upload_bytes, total_download_bytes and 
   success_download_bytes etc. 18 stat fields
 * tracker data file storage_groups.dat changes to storage_groups_new.dat, and 
   storage_servers.dat changes to storage_servers_new.dat
 * support file append, add tests: fdfs_appender_test and fdfs_appender_test1
 * storage_dio.c: dio_deal_task split to several functions
 * tracker http check thread exit normally
 * function fdfs_get_file_info_ex changed, add function fdfs_get_file_info_ex1
 * fix some type cast error when compile with c++
 * client add tools: fdfs_upload_appender and fdfs_append_file

Version 2.07  2011-01-09
 * slave file's prefix name can be empty
 * FDFS_MAX_GROUPS change from 64 to 512
 * file size field in the file id changed: high 32 bits is random integer 
   when the file size < 2GB and the highest bit set to 1
 * tracker_service.c: in function list_group_storages, use strcpy 
   intead of memcpy
 * php extension add function fastdfs_tracker_delete_storage
 * client add tool: fdfs_file_info to get file info, including file size,
   create timestamp, source storage ip address and crc32 signature
 * fdfs_upload_file.c: omit more error info when the local file not exist

Version 2.06  2010-12-26
 * sync file op: do not sync the file which exists on dest storage server
   and the file size are same 
 * bug fixed: sync copy file will clear the existed file on dest storage
   server (truncate the file size to 0), this bug caused by V2.04
 * bug fixed: make temp file discard system function mkstemp, 
   use file sequence No. with pthread_mutex_lock
 * bug fixed: function fastdfs_tracker_list_groups, when parameter group_name
   is null or empty string, return all groups info
 * bug fixed: upload a file extends 2GB will fail
 * bug fixed: tracker to tracker sync system data files, in function: 
   tracker_mem_get_tracker_server, pTrackerStatus not be set properly

Version 2.05  2010-12-05
 * client/fdfs_monitor.c: add sync delay time
 * tracker/fast_task_queue.c: pTask->data = pTask->arg + arg_size; 
   change to: pTask->data = (char *)pTask->arg + arg_size;
 * bug fixed: storage_sync.c line 237 cause core dump in Ubuntu 10.04
 * upload file test use mmap, support more test_upload processes
 * client add three tools: fdfs_upload_file, fdfs_download_file and 
   fdfs_delete_file

Version 2.04  2010-11-19
 * storage.conf: tracker server ip can NOT be 127.0.0.1
 * do not catch signal SIGABRT
 * strerror change to STRERROR macro
 * sync copy file use temp filename first, rename to the correct filename 
   when sync done
 * file id use 4 bytes CRC32 signature instead of random number
 * add file: client/fdfs_crc32.c
 * one of file hash code signature function change from APHash_ex 
   to simple_hash_ex
 * bug fixed: when fdfs_storaged quit, maybe write to binlog file fail,
   the error info is "Bad file descriptor"

Version 2.03  2010-11-08
 * bug fixed: core dump when http.need_find_content_type=false and 
   http.anti_steal.check_token=true
 * storage server add join_time field (create timestamp of this storage)
 * tracker server fetch system files from other tracker server when 
   first storage server join in (tracker to tracker sync system files)
 * tracker server changes the old ip address to the new address when the 
   storage server ip address changed
 * tracker to tracker sync system data files in some case, multi tracker
   server supported well

Version 2.02  2010-10-28
 * get parameters function from tracker server changed, 
   add paramter: storage_sync_file_max_delay
 * local ip functions move to common/local_ip_func.c
 * when query all storage servers to store, do not increase the current
   write server index
 * struct FDFSHTTPParams add field: need_find_content_type
 * symbol link client library to /usr/lib64 in 64 bits OS
 * storage_client.c: deal file extension name correctly

Version 2.01  2010-10-17
 * client/fdfs_monitor.c can specify tracker server
 * micro STORAGE_STORE_PATH_PREFIX_CHAR change to 
   FDFS_STORAGE_STORE_PATH_PREFIX_CHAR
 * php extension can set log filename
 * php extension add function: fastdfs_client_version
 * bug fixed: client/tracker_client.c tracker_get_connection_ex NULL pointer
 * set max core dump file size to at least 256MB when DEBUG_FLAG is on, 
   make sure to generate core file when core dump with DEBUG_FLAG on
 * upload file can get available storage server list of the group, 
   add command TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITHOUT_GROUP_ALL and
   TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ALL
 * bug fixed: storage core dump in some case

Version 2.00  2010-08-22
 * tracker network io use libevent instead of traditional io model
 * storage network io use libevent instead of traditional io model
 * storage disk read/write use separate threads
 * tracker_mem.c malloc single group and storage struct, remove referer
 * make install copy config files
 * tracker.conf add two parameters: storage_sync_file_max_delay and 
   storage_sync_file_max_time
 * client tracker_get_connection increase server_index correctly
 * storage sync to storage server adds active test
 * test programs compile ok

Version 1.29  2010-06-30
 * add files: tracker_dump.h and tracker_dump.c, tracker dump global vars
 * add files: storage_dump.h and storage_dump.c, storage dump global vars
 * sockopt.c: tcprecvfile and tcpdiscard add parameter total_recv_bytes
 * storage server add fields: storage_port and storage_http_port
 * auto rename synced remark files when the port of all storage servers 
   in a group changed to another port
 * connect server support timeout, adding connect_timeout parameter in 
   config file
 * log_init set log to cache to false (no cache)

Version 1.28  2010-05-30
 * tracker_servive.c: set current_write_group anyway when current group
   out of space
 * logger support context (multi instance)
 * get storage servers by filename: if the file created one day ago (the create 
   timestamp of the file < current_time - 86400), any active storage server matches
 * add files: common/pthread_func.h and common/pthread_func.c
 * common/sched_thread.h, remove statement: extern bool g_continue_flag;
 * client add libfastcommon
 * global variables: g_base_path, g_network_timeout, g_version change to 
   g_fdfs_base_path, g_fdfs_network_timeout, g_fdfs_version
 * common/fdfs_base64.h/c change name to common/base64.h/c
 * make.sh use TARGET_PREFIX instead of TARGET_PATH
 * protocol add ACTIVE_TEST, tracker and storage both support
 * php client, bug fixed: fastdfs_connect_server, the sock must init to -1
 * bug fixed: storage status not correct with multi tracker servers
 * sync storage mark file and stat file to disk properly

Version 1.27  2010-04-10
 * storage.conf: add if_alias_prefix parameter to get the ip address of the 
   local host
 * storage http support domain name
 * php extension add some parameters in fastdfs_client.ini
 * make.sh compile use debug mode
 * type off_t change to int64_t
 * redirect stdout and stderr to log file
 * php extension list_groups add fields: version and http_domain

Version 1.26  2010-02-28
 * remove compile warning of logError
 * ini reader support section
 * bug fixed: tracker/tracker_mem.c sync storage server status
 * use storage server http server port anyway
 * bug fixed: ini reader can support relative config filename
 * function enhancement: tracker server can check storage HTTP server alive

Version 1.25  2010-02-04
 * storage_sync.c if source file not exist when sync a file, change from 
   logWarning to logDebug
 * filename buff size change from 64 to 128
 * bug fixed: c client and php client, log not inited cause core dump when 
   call log functions
 * can print stack trace when process core dumped in Linux server
 * bug fixed: tracker/tracker_mem.c load storage servers fail with many groups
   and storage servers
 * common/sockopt.c remove debug info
 * storage stat add fields: version
 * auto adjust when storage server ip address changed
 * bug fixed: when add a new storage server, other storage servers' status keep
   the same, not changed
 * add macros, compile passed in cygwin, thanks Seapeak
 * write to system data file using lock
 * common/ini_file_reader.c: use one context parameter, not two parameters
 * storage status sync modified (the code of tracker and storage both changed)
 * when recv kill signal, worker thread quit more quickly, daemon process 
   fdfs_trackerd and fdfs_storage quit very quickly when recv kill signal
 * remove compile warning info of logError
 * tracker server start more quickly with many groups and storage servers
 * bug fixed: correct off_t printf format

Version 1.24  2010-01-06
 * call php_fdfs_close with TSRMLS_CC as php_fdfs_close(i_obj TSRMLS_CC)
 * storage server to storage server report ip address as tracker client
 * bug fixed: sendfile exceeds 2GB file in Linux
 * bug fixed: delete storage server 
 * storage stat add fields: up_time and src_ip_addr
 * big static or struct memeber char array buffer change to malloc in order to
   decrease stack size
 * FDFS_WRITE_BUFF_SIZE  change from 512KB to 256KB
 * bug fixed: client/storage_client.c, meta data miss when upload file
 * decrease thread_stack_size default value in config files: tracker.conf 
   and storage.conf

Version 1.23  2009-11-29
 * remove unuseless variable "sleep_secs" in tracker_report_thread_entrance
 * storage can bind an address when connect to other servers (as a client)
 * common/md5.h fix UINT4 typedef wrong type in 64 bit OS
 * client/fdfs_test.c: print the source ip address decoded from the remote 
   filename
 * client add function fdfs_get_file_info
 * php extension add functions: fastdfs_http_gen_token and fastdfs_get_file_info
 * server process will exit when the http service starts fail
 * support file group, a master file with many slave files whose file id can be 
   combined from master file id and prefix
 * php client support uploading slave file
 * ip address in filename change from host byte order to network byte order
 * storage sync performance enhancement, using read buffer of 64KB to avoid 
   reading binlog file repeatly
 * storage add prototol cmd: STORAGE_PROTO_CMD_QUERY_FILE_INFO
 * FDFS_FILE_EXT_NAME_MAX_LEN changed from 5 to 6
 * get file info support slave file
 * storage server for uploading file support priority

Version 1.22  2009-10-12
 * bug fixed: common/shared_func.c allow_hosts array maybe overflow in some case
 * tracker/tracker_mem.c: protocol TRACKER_PROTO_CMD_SERVICE_QUERY_FETCH_ALL, 
   return at least a storage server when active storage 
   server count of the group > 0
 * bug fixed: when client connection disconnected, always log debug or error info
 * make.sh: default not install FastDFS services in Linux server
 * common/sockopt.c: setsockopt level SOL_TCP only supported in Linux
 * common/http_func.c: do not use function strsep because strsep is not portable
 * client upload file support callback function
 * client support multi tracker groups (multi FastDFS clusters)
 * bug fixed: thread_stack_size not correct when the param thread_stack_size 
   not set in the config file
 * supply php extension (directory name: php_client)
 * c client reconnect server (tracker or storage) when network IO error
 * c client: make tracker server index counter thread safely

Version 1.21  2009-09-19
 * bug fixed: when source storage server synced file to new storage server done,
   it's status changed to ONLINE (should keep as ACTIVE, report by zhouzezhong)
 * add thread_stack_size in config file, default value is 1MB (report by chhxo)
 * tracker and storage server use setsockopt to keep alive 
   (report by zhouzezhong)
 * bug fixed: storage server with multi-path, upload file fail when the free 
   space of each path <= reserved space (the total free space > reserved space,
   report by zhouzezhong)
 * storage_sync.c: when connect fail, do not change the dest storage server '
   status to offline
 * tracker_service.c and storage_service.c change log level from WARNING to DEBUG 
   when client connection disconnected (report by Jney402)
 * bug fixed: tracker_client.c correct store_path_index return by tracker server
   (report by happy_fastdfs)
 * bug fixed: tracker_service.c when store_lookup set to 2 (load balance), use 
   another pthread lock to avoid long time lock waiting
   (report by happy_fastdfs)
 * add service shell scripts in directory: init.d 
   (services will auto installed on Linux, report by hugwww)

Version 1.20  2009-09-05
 * base64 use context, functions changed
 * common/ini_file_reader.c: fix memory leak
 * tracker server support HTTP protocol, one thread mode
 * storage server support HTTP protocol, one thread mode
 * fix bug: storage server rebuild, auto sync data correctly
 * fix bug: sync data fail (correct storage server status)
 * when storage server idle time exceeds check_active_interval seconds, 
   set it's status to offline
 * tracker counter thread safely

Version 1.19  2009-07-23
 * use poll instead of select in sockopt.c
 * hash.c use chain impl by self
 * use FastDHT 1.09 client code
 * ini reader support HTTP protocol, conf file can be an url
 * correct test dir compile error
 * use non-block socket to increase network IO performance
 * add cmd TRACKER_PROTO_CMD_SERVICE_QUERY_FETCH_ALL: query all storage servers 
   from which the file can be dowloaded
 * while (1) ... break; changed to do ... while (0);

Version 1.18  2009-05-24
 * restart.sh only kill the programs match the program name and all parameters
 * correct get local ip addresses
 * common files do not use global vars like g_network_timeout and g_base_path
 * download file support offset and download bytes
 * hash function change type from unsigned int to signed int
 * file size in file name support 64 bits, old bytes is 4, new bytes is 8

Version 1.17  2009-03-19
  * add test programs at sub directory test/
  * common/shared_func.c: rindex change to strrchr, add #include <netinet/in.h>
  * support SunOS (Solaris), compile passed on SunOS 5.10
  * support AIX, compile passed on AIX 5.3
  * sys call statfs change to statvfs
  * use scheduling thread to sync binlog buff / cache to disk, add parameter
   "sync_binlog_buff_interval" to conf file storage.conf
  * use FastDHT v1.07 client code

Version 1.16  2009-02-14
  * client can specify group name when upload file
  * tracker_service.c: cmd dispatch changed to "switch ... case" 
    not "if ... else if"
  * storage_service.c: call fdfs_quit before tracker_disconnect_server

Version 1.15  2009-01-28
  * use FastDHT v1.04 client code
  * use FastDHT client thread safely

Version 1.14  2009-01-18
  * storage/storage_sync.c: 
    old: if (reader.sync_row_count % 1000 == 0)
    new: if (reader.scan_row_count % 2000 == 0)
  * little adjustment for common files can be used by FastDHT
  * sched_thread.h /.c add global variable g_schedule_flag to quit normally
  * shared_func.h / .c add function get_time_item_from_conf
  * sched_thread.h /.c support time_base of task
  * hash.h / .c add function CRC32, add hash function to support stream hash
  * add FastDHT client files in storage/fdht_client/
  * create symbol link when the file content is duplicate, 
    add item "check_file_duplicate" to conf file storage.conf
  * use FastDHT v1.02 client code
  * auto delete invalid entry in FastDHT when the source file does not exist

Version 1.13  2008-11-29
  * re-calculate group 's free space when one of it's storage servers' 
    free space increase
  * add parameters: sync_interval, sync_start_time and sync_end_time to 
    storage.conf
  * performance enhancement: log to buffer, flush to disk every interval seconds
  * standard fds closed by daemon_init: 0(stdin), 1(stdout) and 2(stderr)
  * fix bug: pthread_kill sometimes cause core dump when program terminated
  * fix bug: sync.c open next binlog cause loop call

Version 1.12  2008-11-12
  * storage server support multi path (mount point)
  * upload file support file ext name, add source storage ip address to filename
  * add delete command to delete the invalid storage server
  * add client functions which combine group name and filename to file id,
    add anothor client test program: fdfs_test1.c to use file id
  * client download file support callback function
  * add protocol cmd TRACKER_PROTO_CMD_SERVICE_QUERY_UPDATE, 
    and client API add tracker_query_storage_update
  * add protocol cmd TRACKER_PROTO_CMD_STORAGE_SYNC_REPORT to report last 
    synced timestamp as dest server
  * fix sync old data files to new server bug
  * fcntl change to pthread_mutex_lock

Version 1.11  2008-10-04
  * kill report and sync threads when recv terminate signal
  * add item "store_server" in tracker.conf, by default use the first 
    storage server to store uploaded files
  * ini_file_reader.c changed: a conf file can include other conf files
  * some adjustment:
    some macro name changed
    add common_define.h
    remove fdfs_define.c
    fdfs_os_bits.h change to _os_bits.h

Version 1.10  2008-09-20
  * performance optimizing: use thread pool, create all work threads at startup
  * trim function op in shared_func.c
  * add Makefile template Makefile.in, delete Makefile and Makefile.freebsd
    change make.sh to support all unix systems (passed in Linux and FreeBSD)

Version 1.9  2008-09-14
  * security enhancement: support allow hosts which can connect to the server
  * server can be run by the specified group and user, set by the config file
  * change make.sh and add file common/fdfs_os_bits.h, 
    remove the warning info of printf format for int64_t param in 64 bits system
  * storage_client.c changed: auto connect to storage server when not connected
  * change some macro name and function name in tracker/tracker_proto.h

Version 1.8  2008-09-07
  * communication protocol changed to support large file exceed 2GB:
     # all integer field is 8 bytes big-endian
     # group name fixed length: FDFS_GROUP_NAME_MAX_LEN bytes
  * storage stat numbers (such as total_upload_count, success_upload_count) 
    use int64_t (8 bytes integer)
  * ini_file_reader.c add function iniGetInt64Value
  * sockopt.c add function tcpsetnonblockopt
  * shared_func.c add function set_nonblock

Version 1.7  2008-08-31
  * performance optimizing: 
     # change fopen to syscall open
     # increase the efficiency of socket functions tcpsenddata and tcprecvdata
  * change the return value of socket funtions such as tcpsenddata, 
    tcprecvdata and connectserverbyip
      old return value: result=1 for success, result != 1 fail
      new return value: result=0 for success, result != 0 fail, return the error code
  * log function enhancement: 
     # support log level
     # parameter "log_level" added to server config file
     # keep the log file opened to increase performance
  * fix log format and parameter mismatched bug (check by printf)
  * log CRIT message to log file when program exit unexpectedly
  * Makefile add compile flag -D_FILE_OFFSET_BITS=64 to support large files
  * change the type of file_size and file_offset to off_t
  * change signal to sigaction
  * fix client Makefile to compile library correctly
  * restart.sh modified: use external command "expr" to replace shell command "let"

Version 1.6  2008-08-24
  * add restart daemon shell script: restart.sh
  * use setrlimit to increase max open files if necessary
  * security enhancement: the format of data filename must be: HH/HH/filename,
    eg. B9/F4/SLI2NAAMRPR9r8.d
  * fix bug: errno is not correct where the downloaded file does not exist,
             communication is broken when the download file is a directory

Version 1.5  2008-08-17
  * add client function storage_download_file_to_file
  * use pthread_attr_setstacksize to increase thread stack size to 1 MB
  * use sendfile syscall to send file in Linux and FreeBSD
  * fix bug: add O_TRUNC flag when open file to write
  * remove warning info compiled by gcc 4.2
  * fcntl set lock.l_len to 0

Version 1.4  2008-08-10
  * storage server recv file method change 
     old method: recv the whole file content/buff before write to file
     new method: write to file once recv a certain bytes file buff, eg. 128KB buff size
  * storage client and storage server send file method change 
     old method: get the whole file content/buff, then send to storage server
     new method: send file to storage server more times. get a certain bytes file buff, then send to storage server
  * upload file package remove the one pad byte field
  * remove storage status FDFS_STORAGE_STATUS_DEACTIVE and add FDFS_STORAGE_STATUS_DELETED

Version 1.3  2008-08-03
  * fix bug: when meta data is empty, get meta data return error
  * support java client
    # memset response header to 0
    # add group_name to upload file response package

Version 1.2  2008-07-27
  * add client function storage_set_metadata to support setting metadata(overwrite or merge)

Version 1.1  2008-07-20
  * implement storage disk report
  * storing load balance between storage groups(volumes) when set store_lookup to 2

Version 1.0  2008-07-12
  * first version

