I reviewed all the do_sync=FALSE calls to ensure they were not using
the loggy mechanism as a delayed write. In all cases, do_sync=FALSE is
soon followed by a call to __entries_write() to write the whole
entries file. Therefore, I believe this change is Good.
Note, however, that those calls to __entries_write() may not be
required. But: I did see at least once case of a call to
__entries_remove() with a do_sync=FALSE, so it is (thus) depending
upon the later write. I believe your next step would be to eliminate
do_sync from the remove call, as part of progress to removing all
manual entries_write() calls.
Cheers,
-g
On Tue, Apr 14, 2009 at 04:47, Hyrum K. Wright <hyrum_at_hyrumwright.org> wrote:
> Author: hwright
> Date: Mon Apr 13 19:47:27 2009
> New Revision: 37225
>
> Log:
> Remove the do_sync parameter to entry_modify, making every entry modification
> a write of the entries file.
>
> * subversion/libsvn_wc/relocate.c,
> subversion/libsvn_wc/update_editor.c,
> subversion/libsvn_wc/questions.c,
> subversion/libsvn_wc/adm_ops.c,
> subversion/libsvn_wc/copy.c,
> subversion/libsvn_wc/adm_crawler.c,
> subversion/libsvn_wc/log.c,
> subversion/libsvn_wc/entries.c:
> Adjust callers.
>
> * subversion/libsvn_wc/entries.c,
> subversion/libsvn_wc/entries.h
> (svn_wc__entry_modify): Remove do_sync parameter, and unconditionally flush
> the entries after modification.
>
> Modified:
> trunk/subversion/libsvn_wc/adm_crawler.c
> trunk/subversion/libsvn_wc/adm_ops.c
> trunk/subversion/libsvn_wc/copy.c
> trunk/subversion/libsvn_wc/entries.c
> trunk/subversion/libsvn_wc/entries.h
> trunk/subversion/libsvn_wc/log.c
> trunk/subversion/libsvn_wc/questions.c
> trunk/subversion/libsvn_wc/relocate.c
> trunk/subversion/libsvn_wc/update_editor.c
>
> Modified: trunk/subversion/libsvn_wc/adm_crawler.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/adm_crawler.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/adm_crawler.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/adm_crawler.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -160,8 +160,7 @@ restore_file(const char *file_path,
>
> /* Modify our entry's text-timestamp to match the working file. */
> return svn_wc__entry_modify(adm_access, svn_dirent_basename(file_path, pool),
> - &newentry, SVN_WC__ENTRY_MODIFY_TEXT_TIME,
> - TRUE /* do_sync now */, pool);
> + &newentry, SVN_WC__ENTRY_MODIFY_TEXT_TIME, pool);
> }
>
>
>
> Modified: trunk/subversion/libsvn_wc/adm_ops.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/adm_ops.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/adm_ops.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/adm_ops.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -914,7 +914,7 @@ mark_tree(svn_wc_adm_access_t *adm_acces
> (adm_access, base_name, &tmp_entry,
> modify_flags & (SVN_WC__ENTRY_MODIFY_SCHEDULE
> | SVN_WC__ENTRY_MODIFY_COPIED),
> - TRUE, subpool));
> + subpool));
>
> if (copied)
> /* Remove now obsolete wcprops */
> @@ -961,7 +961,7 @@ mark_tree(svn_wc_adm_access_t *adm_acces
> /* Modify this_dir entry if requested. */
> if (this_dir_flags)
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL, &tmp_entry, this_dir_flags,
> - TRUE, subpool));
> + subpool));
>
> /* Destroy our per-iteration pool. */
> svn_pool_destroy(subpool);
> @@ -1473,7 +1473,7 @@ svn_wc_add3(const char *path,
> /* Now, add the entry for this item to the parent_dir's
> entries file, marking it for addition. */
> SVN_ERR(svn_wc__entry_modify(parent_access, base_name, &tmp_entry,
> - modify_flags, TRUE, pool));
> + modify_flags, pool));
>
>
> /* If this is a replacement without history, we need to reset the
> @@ -1565,7 +1565,7 @@ svn_wc_add3(const char *path,
> : svn_wc_schedule_add;
> tmp_entry.incomplete = FALSE;
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL, &tmp_entry,
> - modify_flags, TRUE, pool));
> + modify_flags, pool));
>
> if (copyfrom_url)
> {
> @@ -2100,12 +2100,12 @@ revert_entry(svn_depth_t *depth,
> SVN_ERR(svn_wc__entry_modify(parent_access, basey, &tmp_entry,
> SVN_WC__ENTRY_MODIFY_KIND
> | SVN_WC__ENTRY_MODIFY_DELETED,
> - TRUE, pool));
> + pool));
> else
> SVN_ERR(svn_wc__entry_modify(parent_access, bname, &tmp_entry,
> SVN_WC__ENTRY_MODIFY_KIND
> | SVN_WC__ENTRY_MODIFY_DELETED,
> - TRUE, pool));
> + pool));
> }
> }
> /* Regular prop and text edit. */
> @@ -2491,7 +2491,6 @@ svn_wc_remove_from_revision_control(svn_
> SVN_WC_ENTRY_THIS_DIR,
> &incomplete_entry,
> SVN_WC__ENTRY_MODIFY_INCOMPLETE,
> - TRUE, /* sync to disk immediately */
> pool));
>
> /* Get rid of all the wcprops in this directory. This avoids rewriting
> @@ -2842,7 +2841,7 @@ resolve_conflict_on_entry(const char *pa
> SVN_ERR(svn_wc__entry_modify
> (conflict_dir,
> (entry->kind == svn_node_dir ? NULL : base_name),
> - entry, modify_flags, TRUE, pool));
> + entry, modify_flags, pool));
>
> /* No feedback if no files were deleted and all we did was change the
> entry, such a file did not appear as a conflict */
> @@ -3067,7 +3066,7 @@ svn_error_t *svn_wc_add_lock(const char
> | SVN_WC__ENTRY_MODIFY_LOCK_OWNER
> | SVN_WC__ENTRY_MODIFY_LOCK_COMMENT
> | SVN_WC__ENTRY_MODIFY_LOCK_CREATION_DATE,
> - TRUE, pool));
> + pool));
>
> { /* if svn:needs-lock is present, then make the file read-write. */
> const svn_string_t *needs_lock;
> @@ -3096,7 +3095,7 @@ svn_error_t *svn_wc_remove_lock(const ch
> | SVN_WC__ENTRY_MODIFY_LOCK_OWNER
> | SVN_WC__ENTRY_MODIFY_LOCK_COMMENT
> | SVN_WC__ENTRY_MODIFY_LOCK_CREATION_DATE,
> - TRUE, pool));
> + pool));
>
> { /* if svn:needs-lock is present, then make the file read-only. */
> const svn_string_t *needs_lock;
> @@ -3168,7 +3167,7 @@ svn_wc_set_changelist(const char *path,
> /* Tweak the entry. */
> newentry.changelist = changelist;
> SVN_ERR(svn_wc__entry_modify(adm_access, entry->name, &newentry,
> - SVN_WC__ENTRY_MODIFY_CHANGELIST, TRUE, pool));
> + SVN_WC__ENTRY_MODIFY_CHANGELIST, pool));
>
> /* And tell someone what we've done. */
> if (notify_func)
> @@ -3216,8 +3215,7 @@ svn_wc__set_file_external_location(svn_w
> }
>
> SVN_ERR(svn_wc__entry_modify(adm_access, name, &entry,
> - SVN_WC__ENTRY_MODIFY_FILE_EXTERNAL, TRUE,
> - pool));
> + SVN_WC__ENTRY_MODIFY_FILE_EXTERNAL, pool));
>
> return SVN_NO_ERROR;
> }
>
> Modified: trunk/subversion/libsvn_wc/copy.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/copy.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/copy.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/copy.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -739,7 +739,7 @@ post_copy_cleanup(svn_wc_adm_access_t *a
> change the entry. */
> if (flags != SVN_WC__ENTRY_MODIFY_FORCE)
> SVN_ERR(svn_wc__entry_modify(adm_access, key, entry,
> - flags, TRUE, subpool));
> + flags, subpool));
>
> /* If a dir, not deleted, and not "this dir", recurse. */
> if ((! deleted)
> @@ -854,8 +854,7 @@ copy_dir_administratively(const char *sr
> tmp_entry.url = apr_pstrdup(pool, copyfrom_url);
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL, /* This Dir */
> &tmp_entry,
> - SVN_WC__ENTRY_MODIFY_URL, TRUE,
> - pool));
> + SVN_WC__ENTRY_MODIFY_URL, pool));
> }
> else
> {
>
> Modified: trunk/subversion/libsvn_wc/entries.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/entries.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/entries.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/entries.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -2924,7 +2924,6 @@ svn_wc__entry_modify(svn_wc_adm_access_t
> const char *name,
> svn_wc_entry_t *entry,
> apr_uint64_t modify_flags,
> - svn_boolean_t do_sync,
> apr_pool_t *pool)
> {
> apr_hash_t *entries;
> @@ -2972,10 +2971,7 @@ svn_wc__entry_modify(svn_wc_adm_access_t
> }
>
> /* Sync changes to disk. */
> - if (do_sync)
> - SVN_ERR(svn_wc__entries_write(entries, adm_access, pool));
> -
> - return SVN_NO_ERROR;
> + return svn_wc__entries_write(entries, adm_access, pool);
> }
>
>
> @@ -3620,7 +3616,7 @@ svn_wc_mark_missing_deleted(const char *
> (SVN_WC__ENTRY_MODIFY_DELETED
> | SVN_WC__ENTRY_MODIFY_SCHEDULE
> | SVN_WC__ENTRY_MODIFY_FORCE),
> - TRUE, /* sync right away */ pool);
> + pool);
> }
> else
> return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
>
> Modified: trunk/subversion/libsvn_wc/entries.h
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/entries.h?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/entries.h Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/entries.h Mon Apr 13 19:47:27 2009 (r37225)
> @@ -199,7 +199,6 @@ svn_error_t *svn_wc__entry_modify(svn_wc
> const char *name,
> svn_wc_entry_t *entry,
> apr_uint64_t modify_flags,
> - svn_boolean_t do_sync,
> apr_pool_t *pool);
>
> /* Remove entry NAME from ENTRIES, unconditionally. ADM_ACCESS should be
>
> Modified: trunk/subversion/libsvn_wc/log.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/log.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/log.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/log.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -866,7 +866,7 @@ log_do_modify_entry(struct log_runner *l
>
> /* Now write the new entry out */
> err = svn_wc__entry_modify(loggy->adm_access, name,
> - entry, modify_flags, FALSE, loggy->pool);
> + entry, modify_flags, loggy->pool);
> if (err)
> return svn_error_createf(pick_error_code(loggy), err,
> _("Error modifying entry for '%s'"), name);
> @@ -892,7 +892,7 @@ log_do_delete_lock(struct log_runner *lo
> | SVN_WC__ENTRY_MODIFY_LOCK_OWNER
> | SVN_WC__ENTRY_MODIFY_LOCK_COMMENT
> | SVN_WC__ENTRY_MODIFY_LOCK_CREATION_DATE,
> - FALSE, loggy->pool);
> + loggy->pool);
> if (err)
> return svn_error_createf(pick_error_code(loggy), err,
> _("Error removing lock from entry for '%s'"),
> @@ -913,9 +913,8 @@ log_do_delete_changelist(struct log_runn
>
> /* Now write the new entry out */
> err = svn_wc__entry_modify(loggy->adm_access, name,
> - &entry,
> - SVN_WC__ENTRY_MODIFY_CHANGELIST,
> - FALSE, loggy->pool);
> + &entry, SVN_WC__ENTRY_MODIFY_CHANGELIST,
> + loggy->pool);
> if (err)
> return svn_error_createf(pick_error_code(loggy), err,
> _("Error removing changelist from entry '%s'"),
> @@ -1149,7 +1148,7 @@ log_do_committed(struct log_runner *logg
> SVN_ERR(svn_wc__entry_modify
> (loggy->adm_access, NULL, &tmpentry,
> SVN_WC__ENTRY_MODIFY_REVISION | SVN_WC__ENTRY_MODIFY_KIND,
> - FALSE, pool));
> + pool));
> loggy->entries_modified = TRUE;
>
> /* Drop the 'killme' file. */
> @@ -1201,7 +1200,7 @@ log_do_committed(struct log_runner *logg
> SVN_WC__ENTRY_MODIFY_REVISION
> | SVN_WC__ENTRY_MODIFY_KIND
> | SVN_WC__ENTRY_MODIFY_DELETED,
> - FALSE, pool));
> + pool));
> loggy->entries_modified = TRUE;
> }
>
> @@ -1387,7 +1386,7 @@ log_do_committed(struct log_runner *logg
> | SVN_WC__ENTRY_MODIFY_COPYFROM_URL
> | SVN_WC__ENTRY_MODIFY_COPYFROM_REV
> | SVN_WC__ENTRY_MODIFY_FORCE),
> - FALSE, pool)))
> + pool)))
> return svn_error_createf
> (pick_error_code(loggy), err,
> _("Error modifying entry of '%s'"), name);
> @@ -1437,7 +1436,7 @@ log_do_committed(struct log_runner *logg
> | SVN_WC__ENTRY_MODIFY_COPIED
> | SVN_WC__ENTRY_MODIFY_DELETED
> | SVN_WC__ENTRY_MODIFY_FORCE),
> - TRUE, pool)))
> + pool)))
> return svn_error_createf(pick_error_code(loggy), err,
> _("Error modifying entry of '%s'"), name);
> }
> @@ -1705,7 +1704,7 @@ handle_killme(svn_wc_adm_access_t *adm_a
> SVN_WC__ENTRY_MODIFY_REVISION
> | SVN_WC__ENTRY_MODIFY_KIND
> | SVN_WC__ENTRY_MODIFY_DELETED,
> - TRUE, pool));
> + pool));
> }
> }
> return SVN_NO_ERROR;
> @@ -1881,7 +1880,7 @@ run_log(svn_wc_adm_access_t *adm_access,
> err = svn_wc__entry_modify(adm_access, SVN_WC_ENTRY_THIS_DIR,
> &tmp_entry,
> SVN_WC__ENTRY_MODIFY_TREE_CONFLICT_DATA,
> - FALSE, pool);
> + pool);
> if (err)
> return svn_error_createf(pick_error_code(loggy), err,
> _("Error recording tree conflicts in '%s'"),
>
> Modified: trunk/subversion/libsvn_wc/questions.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/questions.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/questions.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/questions.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -444,7 +444,7 @@ svn_wc__text_modified_internal_p(svn_boo
> &tmp,
> SVN_WC__ENTRY_MODIFY_TEXT_TIME
> | SVN_WC__ENTRY_MODIFY_WORKING_SIZE,
> - TRUE, pool));
> + pool));
> }
>
> return SVN_NO_ERROR;
>
> Modified: trunk/subversion/libsvn_wc/relocate.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/relocate.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/relocate.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/relocate.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -45,7 +45,6 @@ relocate_entry(svn_wc_adm_access_t *adm_
> const char *to,
> svn_wc_relocation_validator3_t validator,
> void *validator_baton,
> - svn_boolean_t do_sync,
> apr_pool_t *pool)
> {
> svn_wc_entry_t entry2;
> @@ -106,7 +105,7 @@ relocate_entry(svn_wc_adm_access_t *adm_
>
> if (flags)
> SVN_ERR(svn_wc__entry_modify(adm_access, entry->name,
> - &entry2, flags, do_sync, pool));
> + &entry2, flags, pool));
> return SVN_NO_ERROR;
> }
>
> @@ -132,8 +131,7 @@ svn_wc_relocate3(const char *path,
> if (entry->kind == svn_node_file
> || entry->depth == svn_depth_exclude)
> return relocate_entry(adm_access, entry, from, to,
> - validator, validator_baton, TRUE /* sync */,
> - pool);
> + validator, validator_baton, pool);
>
> /* Relocate THIS_DIR first, in order to pre-validate the relocated URL
> of all of the other entries. This is technically cheating because
> @@ -143,7 +141,7 @@ svn_wc_relocate3(const char *path,
> SVN_ERR(svn_wc_entries_read(&entries, adm_access, TRUE, pool));
> entry = apr_hash_get(entries, SVN_WC_ENTRY_THIS_DIR, APR_HASH_KEY_STRING);
> SVN_ERR(relocate_entry(adm_access, entry, from, to,
> - validator, validator_baton, FALSE, pool));
> + validator, validator_baton, pool));
>
> subpool = svn_pool_create(pool);
>
> @@ -176,7 +174,7 @@ svn_wc_relocate3(const char *path,
> validator_baton, subpool));
> }
> SVN_ERR(relocate_entry(adm_access, entry, from, to,
> - validator, validator_baton, FALSE, subpool));
> + validator, validator_baton, subpool));
> }
>
> svn_pool_destroy(subpool);
>
> Modified: trunk/subversion/libsvn_wc/update_editor.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/update_editor.c?pathrev=37225&r1=37224&r2=37225
> ==============================================================================
> --- trunk/subversion/libsvn_wc/update_editor.c Mon Apr 13 19:30:28 2009 (r37224)
> +++ trunk/subversion/libsvn_wc/update_editor.c Mon Apr 13 19:47:27 2009 (r37225)
> @@ -756,7 +756,7 @@ complete_directory(struct edit_baton *eb
> SVN_ERR(svn_wc__entry_modify(adm_access, current_entry->name,
> &tmpentry,
> SVN_WC__ENTRY_MODIFY_DELETED,
> - FALSE, subpool));
> + subpool));
> }
> }
> /* An absent entry might have been reconfirmed as absent, and the way
> @@ -1324,7 +1324,6 @@ open_root(void *edit_baton,
> d->path, pool));
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL /* THIS_DIR */,
> &tmp_entry, flags,
> - TRUE /* immediate write */,
> pool));
> }
>
> @@ -1852,8 +1851,7 @@ set_copied_callback(const char *path,
> tmp_entry.copied = TRUE;
> flags |= SVN_WC__ENTRY_MODIFY_COPIED;
> SVN_ERR(svn_wc__entry_modify(entry_adm_access, entry->name,
> - &tmp_entry, flags, TRUE /* do_sync */,
> - pool));
> + &tmp_entry, flags, pool));
> }
> }
> return SVN_NO_ERROR;
> @@ -1930,7 +1928,7 @@ schedule_existing_item_for_re_add(const
> SVN_ERR(svn_wc__entry_modify(entry_adm_access,
> (entry->kind == svn_node_dir)
> ? SVN_WC_ENTRY_THIS_DIR : base_name,
> - &tmp_entry, flags, TRUE /* do_sync */, pool));
> + &tmp_entry, flags, pool));
>
> /* If it's a directory, set the 'copied' flag recursively. The rest of the
> * directory tree's state can stay exactly as it was before being
> @@ -1960,7 +1958,7 @@ schedule_existing_item_for_re_add(const
> SVN_ERR(svn_wc__entry_versioned(&parent_entry, parent_path,
> parent_adm_access, TRUE, pool));
> SVN_ERR(svn_wc__entry_modify(parent_adm_access, base_name,
> - &tmp_entry, flags, TRUE, pool));
> + &tmp_entry, flags, pool));
>
> /* ### Need to do something more, such as change 'base' into 'revert-base'? */
> }
> @@ -2496,8 +2494,7 @@ add_directory(const char *path,
> }
>
> SVN_ERR(svn_wc__entry_modify(adm_access, db->name, &tmp_entry,
> - modify_flags,
> - TRUE /* immediate write */, pool));
> + modify_flags, pool));
>
> if (db->add_existed)
> {
> @@ -2521,8 +2518,7 @@ add_directory(const char *path,
> }
>
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL, &tmp_entry,
> - modify_flags,
> - TRUE /* immediate write */, pool));
> + modify_flags, pool));
> }
> }
>
> @@ -2548,15 +2544,13 @@ add_directory(const char *path,
> SVN_ERR(svn_wc_adm_retrieve(&adm_access, eb->adm_access,
> pb->path, db->pool));
> SVN_ERR(svn_wc__entry_modify(adm_access, db->name, &tmp_entry,
> - modify_flags,
> - TRUE /* immediate write */, pool));
> + modify_flags, pool));
>
> /* Mark PATH's 'this dir' entry as scheduled for deletion. */
> SVN_ERR(svn_wc_adm_retrieve(&adm_access, eb->adm_access,
> db->path, db->pool));
> SVN_ERR(svn_wc__entry_modify(adm_access, NULL /* This Dir entry */,
> - &tmp_entry, modify_flags,
> - TRUE /* immediate write */, pool));
> + &tmp_entry, modify_flags, pool));
> }
>
> /* If this add was obstructed by dir scheduled for addition without
> @@ -2709,7 +2703,6 @@ open_directory(const char *path,
>
> return svn_wc__entry_modify(adm_access, NULL /* THIS_DIR */,
> &tmp_entry, flags,
> - TRUE /* immediate write */,
> pool);
> }
>
> @@ -3014,7 +3007,7 @@ absent_file_or_dir(const char *path,
> SVN_WC__ENTRY_MODIFY_REVISION |
> SVN_WC__ENTRY_MODIFY_DELETED |
> SVN_WC__ENTRY_MODIFY_ABSENT),
> - TRUE /* immediate write */, pool);
> + pool);
> }
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=495&dsMessageId=1701276
>
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1701962
Received on 2009-04-14 05:32:25 CEST