Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cs744-project1-final
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
Naman Dixit
cs744-project1-final
Commits
b3f73a53
Commit
b3f73a53
authored
Oct 26, 2019
by
Naman Dixit
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed the bug with 256 byte keys and 256 KiB values
parent
a02484f8
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
103 additions
and
61 deletions
+103
-61
client/client.c
client/client.c
+10
-11
common/aux.h
common/aux.h
+16
-1
common/xml.h
common/xml.h
+1
-1
server/dump.c
server/dump.c
+2
-2
server/server.c
server/server.c
+70
-43
server/storage.c
server/storage.c
+4
-3
No files found.
client/client.c
View file @
b3f73a53
...
...
@@ -133,6 +133,7 @@ int main(int argc, char** argv)
Char
*
xml_request_message
=
NULL
;
// Response message will be of proper legth, since server will make sure of that.
Size
response_size
=
KiB
(
300
);
Char
*
xml_response_message_read
=
calloc
(
response_size
,
sizeof
(
*
xml_response_message_read
));
Char
*
xml_response_message
=
calloc
(
response_size
,
sizeof
(
*
xml_response_message
));
Size
index
=
0
;
...
...
@@ -142,26 +143,24 @@ int main(int argc, char** argv)
if
(
strcmp
(
query_type
,
"GET"
)
==
0
)
{
xml_request_message
=
xmlCreateMessage
(
XML_Message_Kind_GET
,
query_key
,
NULL
,
NULL
);
write
(
sock_fd
,
xml_request_message
,
strlen
(
xml_request_message
));
read
(
sock_fd
,
xml_response_message
,
response_size
);
}
else
if
(
strcmp
(
query_type
,
"SET"
)
==
0
)
{
}
else
if
(
strcmp
(
query_type
,
"PUT"
)
==
0
)
{
Char
*
query_value
=
tokenGet
(
command
,
'\n'
,
&
index
);
xml_request_message
=
xmlCreateMessage
(
XML_Message_Kind_PUT
,
query_key
,
query_value
,
NULL
);
sbufDelete
(
query_value
);
write
(
sock_fd
,
xml_request_message
,
strlen
(
xml_request_message
));
read
(
sock_fd
,
xml_response_message
,
response_size
);
}
else
if
(
strcmp
(
query_type
,
"DEL"
)
==
0
)
{
xml_request_message
=
xmlCreateMessage
(
XML_Message_Kind_DELETE
,
query_key
,
NULL
,
NULL
);
}
write
(
sock_fd
,
xml_request_message
,
strlen
(
xml_request_message
));
read
(
sock_fd
,
xml_response_message
,
response_size
);
U64
read_len
=
0
;
while
(
!
strsuffix
(
xml_response_message
,
"</KVMessage>
\n
"
)
||
(
read_len
>=
KiB
(
299
)))
{
read_len
+=
read
(
sock_fd
,
xml_response_message_read
,
response_size
);
strcat
(
xml_response_message
,
xml_response_message_read
);
memset
(
xml_response_message_read
,
0
,
response_size
);
}
sbufDelete
(
query_type
);
...
...
common/aux.h
View file @
b3f73a53
...
...
@@ -644,7 +644,7 @@ void* hmRemove (Hashmap *hm, void *key)
}
header_function
Size
strprefix
(
Char
*
pre
,
Char
*
str
)
Size
strprefix
(
Char
*
str
,
Char
*
pre
)
{
Size
lenpre
=
strlen
(
pre
);
Size
lenstr
=
strlen
(
str
);
...
...
@@ -660,6 +660,21 @@ Size strprefix(Char *pre, Char *str)
}
}
header_function
B32
strsuffix
(
Char
*
str
,
Char
*
suf
)
{
Char
*
string
=
strrchr
(
str
,
suf
[
0
]);
B32
result
=
false
;
if
(
string
!=
NULL
)
{
if
(
strcmp
(
string
,
suf
)
==
0
)
{
result
=
true
;
}
}
return
result
;
}
header_function
U64
nextPowerOf2
(
U64
v
)
{
...
...
common/xml.h
View file @
b3f73a53
...
...
@@ -26,7 +26,7 @@ XML_Message xmlParseMessage (Char *xml) {
XML_Message
result
=
{
0
};
Char
*
error_message
=
"XML Error: Received unparseable message"
;
#define PARSE_CHAR(c) do { if (stream[0] != c)
goto parse_failed;
else stream++;} while (0)
#define PARSE_CHAR(c) do { if (stream[0] != c)
{goto parse_failed;}
else stream++;} while (0)
#define PARSE_SPACE() do { while (isspace(stream[0])) { stream++; }} while (0)
PARSE_CHAR
(
'<'
);
...
...
server/dump.c
View file @
b3f73a53
...
...
@@ -5,10 +5,10 @@ void* dump (void *arg)
XML_Dump_Metadata
*
xml_dump
=
arg
;
fprintf
(
xml_dump
->
file
,
"<?xml version=
\"
1.0
\"
encoding=
\"
UTF-8
\"
?>
\n
<KVStore>
\n\n
"
"<!--This XML file is generated in a lazy fashion, when the server is in a
\n
"
"quiscent state. This means that this file may end up being incomplete if
\n
"
"the server is killed forcefully before this dump is complete. -->
\n\n
"
"<?xml version=
\"
1.0
\"
encoding=
\"
UTF-8
\"
?>
\n
<KVStore>
\n
"
);
"the server is killed forcefully before this dump is complete. -->
\n\n
"
);
fflush
(
xml_dump
->
file
);
DIR
*
dir0
=
opendir
(
"."
);
...
...
server/server.c
View file @
b3f73a53
...
...
@@ -48,6 +48,12 @@ typedef struct Thread_Pool_Metadata {
#define MAX_SOCKET_CONNECTIONS_REQUEST 64
#define MAX_EPOLL_EVENTS 1024
typedef
struct
Input_Resume
{
Char
*
buffer
;
Size
buffer_len
;
int
fd
;
}
Input_Resume
;
typedef
struct
Output_Resume
{
Char
*
output
;
Size
output_pos
;
...
...
@@ -113,6 +119,7 @@ Sint main (Sint argc, Char *argv[])
}
Hashmap
output_map
=
hmCreate
(
memCRT
,
1024
);
Hashmap
input_map
=
hmCreate
(
memCRT
,
1024
);
Hashmap
busy_map
=
hmCreate
(
memCRT
,
1024
);
// NOTE(naman): Create a socket for IPv4 and TCP.
...
...
@@ -247,20 +254,35 @@ Sint main (Sint argc, Char *argv[])
char
*
buffer
=
calloc
(
KiB
(
300
),
sizeof
(
*
buffer
));
int
len
=
read
(
fd
,
buffer
,
KiB
(
300
)
-
1
);
if
(
len
==
0
)
{
close
(
fd
);
continue
;
}
if
(
hmLookupI
(
&
busy_map
,
fd
))
{
B32
is_busy
=
hmLookupI
(
&
busy_map
,
fd
);
Input_Resume
*
ir
=
(
Input_Resume
*
)
hmLookupI
(
&
input_map
,
fd
);
if
(
is_busy
&&
(
ir
==
NULL
))
{
continue
;
}
hmInsertI
(
&
busy_map
,
fd
,
true
);
XML_Message
msg
=
xmlParseMessage
(
buffer
);
if
(
ir
==
NULL
)
{
ir
=
calloc
(
1
,
sizeof
(
*
ir
));
ir
->
buffer
=
calloc
(
KiB
(
300
),
sizeof
(
*
(
ir
->
buffer
)));
ir
->
fd
=
fd
;
hmInsertI
(
&
input_map
,
fd
,
(
Uptr
)
ir
);
}
strcat
(
ir
->
buffer
,
buffer
);
ir
->
buffer_len
+=
len
;
free
(
buffer
);
if
(
strsuffix
(
ir
->
buffer
,
"</KVMessage>
\n
"
)
&&
(
ir
->
buffer_len
<=
KiB
(
299
)))
{
XML_Message
msg
=
xmlParseMessage
(
ir
->
buffer
);
switch
(
msg
.
kind
)
{
case
XML_Message_Kind_GET
:
{
Command
command
=
{.
fd
=
fd
};
...
...
@@ -307,19 +329,24 @@ Sint main (Sint argc, Char *argv[])
}
break
;
}
hmRemoveI
(
&
input_map
,
fd
);
free
(
ir
->
buffer
);
free
(
ir
);
struct
epoll_event
event
=
{.
data
.
fd
=
fd
,
.
events
=
EPOLLIN
|
EPOLLOUT
};
if
(
epoll_ctl
(
epoll_fd
,
EPOLL_CTL_MOD
,
fd
,
&
event
)
<
0
)
{
perror
(
"epoll_ctl EPOLL_CTL_MOD"
);
exit
(
-
1
);
}
}
}
else
if
(
events
[
i
].
events
&
EPOLLOUT
)
{
// Writing into fd in which we previously were not able to finish writing to
int
fd
=
events
[
i
].
data
.
fd
;
Output_Resume
*
or
=
hmLookup
(
&
output_map
,
(
void
*
)(
Uptr
)
fd
);
if
(
or
==
NULL
)
{
// fprintf(stderr, "hmLookup returned NULL");
// fprintf(stderr, "hmLookup returned NULL
\n
");
continue
;
}
else
{
Char
*
output
=
or
->
output
;
...
...
@@ -332,7 +359,7 @@ Sint main (Sint argc, Char *argv[])
if
(
errno
==
EAGAIN
||
errno
==
EWOULDBLOCK
)
{
// Try next time
}
else
{
perror
(
"write() failed"
);
perror
(
"write() failed
\n
"
);
exit
(
-
1
);
}
}
else
if
((
Size
)
nsent
<
(
output_len
-
output_pos
))
{
...
...
server/storage.c
View file @
b3f73a53
...
...
@@ -50,7 +50,8 @@ B32 storageSetFileData(U64 hash, Char *key, Char *value, Char **error)
strcat
(
path
,
"/"
);
if
(
!
storageMakeDirectoryIfNotExist
(
path
,
error
))
goto
error
;
strcat
(
path
,
key
);
strncat
(
path
,
key
,
255
);
if
((
file
=
fopen
(
path
,
"w"
))
!=
NULL
)
{
fprintf
(
file
,
"%s"
,
value
);
fclose
(
file
);
...
...
@@ -102,7 +103,7 @@ Char* storageGetFileData(U64 hash, Char *key, Char **error)
strcat
(
path
,
"/"
);
strcat
(
path
,
byte_seven_eight
);
strcat
(
path
,
"/"
);
str
cat
(
path
,
key
);
str
ncat
(
path
,
key
,
255
);
if
(
access
(
path
,
F_OK
)
==
0
)
{
if
((
file
=
fopen
(
path
,
"r"
))
!=
NULL
)
{
...
...
@@ -201,7 +202,7 @@ B32 storageDeleteFileData(U64 hash, Char *key, Char **error)
strcat
(
path
,
"/"
);
strcat
(
path
,
byte_seven_eight
);
strcat
(
path
,
"/"
);
str
cat
(
path
,
key
);
str
ncat
(
path
,
key
,
255
);
// FIXME(namna): This is in a race condition with the SetData
int
ret
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment