1 /*
2    Copyright 2005-2010 Jakub Kruszona-Zawadzki, Gemius SA, 2013-2014 EditShare, 2013-2015 Skytechnology sp. z o.o..
3 
4    This file was part of MooseFS and is part of LizardFS.
5 
6    LizardFS is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation, version 3.
9 
10    LizardFS is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with LizardFS  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #pragma once
20 
21 #include "common/platform.h"
22 
23 #include <inttypes.h>
24 #include <stdio.h>
25 
26 #include "common/chunk_part_type.h"
27 #include "common/chunk_type_with_address.h"
28 #include "common/chunk_with_address_and_label.h"
29 #include "common/chunks_availability_state.h"
30 #include "protocol/cltoma.h"
31 #include "master/checksum.h"
32 
33 struct matocsserventry;
34 
35 extern bool gAvoidSameIpChunkservers;
36 
37 int chunk_increase_version(uint64_t chunkid);
38 int chunk_set_version(uint64_t chunkid,uint32_t version);
39 int chunk_change_file(uint64_t chunkid,uint8_t prevgoal,uint8_t newgoal);
40 int chunk_delete_file(uint64_t chunkid,uint8_t goal);
41 int chunk_add_file(uint64_t chunkid,uint8_t goal);
42 int chunk_unlock(uint64_t chunkid);
43 uint8_t chunk_apply_modification(uint32_t ts, uint64_t oldChunkId, uint32_t lockid, uint8_t goal,
44 		bool doIncreaseVersion, uint64_t *newChunkId);
45 
46 // Tries to set next chunk id to a passed value, returns status
47 uint8_t chunk_set_next_chunkid(uint64_t nextChunkIdToBeSet);
48 
49 #ifdef METARESTORE
50 void chunk_dump(void);
51 #else
52 uint8_t chunk_multi_modify(uint64_t ochunkid, uint32_t *lockid, uint8_t goal,
53 		bool usedummylockid, bool quota_exceeded, uint8_t *opflag, uint64_t *nchunkid,
54 		uint32_t min_server_version);
55 uint8_t chunk_multi_truncate(uint64_t ochunkid, uint32_t lockid, uint32_t length,
56 		uint8_t goal, bool denyTruncatingParityParts, bool quota_exceeded, uint64_t *nchunkid);
57 void chunk_stats(uint32_t *del,uint32_t *repl);
58 void chunk_store_info(uint8_t *buff);
59 uint32_t chunk_get_missing_count(void);
60 void chunk_store_chunkcounters(uint8_t *buff,uint8_t matrixid);
61 uint32_t chunk_count(void);
62 const ChunksReplicationState& chunk_get_replication_state();
63 const ChunksAvailabilityState& chunk_get_availability_state();
64 void chunk_info(uint32_t *allchunks,uint32_t *allcopies,uint32_t *regcopies);
65 
66 /// Checks if the given chunk has only invalid copies (ie. needs to be repaired).
67 bool chunk_has_only_invalid_copies(uint64_t chunkid);
68 
69 int chunk_get_fullcopies(uint64_t chunkid,uint8_t *vcopies);
70 int chunk_get_partstomodify(uint64_t chunkid, int &recover, int &remove);
71 int chunk_repair(uint8_t goal,uint64_t ochunkid,uint32_t *nversion, uint8_t correct_only);
72 
73 int chunk_getversionandlocations(uint64_t chunkid, uint32_t currentIp, uint32_t& version,
74 		uint32_t maxNumberOfChunkCopies, std::vector<ChunkTypeWithAddress>& serversList);
75 int chunk_getversionandlocations(uint64_t chunkid, uint32_t currentIp, uint32_t& version,
76 		uint32_t maxNumberOfChunkCopies, std::vector<ChunkPartWithAddressAndLabel>& serversList);
77 void chunk_server_has_chunk(matocsserventry *ptr, uint64_t chunkid, uint32_t version, ChunkPartType chunkType);
78 void chunk_damaged(matocsserventry *ptr, uint64_t chunkid, ChunkPartType chunk_type);
79 void chunk_lost(matocsserventry *ptr, uint64_t chunkid, ChunkPartType chunk_type);
80 void chunk_server_disconnected(matocsserventry *ptr, const MediaLabel &label);
81 void chunk_server_unlabelled_connected();
82 void chunk_server_label_changed(const MediaLabel &previousLabel, const MediaLabel &newLabel);
83 
84 void chunk_got_delete_status(matocsserventry *ptr, uint64_t chunkId, ChunkPartType chunkType, uint8_t status);
85 void chunk_got_replicate_status(matocsserventry *ptr, uint64_t chunkId, uint32_t chunkVersion,
86 		ChunkPartType chunkType, uint8_t status);
87 
88 void chunk_got_create_status(matocsserventry *ptr, uint64_t chunkid, ChunkPartType chunkType, uint8_t status);
89 void chunk_got_duplicate_status(matocsserventry *ptr, uint64_t chunkId, ChunkPartType chunkType, uint8_t status);
90 void chunk_got_setversion_status(matocsserventry *ptr, uint64_t chunkId, ChunkPartType chunkType, uint8_t status);
91 void chunk_got_truncate_status(matocsserventry *ptr, uint64_t chunkId, ChunkPartType chunkType, uint8_t status);
92 void chunk_got_duptrunc_status(matocsserventry *ptr, uint64_t chunkId, ChunkPartType chunkType, uint8_t status);
93 
94 int chunk_can_unlock(uint64_t chunkid, uint32_t lockid);
95 
96 int chunk_invalidate_goal_cache();
97 
98 #endif
99 
100 int chunk_load(FILE *fd, bool loadLockIds);
101 void chunk_store(FILE *fd);
102 void chunk_unload(void);
103 void chunk_newfs(void);
104 int chunk_strinit(void);
105 uint64_t chunk_checksum(ChecksumMode mode);
106 ChecksumRecalculationStatus chunks_update_checksum_a_bit(uint32_t speedLimit);
107