@@ -56,20 +56,30 @@ const char* AutoSkipCompressorWrapper::Name() const {
56
56
Status AutoSkipCompressorWrapper::CompressBlock (
57
57
Slice uncompressed_data, std::string* compressed_output,
58
58
CompressionType* out_compression_type, ManagedWorkingArea* wa) {
59
+ // Check if the managed working area is provided or owned by this object.
60
+ // If not, bypass auto-skip logic since the working area lacks a predictor to
61
+ // record or make necessary decisions to compress or bypass compression of the
62
+ // block
63
+ if (wa == nullptr || wa->owner () != this ) {
64
+ return wrapped_->CompressBlock (uncompressed_data, compressed_output,
65
+ out_compression_type, wa);
66
+ }
59
67
bool exploration =
60
68
Random::GetTLSInstance ()->PercentTrue (kExplorationPercentage );
61
69
TEST_SYNC_POINT_CALLBACK (
62
70
" AutoSkipCompressorWrapper::CompressBlock::exploitOrExplore" ,
63
71
&exploration);
72
+ auto autoskip_wa = static_cast <AutoSkipWorkingArea*>(wa->get ());
64
73
if (exploration) {
65
74
return CompressBlockAndRecord (uncompressed_data, compressed_output,
66
- out_compression_type, wa );
75
+ out_compression_type, autoskip_wa );
67
76
} else {
68
- auto prediction = predictor_->Predict ();
77
+ auto predictor_ptr = autoskip_wa->predictor ;
78
+ auto prediction = predictor_ptr->Predict ();
69
79
if (prediction <= kProbabilityCutOff ) {
70
80
// decide to compress
71
81
return CompressBlockAndRecord (uncompressed_data, compressed_output,
72
- out_compression_type, wa );
82
+ out_compression_type, autoskip_wa );
73
83
} else {
74
84
// decide to bypass compression
75
85
*out_compression_type = kNoCompression ;
@@ -79,13 +89,22 @@ Status AutoSkipCompressorWrapper::CompressBlock(
79
89
return Status::OK ();
80
90
}
81
91
92
+ Compressor::ManagedWorkingArea AutoSkipCompressorWrapper::ObtainWorkingArea () {
93
+ auto wrap_wa = wrapped_->ObtainWorkingArea ();
94
+ return ManagedWorkingArea (new AutoSkipWorkingArea (std::move (wrap_wa)), this );
95
+ }
96
+ void AutoSkipCompressorWrapper::ReleaseWorkingArea (WorkingArea* wa) {
97
+ delete static_cast <AutoSkipWorkingArea*>(wa);
98
+ }
99
+
82
100
Status AutoSkipCompressorWrapper::CompressBlockAndRecord (
83
101
Slice uncompressed_data, std::string* compressed_output,
84
- CompressionType* out_compression_type, ManagedWorkingArea * wa) {
102
+ CompressionType* out_compression_type, AutoSkipWorkingArea * wa) {
85
103
Status status = wrapped_->CompressBlock (uncompressed_data, compressed_output,
86
- out_compression_type, wa );
104
+ out_compression_type, &(wa-> wrapped ) );
87
105
// determine if it was rejected or compressed
88
- predictor_->Record (uncompressed_data, compressed_output, kOpts );
106
+ auto predictor_ptr = wa->predictor ;
107
+ predictor_ptr->Record (uncompressed_data, compressed_output, kOpts );
89
108
return status;
90
109
}
91
110
0 commit comments