##// END OF EJS Templates
snapshot: search for unrelated but reusable full-snapshot...
snapshot: search for unrelated but reusable full-snapshot # New Strategy Step: Reusing Snapshot Outside Of Parents' Chain. If no suitable bases were found in the parent's chains, see if we could reuse a full snapshot not directly related to the current revision. Such search can be expensive, so we only search for snapshots appended to the revlog *after* the bases used by the parents of the current revision (the one we just tested). We assume the parent's bases were created because the previous snapshots were unsuitable, so there are low odds they would be useful now. This search gives a chance to reuse a delta chain unrelated to the current revision. Without this re-use, topological branches would keep reopening new full chains. Creating more and more snapshots as the repository grow. In repositories with many topological branches, the lack of delta reuse can create too many snapshots reducing overall compression to nothing. This results in a very large repository and other usability issues. For now, we still focus on creating level-1 snapshots. However, this principle will play a large part in how we avoid snapshot explosion once we have more snapshot levels. # Effects On The Test Repository In the test repository we created, we can see the beneficial effect of such reuse. We need very few level-0 snapshots and the overall revlog size has decreased. The `hg debugrevlog` call, show a "lvl-2" snapshot. It comes from the existing delta logic using the `prev` revision (revlog's tip) as the base. In this specific case, it turns out the tip was a level-1 snapshot. This is a coincidence that can be ignored. Finding and testing against all these unrelated snapshots can have a performance impact at write time. We currently focus on building good deltas chain we build. Performance concern will be dealt with later in another series.

File last commit:

r33927:f4433f27 default
r39529:3ca144f1 default
Show More
compat.h
45 lines | 849 B | text/x-c | CLexer
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 #ifndef _HG_COMPAT_H_
#define _HG_COMPAT_H_
#ifdef _WIN32
#ifdef _MSC_VER
/* msvc 6.0 has problems */
#define inline __inline
Maciej Fijalkowski
compat: provide a declaration of ssize_t, for MS windows
r29521 #if defined(_WIN64)
typedef __int64 ssize_t;
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 typedef unsigned __int64 uintptr_t;
Maciej Fijalkowski
compat: provide a declaration of ssize_t, for MS windows
r29521 #else
Yuya Nishihara
compat: define ssize_t as int on 32bit Windows, silences C4142 warning...
r29549 typedef int ssize_t;
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 typedef unsigned int uintptr_t;
Maciej Fijalkowski
compat: provide a declaration of ssize_t, for MS windows
r29521 #endif
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 typedef signed char int8_t;
typedef short int16_t;
typedef long int32_t;
typedef __int64 int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef unsigned __int64 uint64_t;
#else
#include <stdint.h>
#endif
#else
/* not windows */
#include <sys/types.h>
#if defined __BEOS__ && !defined __HAIKU__
#include <ByteOrder.h>
#else
#include <arpa/inet.h>
#endif
#include <inttypes.h>
#endif
#if defined __hpux || defined __SUNPRO_C || defined _AIX
#define inline
#endif
#ifdef __linux
#define inline __inline
#endif
#endif