blob: e6eaa764edf0c93d3c88a2bdabae4085d3b2789a [file] [log] [blame]
/** @file
A brief file description
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include "P_Cache.h"
#include "tscore/MatcherUtils.h"
#include "tscore/HostLookup.h"
#define CACHE_MEM_FREE_TIMEOUT HRTIME_SECONDS(1)
struct Vol;
struct CacheVol;
struct CacheHostResult;
struct Cache;
struct CacheHostRecord {
int Init(CacheType typ);
int Init(matcher_line *line_info, CacheType typ);
void UpdateMatch(CacheHostResult *r, char *rd);
void Print() const;
~CacheHostRecord()
{
ats_free(vols);
ats_free(vol_hash_table);
ats_free(cp);
}
CacheType type = CACHE_NONE_TYPE;
Vol **vols = nullptr;
int good_num_vols = 0;
int num_vols = 0;
int num_initialized = 0;
unsigned short *vol_hash_table = nullptr;
CacheVol **cp = nullptr;
int num_cachevols = 0;
CacheHostRecord() {}
};
void build_vol_hash_table(CacheHostRecord *cp);
struct CacheHostResult {
CacheHostRecord *record = nullptr;
CacheHostResult() {}
};
class CacheHostMatcher
{
public:
CacheHostMatcher(const char *name, CacheType typ);
~CacheHostMatcher();
void AllocateSpace(int num_entries);
void NewEntry(matcher_line *line_info);
void Match(const char *rdata, int rlen, CacheHostResult *result) const;
void Print() const;
int
getNumElements() const
{
return num_el;
}
CacheHostRecord *
getDataArray() const
{
return data_array;
}
HostLookup *
getHLookup() const
{
return host_lookup;
}
private:
static void PrintFunc(void *opaque_data);
HostLookup *host_lookup; // Data structure to do the lookups
CacheHostRecord *data_array; // array of all data items
int array_len; // the length of the arrays
int num_el; // the number of items in the tree
CacheType type;
};
class CacheHostTable
{
public:
// Parameter name must not be deallocated before this
// object is
CacheHostTable(Cache *c, CacheType typ);
~CacheHostTable();
int BuildTable(const char *config_file_path);
int BuildTableFromString(const char *config_file_path, char *str);
void Match(const char *rdata, int rlen, CacheHostResult *result) const;
void Print() const;
int
getEntryCount() const
{
return m_numEntries;
}
CacheHostMatcher *
getHostMatcher() const
{
return hostMatch;
}
static int config_callback(const char *, RecDataT, RecData, void *);
void
register_config_callback(CacheHostTable **p)
{
REC_RegisterConfigUpdateFunc("proxy.config.cache.hosting_filename", CacheHostTable::config_callback, (void *)p);
}
CacheType type = CACHE_HTTP_TYPE;
Cache *cache = nullptr;
int m_numEntries = 0;
CacheHostRecord gen_host_rec;
private:
CacheHostMatcher *hostMatch = nullptr;
const matcher_tags config_tags = {"hostname", "domain", nullptr, nullptr, nullptr, nullptr, false};
const char *matcher_name = "unknown"; // Used for Debug/Warning/Error messages
};
struct CacheHostTableConfig;
typedef int (CacheHostTableConfig::*CacheHostTabHandler)(int, void *);
struct CacheHostTableConfig : public Continuation {
CacheHostTable **ppt;
CacheHostTableConfig(CacheHostTable **appt) : Continuation(nullptr), ppt(appt)
{
SET_HANDLER((CacheHostTabHandler)&CacheHostTableConfig::mainEvent);
}
int
mainEvent(int event, Event *e)
{
(void)e;
(void)event;
CacheHostTable *t = new CacheHostTable((*ppt)->cache, (*ppt)->type);
CacheHostTable *old = (CacheHostTable *)ink_atomic_swap(&t, *ppt);
new_Deleter(old, CACHE_MEM_FREE_TIMEOUT);
return EVENT_DONE;
}
};
/* list of volumes in the volume.config file */
struct ConfigVol {
int number;
CacheType scheme;
off_t size;
bool in_percent;
bool ramcache_enabled;
int percent;
CacheVol *cachep;
LINK(ConfigVol, link);
};
struct ConfigVolumes {
int num_volumes;
int num_http_volumes;
Queue<ConfigVol> cp_queue;
void read_config_file();
void BuildListFromString(char *config_file_path, char *file_buf);
void
clear_all()
{
// remove all the volumes from the queue
for (int i = 0; i < num_volumes; i++) {
cp_queue.pop();
}
// reset count variables
num_volumes = 0;
num_http_volumes = 0;
}
};